복대가리의 개발

[C#] 백준 (알고리즘)/브론즈 문제

[백준 - C#] 1333번 부재중 전화

복대가리 2022. 8. 30. 22:51
728x90

문제링크

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

 

1333번: 부재중 전화

첫째 줄에 세 정수 N, L, D가 공백을 사이에 두고 주어진다.

www.acmicpc.net

 

문제

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

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

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

강토는 락 스피릿을 진심으로 느끼기 위해서 볼륨을 매우 크게 하고 듣기 때문에, 노래가 나오는 중에는 전화벨 소리를 듣지 못한다. 만약, 전화벨이 노래가 시작되는 순간 울린다면, 강토는 전화를 받지 못한다. 또, 전화벨이 노래가 끝나는 순간 같이 끝난다면, 강토는 전화를 받을 수 없다.

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

강토가 전화벨을 들을 수 있는 가장 빠른 시간을 구하는 프로그램을 작성하시오.

조건

시간제한 : 2초
메모리 제한 : 128 MB

입력

첫째 줄에 세 정수 N, L, D가 공백을 사이에 두고 주어진다.

출력

첫째 줄에 강토가 전화벨을 들을 수 있는 가장 빠른 시간을 출력한다.

 

문제정리

1. 총 노래는 N곡 / 모든 노래의 길이는 L / 전화벨은 D초에 1번씩 1초동안
2. 노래와 노래 사이는 5초동안 아무소리도 안들린다. ( 전화를 받을 수 있는 시간 )
3. 강토는 앨범을 총 1번만 듣는다.
4. 전화벨을 들을 수 있는 가장 빠른 시간을 구하시오.

이번 문제의 경우 문제를 이해하고 파악하는데 조금 오래 걸렸습니다. 결론은 전화벨을 들을 수 있는 가장 빠른시간을 구하는 것인데 노래와 노래 사이 아무도 안들리는 시간에 전화벨이 울려 받거나 노래가 다 끝난 후 노래를 받은 경우 두가지가 있습니다.

총 노래 N곡을 진행할 때 노래를 부르는 L 시간동안 전화벨이 울리면 벨을 0으로 초기화하고 노래가 다 끝나고 5초동안 전화벨이 울리면 측정한 누적 time 값을 result에 넣고 모든 반복문을 종료하여 result 값을 출력 해줍니다.

 

만약 result 값이 0으로 끝났다는 소리는 노래다 끝날 때 까지 전화를 못받았다는 것이고 모든 노래가 끝난 시점 부터 전화벨이 울릴 때까지 시간을 계산 하여야 하므로 time % D 나머지 값이 0이면 바로 전화를 받으면 되고 아니라면 

time + D - (time % D) 값으로 전화벨 시간을 더해줘야 시간을 구할 수 있습니다.

 

아래의 코드를 순차적으로 주석과 함께보면 쉽게 이해하실 수 있습니다.

 

C# 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
static void Main(string[] args)
{
    //  https://bokhead.tistory.com/
    StreamWriter writer = new StreamWriter(Console.OpenStandardOutput());
    StreamReader reader = new StreamReader(Console.OpenStandardInput());
 
    string[] input = reader.ReadLine().Split();
    int N = int.Parse(input[0]); // 총 노래 곡
    int L = int.Parse(input[1]); // 모든 노래의 길이
    int D = int.Parse(input[2]); // 전화벨 울리는 초시간
 
    int time = 0// 전화벨을 들을 수 있는 시간 누적
    int bell = 0// 전화벨 체크 
    int result = 0// 정답
    int index = 0// N곡 인덱스 넘버
 
    while (N - 1 >= index)
    {
        int music = 0// 뮤직 진행 시간
 
        while (true)
        {
            if (music == L) // 뮤직 진행이 끝나면 반복문 종료
                break;
 
            if (bell >= D) // 전화벨 시간이 지나면 0초로 초기화
                bell = 0;
 
            music++;
            bell++;
            time++;
        }
 
        for (int j = 0; j < 5; j++// 노래와 노래 사이 5초
        {
            if (bell >= D) // 이 시간에 전화벨을 울릴 시간이 되면 프로그램 종료 준비
            {
                index = N; // 최상위 반복문을 종료하기 위한 플래그 
                result = time; // 종료되는 시간 측정
                break;
            }
            bell++;
            time++;
        }
 
        index++;
    }
 
    if (result == 0// 만약 노래가 전부다 끝나기 전까지 전화를 못받았다면
        result = (time % D == 0) ? time : time + D - (time % D); // 전화벨이 울릴시간을 측정하여 최종 값 계산
 
    writer.WriteLine(result);
 
    writer.Close();
    reader.Close();
}
cs

 

 
읽어주셔서 감사합니다 오늘도 즐거운 하루 되세요.

 

728x90