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

섬섬's 개발일지·2022년 2월 18일
0

프로그래머스

목록 보기
33/50

문제

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

입력형식

입력으로 네오가 기억한 멜로디를 담은 문자열 m과 방송된 곡의 정보를 담고 있는 배열 musicinfos가 주어진다.

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

출력형식

조건과 일치하는 음악 제목을 출력한다.

코드

def solution(m, musicinfos):
    answer = ''
    musicTime = 0
    m = getMelody(m)
    
    musicinfos.sort(key=lambda x: x[0])
    for music in [x.split(',') for x in musicinfos]:
        melody = getMelody(music[3])
        timeDiff = getTime(music[1]) - getTime(music[0])
        melody = melody * (timeDiff // len(melody)) + melody[:(timeDiff % len(melody))]
        
        # 멜로디가 일치하며, 재생된 시간도 긴 경우
        if isMatch(m, melody) and musicTime < timeDiff:
            musicTime = timeDiff
            answer = music[2]
            
    return answer if musicTime > 0 else "(None)"

def getTime(time):
    h, m = map(int, time.split(':'))
    return h * 60 + m

def getMelody(musics):
    result = []
    for music in musics:
        if music == '#':
            result[-1] += '#'
        else:
            result.append(music)
    return result

def isMatch(me, melody):
    a, b = 0, 0
    while True:
        if b == len(melody) or a == len(me):
            break
        
        if me[a] == melody[b]:
            a, b = a+1, b+1
        else:
            if a == 0:
                b += 1
            else:
                a = 0
    
    return a == len(me)
profile
섬나라 개발자

0개의 댓글

관련 채용 정보