본문으로 바로가기

2017 kakao blind recruitment 3차 방금그곡

category 알고리즘 2019. 9. 5. 16:50

 

import math
import re
def solution(m, musicinfos):
    
    musicinfos = [_.split(',') for _ in musicinfos]
    
    m = melodyconvert(m)
    
    for music in musicinfos:
        music[3] = melodyconvert(music[3])
        start = int(music[0].split(':')[0])*60 + int(music[0].split(':')[1])
        end = int(music[1].split(':')[0])*60 + int(music[1].split(':')[1])
        music.append(end - start + 1) # 재생시간 : music[4]
        if len(music[3]) > music[4]:
            music[3] = music[3][:music[4]]
        else:
            times = math.ceil(music[4]/len(music[3]))
            music[3] = (music[3]*times)[:music[4]]
                                 
    result = [ (music[2], music[4]) for music in musicinfos if m in music[3] ]
    
    if result == []:
        return '(None)'
    
    result.sort(key = lambda k : k[1], reverse = True)
        
    return result[0][0]

def melodyconvert(melody):
    melodydict = {'C#':'H', 'D#':'I', 'F#':'J', 'G#':'K', 'A#':'L'}
    for m in melodydict.keys():
        melody = re.sub(m, melodydict[m], melody)
    return melody

 

melodyconvert는 이렇게 뒤에 #이 붙어있는 것들을 예외처리 해주지 않을 경우 C#을 그냥 C라고 인식해버리기 때문에 이렇게 다른 문자로 바꿔주었다.

그리고 시간에 관련된 것들은 하나의 숫자로 묶어서 더하고 빼는 데에 용이하도록 바꿔주였다.

 

list comprehension의 중요성을 많이 느낀다.

이걸 모르고 이 문제를 풀었더라면 코드 라인 수도 길어지고, 시간도 많이 걸렸을 텐데....

나에게 아쉬운 건 아직 generator에 대한 자유자재로 사용이 잘 안 된다는 것. <- 공부하자!