🔗 Problem Link

 

프로그래머스

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

programmers.co.kr


❔Thinking

  • 기억하는 악보를 포함하는 곡의 이름을 반환한다.
  • 1분당 1개의 음이 재생시간 동안 재생되며, 악보는 처음부터 반복 재생된다.
  • 해당하는 곡이 여러개일 경우, 재생시간이 길고 먼저 입력된 곡의 이름을 반환한다.

💻Solution

def solution(m, musicinfos):
    answer = []
    melodies = {}
    # 각 음악 별 악보 구하기 (재생 시간)
    for music in musicinfos:
        s, e, title, melody = music.split(',')
        melody = melody.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f')
        melody = melody.replace('G#', 'g').replace('A#', 'a')
        music_length = len(melody)
        s, e = list(map(int, s.split(':'))), list(map(int, e.split(':')))
        runtime = (e[0]-1-s[0]) * 60 + (60+e[1])-s[1]
        total_melody = runtime // music_length * melody + melody[:runtime % music_length+1]
        melodies[title] = [runtime, total_melody]
    # 기억하는 악보에 해당하는 음악 확인하기
    m = m.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f')
    m = m.replace('G#', 'g').replace('A#', 'a')
    for t, info in melodies.items():
        runtime, melody = info
        if m in melody:
            answer.append([t, runtime, melody])
    answer = sorted(answer, key=lambda x: x[1], reverse=True)
    print(answer)
    return answer[0][0] if answer else "(None)"

🗝️keypoint

  1. C#, D# 등은 하나의 음이므로, 하나의 문자로 치환해야 조건에 맞게 문제를 해결할 수 있다.
  2. 정렬 조건을 잘 읽고, 이에 맞게 reverse를 True와 False로 조정해야 한다.
  3. 수의 수학적 계산은 int형 일때 가능하므로, split 등 문자열을 다룬 후의 type에 주의한다.

+ Recent posts