[Python] 프로그래머스 - 방금그곡

728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

2018 카카오 블라인드 코딩테스트 문제이다. 문제 지문이 길어서 문제 이해하는데도 오래걸렸고

 문자열 처리가 꽤 까다로웠다.

 

# 테스트케이스 2개가 자꾸 틀려서 꽤 시간을 잡아먹었는데, 알고보니 20~24줄 재생시간 구하는 알고리즘

   때문이었다.

# change함수처럼 #붙은 음들을 어떻게 처리해야하는지 아이디어와 실제로 구현하는 데도 시간이 

   많이 소요되었다.

def solution(m, musicinfos):
    # 악보에 있는 음과 기억한 멜로디에 있는 #붙은 음들을 소문자로 replace해준다.
    def change(txt):
        dic = {"C#": 'c', "D#": 'd', "E#": 'e', "F#": 'f', "G#": 'g', "A#": 'a'}
        for i in dic:
            if i in txt:
                a = txt.replace(i, dic[i])
                txt = a
        return txt
    
    music = {}
    answer = []
    for i in musicinfos:
        # musicinfos에 있는 곡 정보를 ,단위로 split해준다.
        # info에는 ['03:00', '03:10', 'FOO', 'CCB#CCB'] 이런식으로 들어가게 된다.
        info = i.split(",")
        # sound에 악보정보에 change함수를 적용한 것을 넣어준다.
        sound = change(info[3])
        # 재생시간 구하는 알고리즘
        hour = 1 * (int(info[1].split(':')[0]) - int(info[0].split(':')[0]))
        if hour == 0: 
            time = int(info[1].split(':')[1]) - int(info[0].split(':')[1])
        else: 
            time = 60 * hour + int(info[1].split(':')[1]) - int(info[0].split(':')[1])
        # 재생시간을 sound길이로 나눈 몫과 나머지를 구한 뒤 몫만큼 sound를 곱하고 남은 나머지시간만큼 sound[:r]을 더해준다.
        # music[곡 제목] = [재생된 음, 재생시간]
        q, r = divmod(time, len(sound))
        music[info[2]] = [sound * q + sound[:r], time]
    
    # 찾고자 하는 멜로디인 m에 change 함수를 적용해 #붙은 음들을 소문자로 바꿔준다.
    change_m = change(m)
    for i in music:
        # 찾고자하는 멜로디가 music[i][0](재생된 음)에 존재한다면 answer에 [곡 제목, 재생시간]을 append해준다.
        if change_m in music[i][0]:
            answer.append([i, music[i][1]])
    
    # "조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다.
    # 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다." 조건에 따라 재생시간이 긴 순서대로 정렬한다.
    answer.sort(key = lambda x: -x[1])
    # answer이 존재하면 answer의 제목을 출력하고 answer이 비어있으면 (None) 출력
    if answer:
        return answer[0][0]
    else:
        return '(None)'

(프로그래머스 level: 2)

728x90
반응형
TAGS.

Comments