[백준 1072] 게임 (Node.js 풀이)

도깨비젤리

·

2024. 10. 28. 16:18

 

밑에꺼는 실수로 TS 그대로 복붙했다가 실패 ~

 

 

원문

 

https://spookyjelly.tistory.com/92

 

99클럽 코테 스터디 0일차 TIL + [백준 1072]게임 (파이썬 풀이)

지정 양식 제목: 99클럽 코테 스터디 0일차 TIL + 오늘의 학습 키워드- 오늘의 학습 키워드- 공부한 내용 본인의 언어로 정리하기- 오늘의 회고  - 어떤 문제가 있었고, 나는 어

spookyjelly.tistory.com

 

 

 

원문에서 파이썬 재귀 함수로 구현한걸 그대로 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로 옮기려면 타입 선언부만 제거하면 된다)

 

 

 

다시 봐도 괴악하다 괴악해...