본문 바로가기
Algorithm/Python

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

by 힘팽 2022. 3. 12.

◈ 오류 정정 및 피드백 환영

 

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

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

programmers.co.kr


🔎문제 분석

편의상 재생시간은 분 단위로 측정하고, #이 붙은 계이름을 구분해주기 위해 소문자로 변경한다.

def str_to_min(st):
    h, m = st.split(":")
    return int(h)*60 + int(m)
    
def trans(st):
    for i in ["A","C","D","F","G"]:
        st = st.replace(i+"#",i.lower())
    return st
    
for i in musicinfos:
        s, e, name, melody = i.split(',')
        time = str_to_min(e)-str_to_min(s)
        m = trans(m)
        melody = trans(melody)

 

재생시간을 측정하기 위해 재생된 멜로디를 생성해야 하는데 재생시간과 음악시간의 차이에 따라 3가지 경우로 나뉜다.

  1. 재생시간=음악시간
  2. 재생시간<음악시간
  3. 재생시간>음악시간

길이가 같은 1. 과 달리 2. 의 경우 재생시간만큼만 멜로디를 재생해야 하며, 3. 의 경우 재생시간을 음악시간으로 나누어 몫만큼 반복하고 나머지만큼 추가로 재생해야 한다. 

if time==n:
    play = melody
elif time<n:
    play = melody[:time] 
else:
    sh, re = divmod(time, n)
    play = melody*sh+melody[:re]

마지막으로 일치하는 멜로디의 길이를 비교하며 재생시간이 가장 긴 음악 제목을 업데이트하면 된다

if m in play:
    if len(play) > mx_play:
        mx_play = len(play)
        answer = name

def str_to_min(st):
    h, m = st.split(":")
    return int(h)*60 + int(m)
 
def trans(st):
    for i in ["A","C","D","F","G"]:
        st = st.replace(i+"#",i.lower())
    return st
 
def solution(m, musicinfos):
    answer = '(None)'
    mx_play = 0
    for i in musicinfos:
        s, e, name, melody = i.split(',')
        time = str_to_min(e)-str_to_min(s)
        m = trans(m)
        melody = trans(melody)
        n = len(melody)
        if time==n:
            play = melody
        elif time<n:
            play = melody[:time] 
        else:
            sh, re = divmod(time, n)
            play = melody*sh+melody[:re]
               
        if m in play:
            if len(play) > mx_play:
                mx_play = len(play)
                answer = name
        
    return answer

댓글