© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 1333 - 부재중 전화

2024-04-21
BOJ
브론즈 I
javascript
원본 문제 보기
구현
시뮬레이션

문제

BOJ 1333 - 부재중 전화

노래 N곡(각 L초)을 연속 재생하고 곡 사이 5초 쉬는 동안, D초 간격으로 전화벨이 울린다. 쉬는 시간에 벨이 울리는 최초 시각을 구하라.

입력

첫째 줄에 N, L, D가 주어진다.

출력

전화를 받을 수 있는 최초 시각을 출력한다.

예제

입력출력
3 10 510

풀이

노래 재생/쉬는 구간을 시간축으로 표현하고, 전화벨 시각이 쉬는 구간에 해당하는지 확인한다.

  1. 주기(L+5)에서 L초 미만이면 재생 중, 이후는 쉬는 시간이다
  2. 전체 재생 시간 이후는 항상 쉬는 시간이다
  3. 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)