본문 바로가기

⏳ 알고리즘/python 알고리즘 문제 풀이

프로그래머스 - [3차] 방금그곡 (2018 KAKAO BLIND RECRUITMENT)

문제

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

 

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

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

programmers.co.kr

 

코드

1) 제목과 멜로디를 딕셔너리에 저장

def write_melody(item):
    li = []
    i = 0
    while i < len(item)-1:
        if item[i+1].isalpha():
            li.append(item[i])
            i += 1
        else:
            li.append(item[i:i+2])
            i += 2
    li.append(item[-1])
    
    return li

def cal_total_melody(melody, info):
    minutes = int(info[1].split(':')[1]) - int(info[0].split(':')[1])
    hours = int(info[1].split(':')[0]) - int(info[0].split(':')[0])
    play_time = hours*60 + minutes
    a, b = divmod(play_time, len(melody))

    total_melody = melody*a + melody[:b]

    return total_melody

def solution(m, musicinfos):
    answer = []
    dict = {}
    
    for i in range(len(m)):
        remember_melody = write_melody(m)
        
    for info in musicinfos:
        info = info.split(',')
        melody = write_melody(info[3])
        dict[info[2]] = cal_total_melody(melody, info)
        
    list_of_key = list(dict.keys())
    list_of_value = list(dict.values())
    
    for j in range(len(list_of_value)): 
        for k in range(len(list_of_value[j])):
            if m[0] == list_of_value[j][k]:
                if remember_melody == list_of_value[j][k:k+len(remember_melody)]:
                    position = list_of_value.index(list_of_value[j])
                    return list_of_key[position]
    
    return "(None)"

 

 

2) C#과 같은 멜로디를 소문자 c로 저장하게 구현

def solution(m, musicinfos):
    answer = []
    time = []
    music = []
    
    def cal_time(starttime, endtime):
        starttime = starttime.split(':')
        endtime = endtime.split(':')
        minutes = int(endtime[1]) - int(starttime[1])
        hours = int(endtime[0]) - int(starttime[0])
        play_time = hours*60 + minutes
        
        return play_time
    
    def modify_melody(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')
        
        return melody
        
    def cal_allmelody(melody, play_time):
        a, b = divmod(play_time, len(melody))
        allmelody = melody*a + melody[:b]
        
        return allmelody
    
    for i in range(len(musicinfos)):
        musicinfos[i] = musicinfos[i].split(',')
        time.append(musicinfos[i][0:2])
        play_time = cal_time(musicinfos[i][0], musicinfos[i][1])
        all_melody = cal_allmelody(modify_melody(musicinfos[i][3]), play_time)
        music.append([play_time, musicinfos[i][2], all_melody])
    
    for j in range(len(music)):
        m = modify_melody(m)
        if m in music[j][2]:
            answer.append(music[j])
    
    if len(answer) == 0:
        return "(None)"
    else:
        answer = sorted(answer, reverse = True)
    
    return answer[0][1]

28/30

 

def solution(m, musicinfos):
    answer = []
    time = []
    music = []
    
    def cal_time(starttime, endtime):
        starttime = starttime.split(':')
        endtime = endtime.split(':')
        minutes = int(endtime[1]) - int(starttime[1])
        hours = int(endtime[0]) - int(starttime[0])
        play_time = hours*60 + minutes
        
        return play_time
    
    def modify_melody(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')
        
        return melody
        
    def cal_allmelody(melody, play_time):
        a, b = divmod(play_time, len(melody))
        allmelody = melody*a + melody[:b]
        
        return allmelody
    
    for i in range(len(musicinfos)):
        musicinfos[i] = musicinfos[i].split(',')
        time.append(musicinfos[i][0:2])
        play_time = cal_time(musicinfos[i][0], musicinfos[i][1])
        all_melody = cal_allmelody(modify_melody(musicinfos[i][3]), play_time)
        music.append([play_time, musicinfos[i][2], all_melody])
    
    for j in range(len(music)):
        m = modify_melody(m)
        if m in music[j][2]:
            answer.append(music[j])
    
    if len(answer) == 0:
        return "(None)"
    else:
        answer = sorted(answer, key = lambda x: (-x[0], x[1]))    #이부분 수정 후 성공!
    
    return answer[0][1]