[백준] 10837 동전 게임 JavaScript

·2024년 10월 29일

문제

영희와 동수는 동전 던지기 게임을 하고 있다. 이 게임은 K번 라운드로 구성되고 다음과 같은 규칙들을 따른다:

한 라운드에서 영희와 동수는 한 번씩 동전을 던지고 항상 영희가 먼저 던진다.
동전을 던져 앞면이 나오면 1점을 얻고, 뒷면이 나오면 점수를 얻지 못한다.
한 명이 남은 기회에 모든 점수를 얻더라도 상대방이 현재까지 얻은 점수보다 작게 되면 게임 도중 어떤 시점에서도 게임은 바로 끝난다.
0이상 K이하인 임의의 정수 M과 N에 대해서, 이것이 항상 게임이 끝난 후 영희와 동수가 얻는 점수가 되는 것은 아니다. 예를 들어서, K = 2인 경우에, M과 N의 모든 경우에 대해서, 이것이 영희와 동수가 얻는 점수가 될 수 있는 지의 여부는 다음 표와 같다:

위 표에서 영희와 동수의 점수가 0과 2가 되는 것이 불가능한 이유는 두 번째 라운드에서 영희가 뒷면이 나와서 점수를 얻지 못하는 순간 게임의 규칙 3에 의해서 0과 1로 게임이 끝나기 때문이다.

0이상 K이하인 정수 M과 N이 주어질 때, 이 두 정수가 각각 영희와 동수의 점수가 될 수 있는지 여부를 판별하는 프로그램을 작성하시오.

입력

첫 줄에 게임의 라운드 수를 나타내는 정수 K(1 ≤ K ≤ 1,000)가 주어진다. 두 번째 줄에는 입력의 개수를 나타내는 정수 C(1 ≤ C ≤ 100,000)가 주어진다. 다음 이어지는 C개의 줄 각각에는 하나의 입력을 나타내는 두 정수 M과 N(0 ≤ M, N ≤ K)이 주어진다.

출력

출력은 C개의 줄로 구성된다. 게임에서 영희와 동수의 점수가 각각 M과 N이 될 수 있다면 1, 아니면 0을 각 줄에 출력한다.

예제 입력

5
4
5 5
5 1
0 3
1 4

예제 출력

1
0
1
0

내가 했던 풀이 방법

나올 수 있는 점수의 경우를 크게 3가지로 나눠서 풀이했다.
M과 N이 같을 때, M이 N보다 클 때, M이 N보다 작을 때
이 중에서 M과 N이 같으면 항상 가능하다. M과 N이 다를 때에도 가능한 경우는 두 사람의 점수차이가 남은 게임의 차이가 1과 같거나 작아야 한다. 그래야 더 작은 사람이 복구할 수 있기 때문이다. 하지만, 여기서 3번의 규칙에 의해 M과 N 중에 M이 더 클 때는 조금 달라질 수 있다. 왜냐하면 문제에서도 설명했듯이 영희가 동전을 먼저 던질 수 있기 때문이다. 이를 구해주기 위해서 남은 게임 수와 두 사람의 점수차이를 이용해준다.
즉, 정리하면 M과 N이 같으면 항상 가능하고 M이 N보다 클 경우에는 두 사람의 점수 차이-남은 게임 수가 2와 같거나 작다면 가능하다. (영희가 점수가 더 높다면, 최대 2점까지 차이가 나도 가능하기 때문에) M이 N보다 작을 경우에는 두 사람의 점수 차이-남은 게임 수가 1과 같거나 작으면 가능하다. (동수는 늦게 던지므로, 2점 이상 차이가 난다는 것은 이미 영희가 던졌을 때 게임이 끝났어야 한다는 것을 의미한다.)

코드

const fs = require('fs');
let [K, C, ...MN] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

K = Number(K);
C = Number(C);

let answer = '';
for (let i = 0; i < C; i++) {
  MN[i] = MN[i].trim().split(' ').map(Number);

  if (MN[i][0] === MN[i][1]) answer += 1 + '\n';
  else if (MN[i][0] < MN[i][1]) {
    let rest = K - MN[i][1];
    let gap = MN[i][1] - MN[i][0];

    if (gap - rest <= 1) {
      answer += 1 + '\n';
    } else answer += 0 + '\n';
  } else {
    let rest = K - MN[i][0];
    let gap = MN[i][0] - MN[i][1];

    if (gap - rest <= 2) {
      answer += 1 + '\n';
    } else answer += 0 + '\n';
  }
}

console.log(answer.trim());

회고

반 졸면서 풀어서 계속 gap이랑 rest랑 머리에서 섞여서 쉬운 문제였는데 오래 잡아먹은 느낌... 다 풀고나서도 너무 졸려서 왜 gap에서 rest를 빼줬는지 한참 고민했다. 내가 풀었는데 남이 푼 코드를 보는 기분이었다... 맨정신일 때 한 번 더 풀어봐야지

profile
Frontend🍓

0개의 댓글