본문 바로가기
Algorithm/프로그래머스

[프로그래머스] - 방금그곡 (파이썬)

by 2HS 2022. 2. 6.
sound = {'A#': '1', 'C#': '2', 'D#': '3', 'F#': '4', 'G#': '5'}


def solution(m, musicinfos):
    answer = ''
    result = []

    m = m.replace('A#', sound['A#'])
    m = m.replace('C#', sound['C#'])
    m = m.replace('D#', sound['D#'])
    m = m.replace('F#', sound['F#'])
    m = m.replace('G#', sound['G#'])

    for music in musicinfos:
        title, time, melody = music_melody(m, music)
        if m in melody:
            result.append([title, time])
    result.sort(key=lambda x: -x[1])
    if result:
        answer = result[0][0]
    else:
        answer = '(None)'
    return answer


def music_melody(m, music):
    start, end, title, melody = music.split(',')
    start_hour, start_minute = map(int, start.split(':'))
    end_hour, end_minute = map(int, end.split(':'))

    hour = end_hour - start_hour
    minute = end_minute - start_minute
    time = hour*60 + minute

    melody = melody.replace('A#', sound['A#'])
    melody = melody.replace('C#', sound['C#'])
    melody = melody.replace('D#', sound['D#'])
    melody = melody.replace('F#', sound['F#'])
    melody = melody.replace('G#', sound['G#'])

    if time >= len(melody):
        temp = time // len(melody)
        temp2 = time % len(melody)
        for _ in range(temp):
            melody += melody
            if len(melody) > len(m):
                break
        melody += melody[:temp2]
    else:
        temp2 = time % len(melody)
        melody = melody[:temp2]

    return title, time, melody

 

2018 카카오 블라인드 3차 - 4번

1. 딕셔너리를 이용해서 m을 먼저 replace해준다

2. musicinfos의 값들을 각각 music_melody함수를 이용해서 title, time, 총길이의 melody를 반환 받는다

    - split을 통해서 전부 분해해주고 time을 구해준다

    - melody는 총시간동안 반복을 해서 받아준다 단 길이가 m의 길이보다 길어지면 멈춘다(안그러면 시간초과)

3. 총길이의 멜로디안에 m이 있다면 result에 [title,time]을 append

4. resulst를 time이 긴순서로 정렬

5. answer =  result가 있다면 result[0][0], 없다면 '(None)'

6. answer 출력