[Python] 카카오(2) 방금 그곡
Updated: Categories: Programmershttps://programmers.co.kr/learn/courses/30/lessons/17683
아이디어
- 우선 주어진 정보 리스트를 순회합니다.
- 해당 정보는
','
로 슬라이싱해서 정보를 분류합니다. - 시간 문자열은 실제 시간 데이터로 변환하여 차이를 구해냅니다.
- 그리고 m의 악보와 곡 정보 악보에서
'#'
이 붙은 음을 한 글자로 변환합니다. - 곡 정보 악보를 시간 차이만큼 나눠서 몇번 반복할지와 어디까지 추가할지를 정합니다.
- 실제 시간동안 반복되었던 악보를 구해냅니다.
- 자신이 들은 구간 m이 실제 반복된 악보에 포함되었다면 시간차와 제목을 저장합니다.
- 저장된
{시간:제목}
딕셔너리에서 가장 큰 시간 중 제일 먼저 등장한 제목을 반환합니다. - 주어진 문자열을 어떻게 알맞게 슬라이싱하여 활용하는지가 중요한 문제였습니다.
알게 된 함수/방법
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]