시험이 끝난 준서는 술을 마시고 있다. 준서는 배스킨라빈스 31게임의 굉장한 실력자이다. 너무 많이 해버린 나머지 배스킨라빈스 31게임에 질려버렸다. 그렇기에 준서는 배스킨라빈스 N게임을 하려 한다.
배스킨라빈스 N게임은 두 명이 함께 하는 게임이다.
게임은 잔이 빈 준서가 시작하여, 차례를 번갈아 가면서 진행한다.
처음 시작하는 플레이어는 1부터 수를 부르기 시작한다.
각 차례에 플레이어는 지금까지 불리지 않은 가장 작은 양의 정수부터 차례대로, 1개 이상 M개 이하의 정수를 부른다.
게임을 진행하다 마지막 수 N을 부른 사람이 패배하여 술을 마셔야 한다.
술을 피하기 위해 최대로 집중력을 발휘하여, 두 플레이어는 항상 최적의 방법으로 게임을 진행한다.
N, M이 주어졌을 때, 몰래 준서에게 이길 수 있는지 알려주자!
첫째 줄에 마지막 수 N(1 ≤ N ≤ 10^18)과 한 턴에 부를 수 있는 최대 수의 개수 M(1 ≤ M ≤ 10^18)이 주어진다.
준서가 주어진 N, M에 대해 이길 수 있다면 Can win을 출력하고, 이길 수 없다면 Can't win을 출력한다.
20211537 1876
Can't win
이전에 풀었던 베스킨라빈스 31 문제와 풀이 방식이 똑같다. 단, 그때는 항상 말할 수 있는 숫자의 개수가 3개로 고정되었는데, 이번에는 최대 개수도 주어진다. 하지만, 그렇다고 달라지는 건 크게 없기 때문에 이전 게시글을 참고하자. 20004 베스킨라빈스 31
let input = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ');
let a = BigInt(input[0]);
let b = BigInt(input[1]);
if ((a - BigInt(1)) % (b + BigInt(1)) === BigInt(0)) {
console.log("Can't win");
} else {
console.log('Can win');
}
백준에서 처음 JS로 풀이하는 문제였다. 악명높은 백준 JS 풀이.... 정말........... 고생했다. 입력받은 문장을 split 마저도 내 의도대로 되지 않는 걸 보고 프로그래머스나 풀까 싶었지만, 꾸역꾸역 해결했다. 그럼에도 두 번이나 틀렸습니다를 경험했는데, 아무리 생각해도 문제에 틀림은 없다고 생각해서 문제가 JS로 풀 수 없는 걸까...라고 포기하려는 때 다행히 희망의 게시글을 발견했다.
node.js로 도전하시는 분들에게
해당 게시글에서 "Javascript Number 타입은 기본적으로 -(2^53 − 1)부터 2^53 − 1 범위만 해당된다고 합니다."라는 글을 보고 문제의 범위를 확인해본 결과 범위를 벗어나는 문제였던 것이다....ㅎ 그래서 모든 숫자를 BigInt로 바꾸어주고 풀이하니 정답이었다.
해당 문제는 제출자도 몇 명 없는데 Node.js로 풀이한 사람은 한 명도 없어서 도움을 받기 힘들었는데... 다행히 다른 게시글에서 오답의 이유를 알아서 다행이었다. 아무래도 한동안 고생을 할 것 같지만, 빠르게 익숙해져야지.... 자바스크립트를 하기 위해서는 ㅜㅅㅜ