본문 바로가기

알고리즘/프로그래머스

2018 KAKAO BLIND RECRUITMENT- 방금그곡, 파이썬

1. 문제

- 프로그래머스 문제링크

 

2. 풀이

- 문제가 어려운 편은 아닌데 문제를 잘 읽지 않으면 테스트케이스 통과가 어렵다. 

- "조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다" 를 만족하지 않으면 테스트케이스 30번을 틀리게 된다. 

- "조건이 일치하는 음악이 없을 때에는 “(None)”을 반환한다." 를 만족하지 않으면 테스트 케이스 22, 23 24, 29번을 틀리게 된다.

- return None , return (None) 등을 했다가 틀려서 봤더니 return "(None)" 을 했어야 했다.(생각해보면 당연) 

 

3. 코드

# '#' 이 들어간 경우 문자열을 소문자로 바꿔주었다.(재생시간에 따른 멜로디, 멜로디 포함여부 등 처리를 위함)
def convert_melody(melody) :
    s = ''
    for i in range(len(melody)) :
        if melody[i] == '#' :
            s = s[:-1] + s[-1].lower()
        else :
            s += melody[i]
    return s

def solution(m, musicinfos):
    infos = []
    m = convert_melody(m)
    for music in musicinfos:
        infos.append(music.split(","))
        infos[-1][-1] = convert_melody(infos[-1][-1])
    # 각 노래별 재생시간동안 재생된 멜로디를 note로 저장해주었다. 여러 후보곡 처리를 위해 재생시간, 순서 등 기록)
    music_list = []
    for idx, info in enumerate(infos) :
        note = ''
        start = int(info[0].split(":")[0]) * 60 + int(info[0].split(":")[1])
        end = int(info[1].split(":")[0]) * 60 + int(info[1].split(":")[1])
        for i in range(end - start) :
            note += info[-1][i % len(info[-1])]
        music_list.append([end-start, idx, info[2], note])
    # 후보곡 중 재생시간을 내림차순으로, 입력 순서를 오름차순으로 정렬한다. 
    cand = []
    for song in music_list :
        if m in song[3] :
            cand.append(song)
    cand.sort(key = lambda x : (-x[0], x[1]))
    # 문제 조건에 의한 노래제목 반환
    if not cand :
        return "(None)"
    else :
        return cand[0][2]