알고리즘/PROGRAMMERS (Python)

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

Heeto 2023. 4. 21. 10:51
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17683
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드


def convertor(time):
    hour,minute = time.split(':')
    return 60*int(hour)+int(minute)

def removeShop(s):
    ns = s.replace("C#",'c').replace("D#",'d').replace('F#','f').replace('G#','g').replace('A#','a')
    return ns

def solution(m, musicinfos):
    answer = []
    m = removeShop(m)
    for i,x in enumerate(musicinfos):
        start,end,name,music = x.split(',')
        music = removeShop(music)
        playTime = convertor(end) - convertor(start)
        origin = music*(playTime // L)+music[:(playTime % L)] if playTime > (L:=len(music)) else music[:playTime]
        if m in origin:
            answer.append((-playTime,i,name))
    return sorted(answer)[0][2] if answer else "(None)"

풀이


최근 카카오 기출 문제들을 해결하면서 '문자열로 이루어진 시간'에 대해 많이 다뤄보게 되었다.

'날짜:시간:분' 형태로 주어지기도 하고 이 문제처럼 '시간:분' 형태로 주어지기도 하는데 이런 시간을 다루는 문제에서는 가장 작은 형태로 변환하면 편하다. 보통 다른 시간과 비교하기 위해서 사용하기 때문에 모두 '분'으로 바꿔서 차이를 계산하면 날짜가 넘어가거나 시간이 바뀌는 등 예외상황을 고려하지 않아도 된다.

 

또 이번 문제에서 핵심이 한 가지 더 있다. 바로 'C#','D#'과 같은 샾이 존재한다는 것이다.

우리가 눈으로 볼 때는 C#과 D#을 구분할 수 있지만 컴퓨터는 C,#,D,#으로 다르게 구분한다. 따라서 이러한 구분을 없애기 위해서 C#과 같이 샾이 붙는 음을 다른 하나의 문자로 치환해주어야 한다. 

 

3번 예제를 보면, "ABC"가 포함된 문자열을 찾아야 하는데 "HELLO" 의 반복된 악보 정보에는 "ABC#"이 포함된다. 이 때에는 C와 C#은 다르기 때문에 무시해주어야 하는데 이 과정이 생각보다 복잡하고 어렵다. 따라서 C#을 c처럼 다른 하나의 문자로 치환해주면 다른 기준을 고려할 필요없이 해결이 가능했다.