def solution(m, musicinfos):
# 음악 재생 시간
def meantime(start, end):
shour,smin = list(map(int,start.split(':')))
ehour,emin = list(map(int,end.split(':')))
if shour > ehour:
ehour += 24
return 60 * (ehour - shour) + (emin - smin)
# melody parsing
def parsemelody(melody):
melody=melody.replace('C#', 'c')
melody=melody.replace('D#', 'd')
melody=melody.replace('F#', 'f')
melody=melody.replace('G#', 'g')
melody=melody.replace('A#', 'a')
melody = ''.join(list(melody))
return melody
target = parsemelody(m)
candidates=[]
for i, m in enumerate(musicinfos):
full = ""
start,end,name,melody = m.split(',')
melody = parsemelody(melody)
time = meantime(start, end)
# 반복횟수
itertime, rest = divmod(time, len(melody))
full = melody * itertime + melody[:rest]
if target in full:
candidates.append((i,time, name))
if not candidates:
return '(None)'
candidates.sort(key = lambda x: (-x[1], x[0]))
return candidates[0][2]
meantime
: 시작시간과 끝 시간을 이용하여 음악 재생 시간을 return 한다
parsemelody
: melody 에서 # 이 붙은 것을 소문자로 바꿔준다 (예 : C# -> c) 음악 재생 시간과 멜로디를 일치하기 위함이다.
target = parsemelody(m)
candidates=[]
for i, m in enumerate(musicinfos):
full = ""
start,end,name,melody = m.split(',')
melody = parsemelody(melody)
time = meantime(start, end)
# 반복횟수
itertime, rest = divmod(time, len(melody))
full = melody * itertime + melody[:rest]
if target in full:
candidates.append((i,time, name))
target
은 찾으려는 멜로디. 역시 parsemelody 함수를 이용하여 파싱을 해 준다. 조건을 일치하는 음악이 여러 개 있을 수 있기 때문에 candidates
에 모두 넣은 후 sorting 하여 답을 제출한다.
노래 재생 시간에 따라 음악이 얼마나 반복될 수 있을 지 결정된다. 이는 노래 재생 시간을 멜로디의 길이로 나눈 몫과 나머지를 이용한다. full
은 결과적으로 얻어진(= 실제 해당 노래에 대해 재생될) 멜로디 string 이다. 이 안에 target 이 있는 지를 확인하여 만약 존재한다면 candidates
에 추가한다.