🔗 Problem Link
❔Thinking
- 기억하는 악보를 포함하는 곡의 이름을 반환한다.
- 1분당 1개의 음이 재생시간 동안 재생되며, 악보는 처음부터 반복 재생된다.
- 해당하는 곡이 여러개일 경우, 재생시간이 길고 먼저 입력된 곡의 이름을 반환한다.
💻Solution
def solution(m, musicinfos):
answer = []
melodies = {}
# 각 음악 별 악보 구하기 (재생 시간)
for music in musicinfos:
s, e, title, melody = music.split(',')
melody = melody.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f')
melody = melody.replace('G#', 'g').replace('A#', 'a')
music_length = len(melody)
s, e = list(map(int, s.split(':'))), list(map(int, e.split(':')))
runtime = (e[0]-1-s[0]) * 60 + (60+e[1])-s[1]
total_melody = runtime // music_length * melody + melody[:runtime % music_length+1]
melodies[title] = [runtime, total_melody]
# 기억하는 악보에 해당하는 음악 확인하기
m = m.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f')
m = m.replace('G#', 'g').replace('A#', 'a')
for t, info in melodies.items():
runtime, melody = info
if m in melody:
answer.append([t, runtime, melody])
answer = sorted(answer, key=lambda x: x[1], reverse=True)
print(answer)
return answer[0][0] if answer else "(None)"
🗝️keypoint
- C#, D# 등은 하나의 음이므로, 하나의 문자로 치환해야 조건에 맞게 문제를 해결할 수 있다.
- 정렬 조건을 잘 읽고, 이에 맞게 reverse를 True와 False로 조정해야 한다.
- 수의 수학적 계산은 int형 일때 가능하므로, split 등 문자열을 다룬 후의 type에 주의한다.