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

yunu·2022년 3월 28일
0
post-thumbnail

출처: 프로그래머스 코딩 테스트 연습, [프로그래머스] [3차] 방금그곡

새로 알게된 것들

내가 진짜 문제를 잘 안읽는다 것을 느꼈다. C, C#은 서로 다른 크기의 문자열은데 모두 1로 두고 구하고 있었다.

풀이

처음에 #인 경우는 스킵하며 음이 같은지 확인하는 방법을 사용했는데 너무 복잡해지고 인덱싱을 하기 쉽지 않았다. 그래서 CC#와 크기를 맞추어 문자열이 같은지 비교하기 쉽게하였다.
1. 시간을 정수로 바꾸는 메서드를 만든다.
2. 시간크기 순서대로 정렬하는 key메서드를 만든다.
3. 모든 음 사이에 0을 넣고 0##으로 교체하고 #0#으로 교체하여 #이 없는 음뒤에 모두 0을 넣어주었다.
4. 시간의 길이에 따라 멜로디의 크기를 몫과 나머지를 이용해서 구해준다.
5. in을 이용해서 손쉽게 멜로디 안에 내 멜로디가 포함되는지 확인한다. 리스트의 원소같은 경우만 in이 사용되는 줄 알았지만 문자열 안에 특정 문자열이 있는지 확인할 때도 사용할 수 있다는 것을 배웠다.

코드

def solution(m, musicinfos):
    
    def strToMin(str):
        str_h, str_m = str.split(':')
        return int(str_h) * 60 + int(str_m)
    
    def sort_func(value):
        start, end, *other = value.split(',')
        return strToMin(start) - strToMin(end)
    
    def my_melody(melody):
        melody = '0'.join(list(melody)).replace('0#', '#').replace('#0', '#')
        return melody

    for musicinfo in sorted(musicinfos, key=sort_func):
        start, end, name, melody = musicinfo.split(',')
        time = strToMin(end) - strToMin(start)
        
        melody = my_melody(melody)
        length = len(melody) // 2
        
        if length >= time:
            melody = melody[:2 * time]
        else:
            a, b = time // length, time % length
            melody = melody * a + melody[:2 * b]
            
        new_m = my_melody(m)
        if new_m in melody:
            return name
    
    return '(None)'

느낀점

문제를 꼼꼼히 읽고 어떻게 풀지 처음에 설계를 하고 풀자~~~!!!!!!!

profile
rip

0개의 댓글