[Programmers] 방금 그곡

김가영·2021년 2월 14일
0

Algorithm

목록 보기
51/78
post-thumbnail
post-custom-banner

문제 바로가기

전체 풀이

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]

details

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 에 추가한다.

profile
개발블로그
post-custom-banner

0개의 댓글