[2018 카카오 블라인드] 방금그곡 파이썬 문제풀이

sewonK·2022년 1월 31일
1

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/17683

문제 설명

악보(music)시작한 시각부터 끝난 시각까지 반복 재생될 때 기억한 멜로디(m)악보(music)을 비교하며 네오가 찾는 음악의 제목을 구하는 문제이다.

멜로디와 악보에 사용되는 음에는 #이 붙은 음도 있으므로, 단순한 문자열 비교로는 문제가 풀리지 않는다.

#이 붙은 음과 붙지 않는 음을 비교하기 위해, add_zero 메서드로 #이 붙지 않는 음에는 0을 붙이도록 설정하였다.
(ex) ABC -> A0B0C0, ABC# -> A0B0C#

get_play_time 메서드를 통해 총 재생시간을 구한 뒤, get_entire_music 메서드로 재생 시간만큼 재생된 전체 악보 문자열을 구하였다. 전체 악보 문자열에서 내가 찾는 m이 있는지(if m in entire_music) 확인하면 되는 문제이다.

주의할 점은 "조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다."라는 제약 조건이 있다는 것이다.

먼저 입력된 순서대로 처리하고 있으므로, 재생된 시간이 제일 긴 음악인지만(max_play_time < play_time) 확인하는 로직을 넣으면 된다.

풀이 코드

def add_zero(music):
    result = ''
    idx = 0
    while(idx < len(music)):
        result += music[idx]
        if music[(idx+1) % len(music)] == '#':
            result += '#'
            idx +=1
        else:
            result += '0'      
        idx += 1
    return result          

def get_play_time(start, end):
    start_hh, start_mm = map(int, start.split(":"))
    end_hh, end_mm = map(int, end.split(":"))
    return (end_hh - start_hh) * 60 + end_mm - start_mm
        
def get_entire_music(music, play_time):
    return music*((play_time*2) // len(music)) + music[:(play_time*2) % len(music)]

def solution(m, musicinfos):
    answer = '(None)'
    max_play_time = -1    
    m = add_zero(m)
    for musicinfo in musicinfos:
        start, end, title, music = musicinfo.split(",")
        music = add_zero(music)        
        play_time = get_play_time(start, end)
        entire_music = get_entire_music(music, play_time)        
        if (m in entire_music) and (max_play_time < play_time):
            max_play_time = play_time
            answer = title
    return answer
정확성  테스트
테스트 1 〉	통과 (0.03ms, 10.4MB)
테스트 2 〉	통과 (0.03ms, 10.4MB)
테스트 3 〉	통과 (0.03ms, 10.4MB)
테스트 4 〉	통과 (0.03ms, 10.5MB)
테스트 5 〉	통과 (0.03ms, 10.4MB)
테스트 6 〉	통과 (0.03ms, 10.4MB)
테스트 7 〉	통과 (0.10ms, 10.4MB)
테스트 8 〉	통과 (0.12ms, 10.4MB)
테스트 9 〉	통과 (0.11ms, 10.4MB)
테스트 10 〉	통과 (0.29ms, 10.5MB)
테스트 11 〉	통과 (0.10ms, 10.4MB)
테스트 12 〉	통과 (0.11ms, 10.4MB)
테스트 13 〉	통과 (0.11ms, 10.4MB)
테스트 14 〉	통과 (0.12ms, 10.5MB)
테스트 15 〉	통과 (0.11ms, 10.5MB)
테스트 16 〉	통과 (0.11ms, 10.4MB)
테스트 17 〉	통과 (0.10ms, 10.4MB)
테스트 18 〉	통과 (0.12ms, 10.5MB)
테스트 19 〉	통과 (0.58ms, 10.4MB)
테스트 20 〉	통과 (0.11ms, 10.4MB)
테스트 21 〉	통과 (0.11ms, 10.4MB)
테스트 22 〉	통과 (0.11ms, 10.4MB)
테스트 23 〉	통과 (0.11ms, 10.5MB)
테스트 24 〉	통과 (0.11ms, 10.5MB)
테스트 25 〉	통과 (0.04ms, 10.5MB)
테스트 26 〉	통과 (0.03ms, 10.4MB)
테스트 27 〉	통과 (0.05ms, 10.5MB)
테스트 28 〉	통과 (0.04ms, 10.4MB)
테스트 29 〉	통과 (8.47ms, 10.5MB)
테스트 30 〉	통과 (7.97ms, 10.5MB)

1개의 댓글

comment-user-thumbnail
2022년 2월 1일

오 #이 없는거에 0을 추가하셨군요,,
저걸 보니 #이 있는 부분을 소문자로 바꾸는 방식도 가능하겠네요! (C# -> c)
배워갑니다,,

답글 달기