알고리즘/카카오기출
[Python] programmers 방금 그곡
정찡이
2022. 2. 11. 15:17
728x90
1. 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/17683
코딩테스트 연습 - [3차] 방금그곡
방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,
programmers.co.kr
2. 문제 요약
- 방금 그 곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.
- 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
- 각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.
- 음악이 00:00을 넘겨서까지 재생되는 일은 없다.
- 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
- 조건이 일치하는 음악이 없을 때에는 “(None)”을 반환한다.

3. 아이디어 정리
- 곡 정보를 가공한다 - 음악이 흐른 시간만큼 곡을 만들어준다.
- #이 들어간 데이터인 경우 소문자로 대체 - 1글자로 만들어서 파악하기 쉽게 하기 위해
- 매칭 되는 것이 있는지 찾기 ⇒ python 문자열 찾기 사용
- 결과 찾기 - 재생된 시간이 제일 긴 음악 제목 > 먼저 입력된 음악 제목 ⇒ 정렬
4. 문제 풀이
4-1. 내 풀이
def solution(m, musicinfos):
"""
:param m: 네오가 기억한 멜로디
:param musicinfos: 곡의 정보가 담긴 배열 - 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보
:return: 조건과 일치하는 음악 제목 출력
"""
def get_minute(str_):
h, m_ = str_.split(':')
return int(h) * 60 + int(m_)
def replace(data):
return data.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f').replace('G#', 'g').replace('A#', 'a')
m = replace(m)
answer = list()
music = list()
# 1. 곡 정보를 가공
for mus in musicinfos:
s, e, n, d = mus.split(',') # 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보
total = get_minute(e) - get_minute(s) # 총 재생 시간
d = replace(d)
if total >= len(d):
data = d * (total // len(d)) + d[:(total % len(d))]
else: # 작은 경우 자르기
data = d[:total]
music.append((n, data)) # 이름, 음악이 흘러간 데이터
# 2. 매칭되는 것이 있는지 찾기
for i, d in enumerate(music):
name, mus = d
if len(m) > len(mus): # 찾는 곡이 더 긴 경우 그만
continue
if mus.find(m) != -1:
answer.append((i, len(mus), name))
# 3. 결과 찾기 - 재생된 시간이 제일 긴 음악 제목 > 먼저 입력된 음악 제목
if answer:
answer.sort(key=lambda x: (-x[1], x[0]))
answer = answer[0][2]
else:
answer = '(None)'
return answer
5. 결론
- 구현 문제
반응형