m
에 있는 음 중 '#'
이 붙은 음들을 모두 소문자로 변환해준다.(함수 replace_pound()
) <- 문자열 검사를 할 때 편리하기 위해서!musicinfos
를 순회'#'
이 붙은 음들을 모두 소문자로 변환time_calc()
)m
이 있는지 확인해서 있다면 정답 리스트에 넣는다. 이때 정답 리스트는 최소힙!정답 리스트에 넣을 때
[-play_time, cnt, title]
로 넣는 이유
- "조건이 일치하는 음악이 여러개일 때에는 라이도에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다." 조건을 만족시키기 위해서!
import heapq
# 음악이 재생된 시간을 계산해주는 함수
def time_calc(start, end):
hour = int(end[:2]) - int(start[:2])
if hour != 0:
return 60*hour + int(end[3:]) - int(start[3:])
else:
return int(end[3:]) - int(start[3:])
# '#'이 붙은 알파벳을 소문자로 변환해주는 함수
def replace_pound(note):
while '#' in note:
i = note.find('#')
if note[i] == '#':
note = note.replace(note[i-1:i+1], note[i-1].lower())
return note
def solution(m, musicinfos):
answer = []
m = replace_pound(m)
cnt = 0 # 음악이 입력된 순서를 알 수 있는 변수
for musicinfo in musicinfos:
musicinfo = musicinfo.split(',')
start, end = musicinfo[0], musicinfo[1]
title = musicinfo[2]
note = musicinfo[3]
note = replace_pound(note)
play_time = time_calc(start, end)
# 2-2. 음악 길이보다 재생 길이가 길면 음악을 반복해서 재생
if len(note) < play_time:
note *= (play_time // len(note) + 1)
# 2-3. 음악 길이를 재생 길이만큼 자른다.
note = note[:play_time]
# 2-4. 재생된 음악 안에 m이 있다면 정답 리스트에 넣는다.
if m in note:
heapq.heappush(answer,[-play_time, cnt, title])
cnt += 1
if answer:
return heapq.heappop(answer)[2]
else:
return '(None)'
계속 C#, D# 등 '#'이 붙은 음계들을 어떻게 처리할지 몰라서 헤맸다.
근데 이렇게 한번에 처리해야 하는 문자들을 replace()
메소드로 한 문자로 변환해서 처리하면 된다는 것을 알게 되었다.