[OLD] 기존 글 저장

백준 1333번 파이썬 풀이 : 부재중 전화

한민기 2021. 9. 24. 15:46
반응형

문제 링크 : https://www.acmicpc.net/problem/1333

 

1333번: 부재중 전화

첫째 줄에 N, L, D가 공백을 사이에 두고 주어진다. 모든 수는 1,000보다 작거나 같은 자연수이다.

www.acmicpc.net

문제

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

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

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

강토는 락 스피릿을 진심으로 느끼기 위해서 볼륨을 매우 크게 하고 듣기 때문에, 노래가 나오는 중에는 전화벨 소리를 듣지 못한다.

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

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

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

입력

첫째 줄에 N, L, D가 공백을 사이에 두고 주어진다. 모든 수는 1,000보다 작거나 같은 자연수이다.

출력

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

 

# 문제 풀이 

모든 앨범 수록곡을 다 들을 때까지의 시간을 배열로 표현하였다. (1칸에 1초)

모든 배열을 True 로 초기화 한 후 노래가 재생 될 때는 전화를 받을 수 없기 때문에 False로 표현하였다.

 

1
2
3
n, l, d = map(int, input().split())
 
music = [True* ((n * l) + (5 * (n - 1)))
cs

[True] 배열을 n * l 은 앨범 개수 * 앨범 재생 시간으로 총 앨범 재생 시간이며 5 * (n - 1) 은 노래 사이사이 5초의 휴식시간을 의미한다.

 

1
2
3
4
for i in range(n):
    play_time = (l + 5* i
    for j in range(play_time, play_time + l):
        music[j] = False
cs

노래가 재생되는 0 ~ 5초 , 10초 ~ 15초의 구간을 False로 바꾸어 준다. 여기서 재생시간 5초는 고정이 아닌 입력 값 l 이므로 두번째 반복문에서 + l 을 통해 재생 구간을 정해준다.

 

1
2
3
4
5
6
answer = 0
while answer < len(music):
    if music[answer]:
        break
    answer += d
print(answer)
cs

구간 설정이 끝나면 music 배열만큼 반복을 하며 music[answer] 에 해당하는 값이 True 면 전화를 받을 수 있는 상태이기 때문에 answer 값을 출력해준다. 만약 True가 아니면 전화벨이 울리는 텀인 d를 더해가며 True인 구간을 찾는다.

 

# 전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
n, l, d = map(int, input().split())
 
music = [True* ((n * l) + (5 * (n - 1)))
 
for i in range(n):
    play_time = (l + 5* i
    for j in range(play_time, play_time + l):
        music[j] = False
answer = 0
while answer < len(music):
    if music[answer]:
        break
    answer += d
print(answer)
cs

 

반응형