문제
노래 N곡(각 L초)을 연속 재생하고 곡 사이 5초 쉬는 동안, D초 간격으로 전화벨이 울린다. 쉬는 시간에 벨이 울리는 최초 시각을 구하라.
입력
첫째 줄에 N, L, D가 주어진다.
출력
전화를 받을 수 있는 최초 시각을 출력한다.
예제
| 입력 | 출력 |
|---|---|
3 10 5 | 10 |
풀이
노래 재생/쉬는 구간을 시간축으로 표현하고, 전화벨 시각이 쉬는 구간에 해당하는지 확인한다.
- 주기(L+5)에서 L초 미만이면 재생 중, 이후는 쉬는 시간이다
- 전체 재생 시간 이후는 항상 쉬는 시간이다
- 0, D, 2D, ... 순으로 전화벨 시각을 확인하여 쉬는 시간에 해당하면 반환한다
핵심 아이디어: 모듈러 연산으로 현재 시각이 재생 중인지 쉬는 시간인지 O(1)에 판별할 수 있다.
코드
const solution = (input) => {
const [N, L, D] = input[0].trim().split(" ").map(Number);
const totalTime = N * L + (N - 1) * 5;
const isPlaying = (t) => {
if (t >= totalTime) return false;
const cycle = L + 5;
const pos = t % cycle;
return pos < L;
};
for (let t = 0; ; t += D) {
if (!isPlaying(t)) return t;
}
};
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
console.log(solution(input));복잡도
- 시간: O(N × L / D)
- 공간: O(1)