문제
바이러스가 숙주의 몸속에서 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를 사용해주고
직접적으로 제곱을 하기보다는 반복문을 통해 계산을 해주는것이 더 안정적이였다.