Study
algorithm
coding-test
binary-search
1072

게임 (opens in a new tab)

문제 해결 방법

  • 승률은 이긴 게임(Y) * 100 / 게임횟수(X)에서 소숫점을 버린 값이다
  • 승률이 절대 변하지 않을 경우, -1을 출력한다
  • 게임 횟수는 1 이상 1,000,000,000 이하이다 => 이진 탐색의 l(left) 값을 1, r(right) 값을 1,000,000,000으로 설정한다

오답노트

  • 시간 복잡도를 개선했는지
    • 처음에는 이진탐색을 이용하지 않고, while문을 돌며 승률이 변할 때까지 cnt 값을 증가시켰다
    • 이 방법은 게임 횟수가 많지 않은 경우에는 문제가 없지만, 숫자가 커질수록 효율성이 떨어졌다 (시간복잡도 이슈)

코드

const fs = require("fs");
const filePath = process.platform == "linux" ? "/dev/stdin" : "./input.txt";
let [X, Y] = fs.readFileSync(filePath).toString().trim().split(" ").map(Number);
 
const checkWinRate = (total, winCnt) => Math.floor((winCnt * 100) / total);
 
const Z = checkWinRate(X, Y);
 
let l = 1;
let r = 1000000000;
let cnt = Infinity;
 
while (l <= r) {
  let mid = parseInt((l + r) / 2);
  let newZ = checkWinRate(X + mid, Y + mid);
 
  if (Z !== newZ) {
    cnt = Math.min(cnt, mid);
    r = mid - 1;
  } else {
    l = mid + 1;
  }
}
 
cnt === Infinity ? console.log(-1) : console.log(cnt);