softeer 바이러스 문제

태권·2023년 8월 4일
0

문제
바이러스가 숙주의 몸속에서 1초당 P배씩 증가한다.

처음에 바이러스 K마리가 있었다면 N초 후에는 총 몇 마리의 바이러스로 불어날까? N초 동안 죽는 바이러스는 없다고 가정한다.

제약조건
1 ≤ K ≤ 108인 정수

1 ≤ P ≤ 108인 정수

1 ≤ N ≤ 106인 정수

입력형식
첫 번째 줄에 처음 바이러스의 수 K, 증가율 P, 총 시간 N(초)이 주어진다.

출력형식
최종 바이러스 개수를 1000000007로 나눈 나머지를 출력하라.

입력예제1
2 3 2
출력예제1
18

처음 풀이


const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
// 1초당 P배 씩  K마리가 N초후 몇마리일까?
let K; // k마리
let P; // 배속
let N; // 초후

rl.on("line", (line) => {
  [K, P, N] = line.split(" ").map(Number);
  rl.close();
});

rl.on("close", () => {
  let anser = P ** N * K;
  console.log(anser % 1000000007);
});

여기서 readline 자바스크립트 입출력표준방식인데 프로그래머스에서는 리턴값이 정답이지만 백준이나 softeer에서는 입출력방식으로 정답을 올려야한다.

처음엔 위의 코드와 같이 답을 올렸는데
간단한 문제라고 생각을 했고 쉽게 풀렸다 하지만
정답이 아니였고 왜 틑렸나 생각해보니

let [K, P, N] = line.split(" ").map(BigInt); // BigInt로 변환

  let answer = K;
  for (let i = 0; i < Number(N); i++) { // N은 BigInt이므로 순회를 위해 Number로 변환
    answer = (answer * P) % 1000000007n; // 모듈로 연산에 BigInt 리터럴 사용
  }
  console.log(answer.toString()); // BigInt를 문자열로 변환하여 출력

오버플로우를 막기위해 BigInt를 사용해주고
직접적으로 제곱을 하기보다는 반복문을 통해 계산을 해주는것이 더 안정적이였다.

profile
2022.08 개발자 시작

0개의 댓글