개발하는 핑구

문제

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

 

프로그래머스

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

programmers.co.kr


풀이

  • 내가 기억한 멜로디와 musicinfos에 있는 멜로디와 비교하기 위해 "C"과 "C#"을 구별하는 방법이 필요하다.
  • 간단하게 replace를 활용해 "#"이 포함된 문자는 다른 문자로 대체한다. (ex. C# -> H)
  • 각 음은 1분에 1개씩 재생되기 때문에 재생 시간이 멜로디의 길이보다 클 경우 멜로디의 길이를 재생 시간만큼 늘려준다.
  • "조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다." 라는 조건을 충족하기 위해 재생 시간은 내림차순, index는 오름차순으로 정렬해 정답을 추출한다.

코드

from collections import deque

def replace_melody(melody, other_melody):
    for key in other_melody:
        melody = melody.replace(key, other_melody[key])
        
    return melody

def solution(m, musicinfos):
    answer = []
    runtime = []
    titles = []
    melodies = []
    other_melody = {"A#": "H", "C#": "I", "D#": "J", "F#": "K", "G#": "L"}
    
    m = replace_melody(m, other_melody)
    
    for musicinfo in musicinfos:
        start, end, title, melody = musicinfo.split(",")
        start = start.split(":")
        end = end.split(":")
        melody = replace_melody(melody, other_melody)
    
        runtime.append((int(end[0])*60 + int(end[1]) - (int(start[0])*60 + int(start[1]))))
        titles.append(title)
        melodies.append(melody)
    
    for i, melody in enumerate(melodies):
        melody = melody*(runtime[i]//len(melody)+1)
        j = runtime[i]
        
        if m in melody[:j]:
            answer.append((runtime[i], i))
            
    answer.sort(key=lambda x: [-x[0], x[1]])
    
    if not answer:
        return "(None)"
    else:
        return titles[answer[0][1]]
profile

개발하는 핑구

@sinq

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!