[Python] 카카오(2) 방금 그곡

Updated: Categories:

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

아이디어

  1. 우선 주어진 정보 리스트를 순회합니다.
  2. 해당 정보는 ','로 슬라이싱해서 정보를 분류합니다.
  3. 시간 문자열은 실제 시간 데이터로 변환하여 차이를 구해냅니다.
  4. 그리고 m의 악보와 곡 정보 악보에서 '#'이 붙은 음을 한 글자로 변환합니다.
  5. 곡 정보 악보를 시간 차이만큼 나눠서 몇번 반복할지와 어디까지 추가할지를 정합니다.
  6. 실제 시간동안 반복되었던 악보를 구해냅니다.
  7. 자신이 들은 구간 m이 실제 반복된 악보에 포함되었다면 시간차와 제목을 저장합니다.
  8. 저장된 {시간:제목} 딕셔너리에서 가장 큰 시간 중 제일 먼저 등장한 제목을 반환합니다.
  9. 주어진 문자열을 어떻게 알맞게 슬라이싱하여 활용하는지가 중요한 문제였습니다.

알게 된 함수/방법

  • datetime.strptime(문자열, 반환형태) : 시간형태로 쓰여진 문자열을 반환 형태에 맞춰 실제 시간 데이터로 반환해주는 함수.
    datetime.strptime(info[0], '%M:%S')
    
  • // : 나누고 몫이 반환됨

정답 코드

from datetime import datetime
from collections import defaultdict

def change_scale(scale):
    scale = scale.replace('C#', 'c')
    scale = scale.replace('D#', 'd')
    scale = scale.replace('F#', 'f')
    scale = scale.replace('G#', 'g')
    scale = scale.replace('A#', 'a')
    return scale

def solution(m, musicinfos):
    title = defaultdict(lambda : [])
    for info in musicinfos:
        info = info.split(',')
        t1 = datetime.strptime(info[0], '%M:%S')
        t2 = datetime.strptime(info[1], '%M:%S')
        time = (t2-t1).seconds
        scale = change_scale(info[3])

        m = change_scale(m)
        rem = time % len(scale)
        quo = int(time/len(scale))

        exp_scale = scale*quo
        for i in range(rem):
            exp_scale += scale[i]
        if m in exp_scale:
            title[time].append(info[2]) 

    if not title:
        return '(None)'
    else:
        return title[max(title.keys())][0]