[프로그래머스] 방금그곡 - python 본문

코테 문제 풀이

[프로그래머스] 방금그곡 - python

미니모아 2022. 4. 20. 22:29
반응형

방금그곡

문제

네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가정을 할 때 네오가 찾으려는 음악의 제목을 구하여라.

  • 방금그곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.
  • 네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.
  • 각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.
  • 음악이 00:00를 넘겨서까지 재생되는 일은 없다.
  • 조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.
  • 조건이 일치하는 음악이 없을 때에는 “(None)”을 반환한다.

조건과 일치하는 음악 제목을 출력해라

제한사항

  • 캐시 크기(cacheSize)와 도시이름 배열(cities)을 입력받는다.
  • cacheSize는 정수이며, 범위는 0 ≦ cacheSize ≦ 30 이다.
  • cities는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다.
  • 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다. 도시 이름은 최대 20자로 이루어져 있다.
  • 입력된 도시이름 배열을 순서대로 처리할 때, "총 실행시간"을 출력한다.

조건

  • 입력으로 네오가 기억한 멜로디를 담은 문자열 m과 방송된 곡의 정보를 담고 있는 배열 musicinfos가 주어진다.
    • m은 음 1개 이상 1439개 이하로 구성되어 있다.
    • musicinfos는 100개 이하의 곡 정보를 담고 있는 배열로, 각각의 곡 정보는 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보가 ','로 구분된 문자열이다.
      • 음악의 시작 시각과 끝난 시각은 24시간 HH:MM 형식이다.
      • 음악 제목은 ',' 이외의 출력 가능한 문자로 표현된 길이 1 이상 64 이하의 문자열이다.
      • 악보 정보는 음 1개 이상 1439개 이하로 구성되어 있다.

풀이

시간을 계산해서 몫 * 원본 + 원본[:나머지] 만큼 이어 붙인다. #붙은 두 글자는 다른 한 글자로 대체하면 편할 것 같아서 숫자로 대체했다.

0: A#

1: C#

2: D#

3: F#

4: G #

 

생각 못했던 예외 케이스는 끝나는 시간의 분이 00일 때였다.

12: 59 , 13:00 일 때 차이는 1이어야 했다. 그래서 start_time과 end_time를 각각 구해서 빼줬다.

import re
​
def replace_shap(m): # 샵 붙은 음 바꾸기
    shap = ['A#', 'B#', 'C#', 'D#', 'F#', 'G#']
    for i in range(len(shap)):
        m = re.sub(shap[i], str(i), m)
    return m
def solution(m, musicinfos):
    answer = []
    m = replace_shap(m)
    
    for i, info in enumerate(musicinfos):
        start, end, title, melody = info.split(",")
        melody = replace_shap(melody)# 샵 붙은 음 바꾸기
        h1, m1 = start.split(":")
        h2, m2 = end.split(":")
            
        start_time = int(h1) * 60 + int(m1)
        end_time = int(h2) * 60 + int(m2)
        
        period = end_time - start_time
        melody = melody * (period // len(melody)) + melody[:period % len(melody)]
        
        if m in melody:
            answer.append((period, i, title))
    if answer: # 재생 길이 내림차순, 인덱스 오름차순으로 정렬
        return sorted(answer, key=lambda x:(-x[0], x[1]))[0][2]
    return "(None)"

 

반응형
Comments