[Programmers] P17683 방금그곡
[Programmers] P17683 방금그곡
Question
Language: Python
-
C#, D#, 와 같은 음에 대해서 한 문자로 인식할 수 있도록 특정 문자로 치환하도록 한다
-
HH:MM 형태로 되어 있는 문자를 파싱해서 해당 문자에 대해 분 형태로 나타낼 수 있는 함수를 구현한다.
-
재생시간 동안 재생되는 멜로디의 배열을 만들어낸다.
-
기억하는 멜로디와 재생된 멜로디를 서로 비교해서 일치하는 부분이 있으면, 이때까지 살펴본 재생 길이와 비교를 해서 재생길이가 가장 긴 경우 최신화 한다.
- 기억하는 멜로디가 재생된 멜로디 속에 포함될 수도 있고,
- 재생된 멜로디가 기억하는 멜로디 속에 포함될 수 있으므로 두 경우 모두를 비교해야한다.
Solution
#1
def melody_convertion(melody):
convertion={
"C#":"H",
"D#":"I",
"F#":"J",
"G#":"K",
"A#":"L"
}
for key,value in convertion.items():
melody=melody.replace(key,value)
return melody
#2
def time_convertion(time_str):
time_segments=time_str.split(":")
return int(time_segments[0]) *60 + int(time_segments[1])
def solution(m, musicinfos):
answer = ''
max_duration=0
max_match=0
#기억하는 멜로디에 대해서 #이 붙은 음표를 변환한다.
m=melody_convertion(m)
musicinfos.sort()
for music in musicinfos:
start,end,name,melody=music.split(",")
duration=time_convertion(end)-time_convertion(start)
#재생된 멜로디에 대해서 #이 붙은 음표를 변환한다. 전체 재생된 멜로디를 만들기 전에 변환 작업을 먼저 해줘야한다....
melody=melody_convertion(melody)
#3 재생길이가 주어진 악보의 길이보다 길면 반복이 있다는 것이고, 그렇지 않으면 일부분만 재생되게 된다.
played_melody=melody*(duration//len(melody))+melody[:duration%len(melody)]
#4-1
if len(m) < len(played_melody):
if m in played_melody and len(played_melody) > max_duration:
max_duration=len(played_melody)
answer=name
#4-2
else:
if played_melody in m and len(played_melody) > max_duration:
max_duration=len(played_melody)
answer=name
if answer=="":
answer="(None)"
return answer
댓글남기기