suheang

[백준] | JAVA, 자바 | 1333번 - 부재중 전화 본문

알고리즘

[백준] | JAVA, 자바 | 1333번 - 부재중 전화

suheang 2024. 6. 14. 22:13

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


문제 요약 :

얼마전, Day Of Mourning의 새 앨범이 나왔고, 강토는 이 앨범을 들으려고 한다.

이 앨범에는 총 노래가 N곡이 들어있고, 모든 노래의 길이는 L초이다. 그리고, 노래와 노래 사이에는 5초 동안 아무 노래도 들리지 않는 조용한 구간이 있다.

강토가 앨범의 첫 곡을 듣는 순간이 0초이다. 그리고 그 0초부터 강토의 전화벨이 울리기 시작한다. 전화벨은 D초에 1번씩 울리며, 한 번 울릴 때 1초동안 울린다.

강토는 볼륨을 매우 크게 하고 듣기 때문에, 노래가 나오는 중에는 전화벨 소리를 듣지 못한다.

만약, 전화벨이 노래가 시작되는 순간 울린다면, 강토는 전화를 받지 못한다. 또, 전화벨이 노래가 끝나는 순간 같이 끝난다면, 강토는 전화를 받을 수 없다.

강토는 앨범을 1번만 듣는다. 즉, 모든 앨범 수록곡을 다 듣고 난 후에는 전화벨을 들을 수 있다.

 

(전화벨을 들을 수 있는 가장 빠른 시간을 구하는 프로그램을 작성)


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int l = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken());

        int time = 0;

        while (true) {
            if (time % d == 0) {
                boolean isDuringSong = false;

                for (int i = 0; i < n; i++) {
                    int songStart = i * (l + 5);
                    int songEnd = songStart + l;

                    if (time >= songStart && time < songEnd) {
                        isDuringSong = true;
                        break;
                    }
                }

                if (!isDuringSong) {
                    System.out.println(time);
                    return;
                }
            }
            time++;
        }
    }
}

 

1. 노래 개수 n, 노래 길이 l, 전화벨 간격 d 입력받기

2. 노래 시작부터 끝까지 시간을 계산할 변수 time 생성

3. while문 동작

3 - 1. 만약 time이 d로 나누었을 때 0이라면 boolean 변수 isDuringSong 생성

3 - 2. for 문 진행, 각 노래 시작 시간을 계산한 변수 songStart, 각 노래 끝나는 시간을 계산한 변수 songEnd 생성

3 - 3. 만약 time이 songStart와 같거나 크고, time이 songEnd보다 작다면 isDuringSong을 true로 변경하고 break

(전화벨이 노래 중간에 울리는지 확인)

3 - 4. 만약 isDuringSong이 false라면 (노래 중간에 전화벨이 울리지 않는다면) time 값을 출력하고 return

3 - 5. time++