관리 메뉴

커리까지

[프로그래머스] 2018 카카오 블라인드 3차 방금그곡 파이썬 본문

알고리즘/풀이

[프로그래머스] 2018 카카오 블라인드 3차 방금그곡 파이썬

목표는 커리 2021. 5. 17. 22:21
728x90
SMALL

입출력 예시

m musicinfos answer
"ABCDEFG" ["12:00,12:14,HELLO,CDEFGAB", "13:00,13:05,WORLD,ABCDEF"] "HELLO"
"CC#BCC#BCC#BCC#B" ["03:00,03:30,FOO,CC#B", "04:00,04:08,BAR,CC#BCC#BCC#B"] "FOO"
"ABC" ["12:00,12:14,HELLO,C#DEFGAB", "13:00,13:05,WORLD,ABCDEF"] "WORLD"

설명

첫 번째 예시에서 HELLO는 길이가 7분이지만 12:00부터 12:14까지 재생되었으므로 실제로 CDEFGABCDEFGAB로 재생되었고, 이 중에 기억한 멜로디인 ABCDEFG가 들어있다.
세 번째 예시에서 HELLO는 C#DEFGABC#DEFGAB로, WORLD는 ABCDE로 재생되었다. HELLO 안에 있는 ABC#은 기억한 멜로디인 ABC와 일치하지 않고, WORLD 안에 있는 ABC가 기억한 멜로디와 일치한다.

제출답안

import datetime


def play_time(infomation):
    end_time = datetime.datetime.strptime(infomation[1], '%H:%M')
    start_time = datetime.datetime.strptime(infomation[0], '%H:%M')
    play_hour = str(end_time - start_time).split(':')
    replay_time = int(play_hour[0]) * 60 + int(play_hour[1])
    return replay_time


def vs(song, timeleng):
    if timeleng <= len(song):
        song = song[:timeleng]
    else:
        multi, plus = divmod(timeleng, len(song))
        song = song * multi + song[:plus]
    return song


def solution(m, musicinfos):
    before = []
    answer = []
    ma = -1
    m = m.replace('C#', 'c').replace('D#', 'd').replace('F#', 'f').replace('G#', 'g').replace('A#', 'a').replace("E#",
                                                                                                                 'e')
    for i in musicinfos:
        infomation = i.split(',')
        replay_time = play_time(infomation)
        play_song = infomation[3].replace('C#', 'c').replace('D#', 'd').replace('F#', 'f').replace('G#', 'g').replace(
            'A#', 'a').replace("E#", 'e')
        code = vs(play_song, replay_time)
        before.append([replay_time, infomation[2], code])

    for i in before:
        if m in i[2]:
            ma = max(ma, i[0])
            answer.append(i)

    if len(answer) == 0:
        return '(None)'
    else:
        for i in range(len(answer)):
            if ma == answer[i][0]:
                return answer[i][1]
  1. 우선 시간을 구해야 했기 때문에 datetime을 써서 시작시간과 끝시간의 차이를 구하고 분은 그대로 가져가고 시간은 시간 * 60해서 분으로 만들어서 분을 반환하는 함수를 만들었다.
  2. 그 다음에는 재생시간과 음악의 길이를 구해야했기 때문에 그것을 실행하는 함수를 만들었다.
    1. 악보정보와 재생 시간을 비교하여 다른 song을 저장했다. 악보정보가 짧으면 위에서 구했던 분으로 몫과 나머지를 구해서 음악정보를 완성했다.
  3. #이 들어간 계이름들은 #을 없애주었다.
    1. 그리고 문자열을 ,로 파싱해서 각각의 정보로 나누었고 위에서 만들었던 함수에 대입하여 값을 반환하였다.
    2. 리스트에 필요한 정보만 담았다.
    3. m이 음악정보에 있으면서 문제 조건에 있는 재생 시간이 가장 긴 것들만 추려서 다시 리스트에 담았다.
    4. 만약 answer에 값이 없으면 none를 값이 있을때 재생시간이 최댓값과 같으면서 제일 처음에 들어온 노래를 출력한다.
728x90
LIST
Comments