[백준] 25179 배스킨라빈스~N~귀엽고~깜찍하게~ Java Script

·2024년 4월 5일

문제

시험이 끝난 준서는 술을 마시고 있다. 준서는 배스킨라빈스 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로 풀이한 사람은 한 명도 없어서 도움을 받기 힘들었는데... 다행히 다른 게시글에서 오답의 이유를 알아서 다행이었다. 아무래도 한동안 고생을 할 것 같지만, 빠르게 익숙해져야지.... 자바스크립트를 하기 위해서는 ㅜㅅㅜ

profile
Frontend🍓

0개의 댓글