문제:
풀이방법:
이 문제에서 처리해야 할 것은 크게 두 가지이다. 재생된 시간의 길이에 따라서 음이 달라지므로 시간 형식으로 되어 있는 자료형을 분 단위로 바꿔야 한다. 그리고 음계 중에 C#, D#, F#, G#과 같이 #이 붙어 있는 음계가 있는데 스트링 형식으로 되어 있기 때문에 이들도 하나의 인덱스를 차지하고 있으므로 처리하는 방법에 대해서 생각해야 한다.
우선 분으로 바꾸기 위해서 :를 기준으로 분할을 한다. 시작하는 분과 끝나는 분을 비교해서 음악의 총 재생된 시간을 구하도록 한다.
C#과 같이 #이 달려있는 음들은 하나의 인덱스로 처리를 하는 것이 편하므로 소문자로 변경하도록 한다. (C#->c , D# ->d , ....) 이 작업을 하고 위에서 구한 재생된 시간으로 실제 재생된 멜로디를 구할 수 있고, 이 안에 m이 있는지 판단하여서 answers 리스트에 담도록 한다.
이 때 조건이 일치하는 음악이 여러 개일 경우에는 재생된 시간이 제일 긴 음악, 먼저 입력된 음악 제목 순으로 정렬해야 하므로 (재생된 시간, 입력된 인덱스,음악제목)과 같이 answers에 넣도록 한다.
일치하는 음악을 모두 담았다면 sort의 key를 이용해서 위 조건에 맞게 정렬을 하도록 한다. 재생된 시간은 길수록 앞으로 와야 하므로 음수를 붙여주고, 먼저 입력된 것이 앞으로 와야 하므로 이는 양수로 정렬하도록 한다. 이렇게 정렬을 하고 난 뒤에 answers에 가장 앞에 있는 값의 맨 마지막 값을 출력한다면 그것이 음악제목일 것이다. (만약 answers가 비어 있다면 "(None)"을 출력해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
def change(m,music):
be=["C#","D#","F#","G#","A#"]
af=["c","d","f","g","a"]
for i in range(len(be)):
m=m.replace(be[i],af[i])
music=music.replace(be[i],af[i])
return m,music
def solution(m,musicinfos):
answers=[]
for idx,musicinfo in enumerate(musicinfos):
start,end,title,music = musicinfo.split(',')
startH,startM=map(int,start.split(":"))
endH,endM=map(int,end.split(":"))
if endM-startM < 0:
minute=endM-startM+60
endH-=1
else:
minute=endM-startM
length=(endH-startH)*60+minute
m,music=change(m,music)
p,r=divmod(length,len(music))
melody=music*p+music[:r]
if m in melody:
answers.append((length,idx,title))
if len(answers):
answers.sort(key=lambda x:(-x[0],x[1]))
return answers[0][-1]
else:
return "(None)"
|
cs |
문제링크:
https://programmers.co.kr/learn/courses/30/lessons/17683
'Algorithm > Python' 카테고리의 다른 글
[Programmers]2018 Kakao.파일명 정렬 (0) | 2019.12.03 |
---|---|
[Programmers]2018 Kakao.압축 (0) | 2019.12.02 |
[Programmers]2020 Kakao.괄호 변환 (0) | 2019.11.15 |
[Programmers]2020 Kakao. 문자열 압축 (0) | 2019.11.14 |
[BOJ]2358. 평행선 (0) | 2019.11.13 |