문제
https://school.programmers.co.kr/learn/courses/30/lessons/17683
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
내 풀이
문제를 있는 그대로 구현하려고 노력하였다.
처음에 'C#'을 'c'로 바꿀 생각은 못하였는데, 이 아이디어는 다른 사람들의 풀이에서 가져왔다.
split_melody 함수를 만들어 'C#ABD#'일 경우 'cABd'로 바꾸어주는 작업을 하도록 하였다.
그리고 musicinfos를 돌면서 음악 재생 시간, 재생된 전체 멜로디를 구하였다.
만약 m이 새로 만들어진 전체 멜로디 안에 있다면 answer_list에 재생 시간과 음악 제목을 튜플 형태로 넣었다.
answer_list를 재생 시간 기준으로 정렬한 후 제일 앞에 있는 음악 제목을 반환하도록 하였다.
def solution(m, musicinfos):
dic = {'C#': 'c', 'D#': 'd', 'F#': 'f', 'G#': 'g', 'A#': 'a', 'B#': 'b'}
def split_melody(music):
music_list = []
for mu in music:
if mu == '#':
music_list[-1] += mu
else:
music_list.append(mu)
music_list = [x if x not in dic else dic[x] for x in music_list]
return music_list
m_list = split_melody(m)
answer_list = []
for info in musicinfos:
start, end, name, music = info.split(',')
start, end = start.split(':'), end.split(':')
length = 0
length = (int(end[0]) - int(start[0])) * 60 + (int(end[1]) - int(start[1]))
music_list = split_melody(music)
if length > len(music_list):
music_list = music_list * (length // len(music_list)) + music_list[: (length % len(music_list))]
else:
music_list = music_list[:length]
if ''.join(m_list) in ''.join(music_list):
answer_list.append((length, name))
answer_list.sort(key = lambda x : -x[0])
if not answer_list:
return '(None)'
return answer_list[0][1]
다른 짧은 풀이가 있었는데, 마음에 들지 않아서 따로 첨부하지는 않았다. (트릭을 쓴 것 같은 느낌...?)
총평
신박한 아이디어 하나가 문제 풀이의 quality를 결정하는 것 같다.
'알고리즘 > 카카오 EASY' 카테고리의 다른 글
n진수 게임 (Level 2) (0) | 2022.07.26 |
---|---|
파일명 정렬 (Level 2) (0) | 2022.07.25 |
압축 (Level 2) (0) | 2022.07.25 |
다트 게임 (Level 1) (0) | 2022.07.11 |
비밀지도 (Level 1) (0) | 2022.07.11 |