[백준] 1940 주몽 JavaScript

·2024년 5월 24일

문제

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

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

입력

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고유한 번호들이 공백을 사이에 두고 주어진다. 고유한 번호는 100,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 갑옷을 만들 수 있는 개수를 출력한다.

예제 입력

6
9
2 7 4 1 5 3

예제 출력

2

내가 했던 풀이 방법

  1. 입력받은 수 중 고유한 번호를 uid 배열에 Number형으로 저장한다.
  2. start를 0으로 end를 1로 초기화하고, count를 0으로 초기화한다. (end는 항상 start보다 1이상 크다.)
  3. start부터 uid의 length만큼 순회한다. end를 i+1로 저장하고, 만약 uid[i]가 0일 경우 다음 i를 수행한다. (고유한 번호는 1 이상이므로, 0은 이미 갑옷으로 만들어졌음을 의미한다.)
  4. 무한 반복문을 돌면서 end가 uid.length 이상이 되기 전까지 5번-6번 내용을 반복한다.
  5. uid[end]가 0이 아니고, uid[i]와 uid[end]의 합이 M일 때, uid[i]와 uid[end]를 모두 0으로 바꾸고, count를 1 증가시킨 뒤, 반복문을 탈출한다. (반복문이 탈출되지 못하면 해당 재료는 사용할 수 없는 것이다.)
  6. uid[end]가 0이거나 uid[i]+uid[end]가 M이 아닐 때 end를 1 증가시켜준다.
  7. count를 출력해준다.

코드

const fs = require('fs');
let [N, M, uid] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

N = Number(N);
M = Number(M);

uid = uid.trim().split(' ').map(Number);

let start = 0;
let end = 1;

let count = 0;
for (let i = start; i < uid.length; i++) {
  end = i + 1;
  if (uid[i] === 0) continue;
  while (true) {
    if (end >= uid.length) break;
    if (uid[end] !== 0) {
      if (uid[i] + uid[end] === M) {
        uid[i] = 0;
        uid[end] = 0;
        count++;
        break;
      }
    }
    end++;
  }
}

console.log(count);

회고

투포인트도 파악해버렸다.... 6월부터는 유형별로 풀어볼까 고민이 된다. 유형별로 풀게 되면 너무 풀이를 금방 떠올려서 어떤 유형인지 모르는채로 풀고싶긴 한데... 아직 자바스크립트로 풀지 못한 유형이라던지 잊어버린 유형이라던지 넘 많아서... 유형별로 한 번 훑고 문제를 풀까 생각이 된다.

profile
Frontend🍓

0개의 댓글