[Python] 프로그래머스 - 방금그곡
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/17683
2018 카카오 블라인드 코딩테스트 문제이다. 문제 지문이 길어서 문제 이해하는데도 오래걸렸고
문자열 처리가 꽤 까다로웠다.
# 테스트케이스 2개가 자꾸 틀려서 꽤 시간을 잡아먹었는데, 알고보니 20~24줄 재생시간 구하는 알고리즘
때문이었다.
# change함수처럼 #붙은 음들을 어떻게 처리해야하는지 아이디어와 실제로 구현하는 데도 시간이
많이 소요되었다.
def solution(m, musicinfos):
# 악보에 있는 음과 기억한 멜로디에 있는 #붙은 음들을 소문자로 replace해준다.
def change(txt):
dic = {"C#": 'c', "D#": 'd', "E#": 'e', "F#": 'f', "G#": 'g', "A#": 'a'}
for i in dic:
if i in txt:
a = txt.replace(i, dic[i])
txt = a
return txt
music = {}
answer = []
for i in musicinfos:
# musicinfos에 있는 곡 정보를 ,단위로 split해준다.
# info에는 ['03:00', '03:10', 'FOO', 'CCB#CCB'] 이런식으로 들어가게 된다.
info = i.split(",")
# sound에 악보정보에 change함수를 적용한 것을 넣어준다.
sound = change(info[3])
# 재생시간 구하는 알고리즘
hour = 1 * (int(info[1].split(':')[0]) - int(info[0].split(':')[0]))
if hour == 0:
time = int(info[1].split(':')[1]) - int(info[0].split(':')[1])
else:
time = 60 * hour + int(info[1].split(':')[1]) - int(info[0].split(':')[1])
# 재생시간을 sound길이로 나눈 몫과 나머지를 구한 뒤 몫만큼 sound를 곱하고 남은 나머지시간만큼 sound[:r]을 더해준다.
# music[곡 제목] = [재생된 음, 재생시간]
q, r = divmod(time, len(sound))
music[info[2]] = [sound * q + sound[:r], time]
# 찾고자 하는 멜로디인 m에 change 함수를 적용해 #붙은 음들을 소문자로 바꿔준다.
change_m = change(m)
for i in music:
# 찾고자하는 멜로디가 music[i][0](재생된 음)에 존재한다면 answer에 [곡 제목, 재생시간]을 append해준다.
if change_m in music[i][0]:
answer.append([i, music[i][1]])
# "조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다.
# 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다." 조건에 따라 재생시간이 긴 순서대로 정렬한다.
answer.sort(key = lambda x: -x[1])
# answer이 존재하면 answer의 제목을 출력하고 answer이 비어있으면 (None) 출력
if answer:
return answer[0][0]
else:
return '(None)'
(프로그래머스 level: 2)
728x90
반응형
'문제풀이 > Programmers' 카테고리의 다른 글
[Python] 프로그래머스 - 파일명 정렬 (0) | 2021.05.22 |
---|---|
[Python] 프로그래머스 - 압축 (0) | 2021.05.21 |
[Python] 프로그래머스 - 영어 끝말잇기 (0) | 2021.05.16 |
[Python] 프로그래머스 - 예상 대진표 (0) | 2021.05.16 |
[Python] 프로그래머스 - 괄호 회전하기 (0) | 2021.05.15 |
TAGS.