카테고리 없음

[BOJ] 1940번 : 주몽

gaing 2024. 10. 2. 20:55

✏️ 문제

주몽은 철기군을 양성하기 위한 프로젝트에 나섰다. 그래서 야철대장을 통해 철기군이 입을 갑옷을 만들게 하였다. 야철대장은 주몽의 명에 따르기 위하여 연구에 착수하던 중 아래와 같은 사실을 발견하게 되었다.

갑옷을 만드는 재료들은 각각 고유한 번호를 가지고 있다. 갑옷은 두 개의 재료로 만드는데 두 재료의 고유한 번호를 합쳐서 M(1 ≤ M ≤ 10,000,000)이 되면 갑옷이 만들어 지게 된다. 야철대장은 자신이 만들고 있는 재료를 가지고 갑옷을 몇 개나 만들 수 있는지 궁금해졌다. 이러한 궁금증을 풀어 주기 위하여 N(1 ≤ N ≤ 15,000) 개의 재료와 M이 주어졌을 때 몇 개의 갑옷을 만들 수 있는지를 구하는 프로그램을 작성하시오.

 


🖥️ 입출력 예시


🗒️ 풀이

/* 초기 세팅 */
// 파일 읽기 기능 사용
const fs = require("fs");

// 실행 환경에 따라 입력 경로 다르게 설정
const filepath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

// 입력을 읽고, 문자열로 변환한 뒤, 공백을 제거하고, 각 문자를 배열로 나눔
const input = fs.readFileSync(filepath).toString().trim().split("\n");

/* 문제 풀이 */
// 재료의 개수 N
const n = Number(input[0]);

// 갑옷을 만드는 데 필요한 수 M
const m = Number(input[1]);

// 주어진 N개의 재료 고유 번호를 배열로 변환하고
// 각 재료를 숫자로 변환하여 저장함
const materials = input[2].split(" ").map(Number);

// 재료 고유 번호들을 오름차순으로 정렬
materials.sort((a, b) => a - b);

// 갑옷을 만들 수 있는 경우의 수 저장하는 변수
let count = 0;

// 다중 포인터 사용
let left = 0;
let right = n - 1;

// 두 포인터가 만나기 전까지 반복
while (left < right) {
  const sum = materials[left] + materials[right];

  // 두 재료의 합이 같다면
  if (sum === m) {
    count++;
    left++;
    right--;
  }

  // 두 재료의 합이 m보다 크다면
  else if (sum > m) {
    right--;
  }

  // 두 재료의 합이 m보다 작다면
  else {
    left++;
  }
}

// 결과 출력
console.log(count);