Loading...
본문 바로가기
👥
총 방문자
📖
0개 이상
총 포스팅
🧑
오늘 방문자 수
📅
0일째
블로그 운영

여러분의 방문을 환영해요! 🎉

다양한 개발 지식을 쉽고 재미있게 알려드리는 블로그가 될게요. 함께 성장해요! 😊

백준 문제풀이/Nodejs

[백준][이분탐색] 16434 드래곤 앤 던전 NodeJs 구현

by 꽁이꽁설꽁돌 2024. 11. 12.
728x90
반응형

목차

    https://www.acmicpc.net/problem/16434

    문제

     

    코드 구현 방향

    NodeJs로 해줄 경우 범위로 인해서 bigint를 써주어야 한다....

     

     

    구현 시 주의점

    bigInt는 정수끼리만 연산이 가능하다. 따라서 반올림 계산이 약간 다르다

    //반올림 구현
    let monsz = (monHp + attack - 1n) / attack;

     

     

     

    코드 구현

    const input = require("fs")
      .readFileSync("./dev/stdin", "utf-8")
      .trim()
      .split("\n");
    let arr = [];
    let [N, curAtk] = input[0].trim().split(" ").map(BigInt);
    let lowHp = 1n;
    let highHp = 10000000000000n * N;
    for (let i = 1; i < input.length; i++) {
      let ar = input[i].trim().split(" ").map(BigInt);
      arr.push(ar);
    }
    
    function fighting(hp, attack) {
      let m = hp;
      for (let i = 0; i < arr.length; i++) {
        let choice = arr[i][0];
        let monHp = arr[i][2];
        let monAtck = arr[i][1];
        if (choice === 1n) {
          let monsz = (monHp + attack - 1n) / attack - 1n;
          hp -= monsz * monAtck;
          if (hp <= 0n) return 0;
        } else {
          hp += arr[i][2];
          if (hp >= m) hp = m;
          attack += arr[i][1];
        }
    
      }
    
      return 1;
    }
    let ans = 0n;
    
    function binarySearch2(low, high) {
      while (low <= high) {
        let mid = (low + high) / 2n;
        if (fighting(mid, curAtk)) {
          high = mid - 1n;
          ans = mid;
        } else {
          low = mid + 1n;
        }
      }
    }
    binarySearch2(lowHp, highHp);
    console.log(ans.toString());
    반응형