본문 바로가기

알고리즘/카카오 EASY

방금그곡 (Level 2)

문제

 

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