본문 바로가기
개발/문제풀이

프로그래머스 '[3차] 방금그곡' 파이썬 풀이

by beomcoder 2023. 5. 18.
728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/17683
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

(하략)
"""

def solution(m, musicinfos):
    m = m.replace('A#','a').replace('C#','c').replace('D#','d').replace('F#','f').replace('G#','g')
    found = {'time': 0, 'name': '(None)'}
    
    for data in musicinfos:
        start, end, name, song = data.split(',')
        
        start_hour, start_min = map(int, start.split(':'))
        end_hour, end_min = map(int, end.split(':'))
        length = (end_hour-start_hour)*60 + (end_min-start_min)
        
        song = song.replace('A#','a').replace('C#','c').replace('D#','d').replace('F#','f').replace('G#','g')
        song = (song*max(1, int(length/len(song))+1))[:length]
        
        if m in song and found['time'] < length:
            found = {'time': length, 'name': name}
            
    return found['name']
    
"""
문제를 보니까 몇가지 특징만 생각하면 쉽게 풀릴거 같다는 생각이었다.

1. #이 붙은 음은 한음으로 인식해주고 있고,
2. 시간이 더 긴 음악, 같다면 먼저 찾은 음악을 알려준다.
3. 원곡에 맞는 음이 있어도 방송에 나온 음들만 생각해야한다.

먼저 #이 붙은 음들을 치환시켜주었다. 
그리고 찾은음악에 대한 정보를 담을 딕셔너리를 선언해주었다.

musicinfos를 하나씩 가지고 온다. (for문)
data는 ,을 기준으로 나누어져있다고 했으므로 ,을 기준으로 나누어 준다.

시작시간과 끝시간을 계산해 음이 들린 총 길이를 계산한다.
방송에서 들린 음을 song을 통해 구한다.
song은 먼저 m과 마찬가지로 #음을 치환시켜주고,
방송시간에 맞춰서 song의 길이를 늘려준다.

song = (song*max(1, int(length/len(song))+1))[:length]
이 부분 정도만 헷갈릴 것 같은데 song의 길이를 어떻게 얼마나 늘려줘야 할지 고민했다.
(방송 길이/song의 길이) + 1 을 한다면 어느 길이까지 늘려야 하는지 나온다.

예를 들어 10분의 방송, 3분의 song이라면 10/3은 3.33 -> 3이 된다.
그러면 song*(3+1) = 12분의 길이가 된다.
max(1, 길이)를 해준 이유는 방송길이가 song의 길이보다 작다면 음수가 되기 때문이다.
그리고 방송길이가 song의 길이보다 작은 경우가 있으므로 [:length]만큼 잘라주었다.

전처리가 모두 끝났다면 m이 song안에 있고, 찾은 노래의 길이보다 더 길다면
새로운 노래를 찾은것이므로 찾은노래를 업데이트해준다.

if m in song and found['time'] < length 여기서 <= 가 아니라 < 인 이유는
노래길이가 같다면 먼저 입력된 노래가 정답이기 때문이다.
"""
728x90
반응형

댓글