Posts [알고리즘] 프로그래머스 - [3차] 방금그곡
Post
Cancel

[알고리즘] 프로그래머스 - [3차] 방금그곡


문제

[3차] 방금그곡


접근

시간에 따라 곡이 반복될 수도 있고, 잘릴 수도 있다.
편하게 하기 위해서는 해당 곡의 풀 버전을 구해야 한다.
잘리면 잘리는 버전, 반복되면 반복되는 버전을 구해서 그것과 m을 비교해주면 된다.
이를 위해 calcPlayTime 함수는 시작 시간과 종료 시간을 입력 받아 분 단위의 플레이 시간을 반환한다.
musicFullTimeVer 함수는 플레이 시간을 이용하여 곡의 풀버전을 만들어 반환한다.
이 때 사용되는 음이 C# 등 두 자리인 것들을 변환해주고 진행해야 한다.
converseMusic 함수는 #이 붙은 음을 한 자리 글자로 변환하는 역할을 한다.
여기까지 마치면 이제 m이 풀버전 음에 들어있는지 확인하고 들어있는 경우 따로 리스트를 만들어 추가한다.
이제 리스트에서 가장 시간이 긴 것을 뽑으면 되는데, 해당 리스트는 곡이 순서대로 들어있으므로, 시간이 같은 경우에 대해 무시해도 된다.


코드

  • 파이썬 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def solution(m, musicinfos):
    answer = "(None)"
    rightMusicList = []
    m = converseMusic(m)
    for musicinfo in musicinfos:
        music = musicinfo.split(',')
        playTime = calcPlayTime(music[0], music[1])
        fullMusic = musicFullTimeVer(playTime, music[3])
        if m in fullMusic:
            rightMusicList.append([playTime, music[2]])
    maxTime = -1
    for musicinfo in rightMusicList:
        if musicinfo[0] > maxTime:
            maxTime = musicinfo[0]
            answer = musicinfo[1]
    return answer

def calcPlayTime(startTimeStr, endTimeStr):
    start = startTimeStr.split(':')
    s = (int(start[0]) * 60) + int(start[1])
    end = endTimeStr.split(':')
    e = (int(end[0]) * 60) + int(end[1])
    return e - s

def converseMusic(music):
    dic = {'C#':'H', 'D#':'I', 'F#':'J', 'G#':'K', 'A#':'L'}
    for item in dic:
        music = music.replace(item,dic[item])
    return music

def musicFullTimeVer(playTime, music):
    music = converseMusic(music)
    x = (playTime // len(music)) + 1
    return (music*x)[:playTime]


This post is licensed under CC BY 4.0 by the author.