알고리즘/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처럼 다른 하나의 문자로 치환해주면 다른 기준을 고려할 필요없이 해결이 가능했다.