Algorithm/Baekjoon
[백준 1072] 게임 (Node.js 풀이)
도깨비젤리
2024. 10. 28. 16:18
원문
https://spookyjelly.tistory.com/92
원문에서 파이썬 재귀 함수로 구현한걸 그대로 TS로 옮긴게 다이다.
이번 문제는 무슨 특별한 언어적 테크닉 (Python과 JS의 차이 극복)을 사용하는 것보다. 백준에서 Node.js input을 받게 하는 방법을 찾는게 더 힘들었다.... 돌아버릴 뻔했네 진짜ㅋㅋㅋㅋㅋ
이런거 보면 JS 알고리즘 연습은 백준보다 프로그래머스가 더 낫다고 생각이 든다...
const fs = require('fs');
const filePath = process.platform == 'linux' ? '/dev/stdin' : './1072.txt';
// constants
const MIN_X = 1;
const MAX_X = 1000000000;
// functions
const getWinRate = (x: number, y: number) => {
return Math.floor((y * 100) / x);
};
// Binary search implementation
function binarySearchRecursive(
currentGames: number, // 현재 게임 수 (X)
currentWins: number, // 현재 승리 수 (Y)
initialWinRate: number, // 초기 승률
left: number, // 탐색 범위 시작
right: number, // 탐색 범위 끝
result: number // 현재까지의 최소값
): number {
// 기저 조건: 탐색 범위가 없어지면 종료
if (left > right) return result;
const mid: number = Math.floor((left + right) / 2);
const newWinRate = getWinRate(currentGames + mid, currentWins + mid);
// 승률이 변했다면, 더 작은 값이 있는지 왼쪽 구간 탐색
if (newWinRate > initialWinRate) {
return binarySearchRecursive(
currentGames,
currentWins,
initialWinRate,
left,
mid - 1,
mid // 현재 mid가 새로운 result가 됨
);
}
// 승률이 그대로라면, 더 큰 값을 탐색
else {
return binarySearchRecursive(
currentGames,
currentWins,
initialWinRate,
mid + 1,
right,
result
);
}
}
const [x, y] = fs.readFileSync(filePath).toString().trim().split(' ').map(Number);
// 승률계산
const initialWinRate: number = getWinRate(x, y);
function main() {
if (initialWinRate >= 99) {
console.log(-1);
return;
}
const result = binarySearchRecursive(x, y, initialWinRate, 1, MAX_X, -1);
console.log(result);
return;
}
main();
(JS로 옮기려면 타입 선언부만 제거하면 된다)
다시 봐도 괴악하다 괴악해...