개발조아

[프로그래머스] 방금그곡 파이썬 본문

알고리즘/프로그래머스

[프로그래머스] 방금그곡 파이썬

개발조아 2021. 10. 2. 00:36
728x90

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17683

 

코딩테스트 연습 - [3차] 방금그곡

방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,

programmers.co.kr

 

구현문제이다. 문자열 처리만 잘 해준다면 크게 어렵지 않다.

 

악보나 기억한 멜로디를 전처리를 해주어야한다.

C,C# 이처럼 #이 붙은 문자열을 처리해줘야한다.

왜냐면 기억한 멜로디가 CC 이고 악보가 CC#이라면 판별하기 까다롭기 때문에 다 다른 문자로 바꿔주자.

나는 그냥 모든 음 다른 문자열로 매칭시켜줬다.

주의할 점은 문제에 사용되는 음에 E#이 빠져있다. 이것을 추가해줘야한다.

이부분을 확인 못해서 테케 27번에서 틀렸는데 질문하기를 보고 알았다.

 

그리고 시작시간, 끝시간을 가지고 총 재생시간을 구하자.

둘다 분으로 바꿔서 끝시간에서 시작시간을 빼주면 된다.

 

이제 전체 재생시간 동안의 악보를 구하자.

악보보다 재생시간이 길면 처음부터 다시 반복한다고 했다.

따라서 전체 재생시간을 악보 길이도 나눠주자.

이때 몫 만큼 악보를 반복해주고 나머지 길이 만큼 악보에서 짤라서 이어주자.

 

이제 전체 재생시간 동안의 악보를 구했다.

이제 기억하고 있는 멜로디가 악보의 포함되어 있는지 검사하자.

파이썬은 그냥 in 을 사용하면 쉽게 할 수 있다.

 

마지막으로 정답이 여러개인 경우를 확인 해주자. 그래서 나는 answer_total이라는 변수를 사용했다.

해당 시간은 정답을 찾았을 때의 재생시간을 기록한 것이다.

그래서 정답인 경우 해당 시간보다 큰 경우 값을 갱신해줬다.

 

def solution(m, musicinfos):
    answer = ''
    answer_total = 0
    m = melody_to_string(m)
    for info in musicinfos:
        start,end,title,board = info.split(',')

        total = calc_total_time(start,end)

        melody = melody_to_string(board)
        
        a = total//len(melody)
        b = total%len(melody)
        
        melody = melody*a+melody[:b]
        if m in melody:
            if answer_total < total:
                answer = title
                answer_total = total
    return answer if answer else '(None)'

def melody_to_string(board):
    converter = {
        'C':'a','C#':'b','D':'c','D#':'d','E':'e','F':'f','F#':'g','G':'h','G#':'i','A':'j','A#':'k','B':'l','E#':'m'
    }
    
    melody = ''
    idx = 0
    while idx < len(board):
        if idx+1 < len(board) and board[idx+1] == '#':
            melody += converter[board[idx]+'#']
            idx += 2
        else:
            melody += converter[board[idx]]
            idx += 1
    return melody

def calc_total_time(start,end):
    sm = 60*int(start[:2])+int(start[3:])
    em = 60*int(end[:2])+int(end[3:])
    return em-sm
Comments