생각보다 어렵진 않았다. 생각보단..
내 생각에 이 문제를 푸는데에 가장 핵심은
"A#" , "A" "B#", "B" .... 등 #이 포함된 악보의 알파벳을 어떻게 구분하느냐.
문제에서 주어진 "음악 길이보다 재생된 시간이 긴 경우 끊김없이 반복재생",
"음악 길이보다 재생된 시간이 짧을때는 처음부터 재생 시간만큼만 재생".
위 두 조건을 잊지말고 만족하도록 로직을 구성해야 한다.
뭐,, 1번 방법은 여러가지가 있겠지만 A# 혹은 B# 같은 문자를 하나의 문자로 치환하는 방법이 가장 쉬운 방법같다
(A# -> a , B# ->b , C# -> c .. 이런식으로 치환했다.)
대충 풀이 순서를 정리해보자면,
내가 들은 멜로디(m)에서 #이 들어간 문자가 있을지 모르니 convert함수를 사용해 내가 사용하고싶은대로 치환한다.
musicinfos에 저장된 음악의 정보들을 for문을 이용해 각각의 음악 정보에 접근한다.
음악이 실행된 시간을 계산한다. (calTime이라는 함수를 정의해서 구했다.)
음악의 악보 정보를 convert를 이용해 내가 원하는 문자열로 치환한다.(이전에 내가 들은 멜로디를 치환하듯이)
음악의 실행시간 동안 흘러나오는 멜로디 악보 문자열을 만든다. (문제의 조건을 잘봐야함)
다른 경우는 상관없지만, 조건을 만족하는 음악이 여러개일 경우
1. 재생시간이 가장 긴 순서만약 조건을 만족하는 음악들의 재생시간이 모두 같다면,
2. 음악이 재생된 순서
를 우선으로 반환해야한다. (조건 만족하지않으면 None리턴)
def solution(m,musicinfos):
m = convert(m)
matchList = list()
for info in musicinfos:
start , end, name, akbo = info.split(",")
playTime = calTime(start,end)
akbo = (convert(akbo))
akbo = ''.join((list(map(''.join,[akbo[i % len(akbo)] for i in range(playTime)]))))
if m in akbo:
matchList.append([name, len(akbo)])
print(matchList)
if len(matchList) == 0:
return "(None)"
elif len(matchList) == 1:
return matchList[0][0]
else:
return sorted(matchList,key=lambda x:-x[1])[0][0]
def calTime(start,end):
start = list(map(int,start.split(":")))
end = list(map(int,end.split(":")))
return ((end[0] - start[0]) * 60) + (end[1] - start[1])
def convert(s):
s = ''.join(s)
return s.replace("C#","c").replace("D#","d").replace("E#","e").replace("F#","f").replace("G#","g").replace("A#","a")