문제풀이/프로그래머스
방금 그곡(카카오) 문제풀이
soo-dal
2024. 3. 28. 22:54
문제
https://school.programmers.co.kr/learn/courses/30/lessons/17683
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 접근 방식
노래 정보들이 주어지며 찾고자 하는 멜로디가 포함된 노래를 찾는 구현 문제이다. 문제에서 처리해야할 사항들을 정리하면 아래와 같다.
1. 주어지는 멜로디를 어떻게 처리할 것인가?
>> 멜로디에는 1글자로 되어 있는 'C','D' 등과 2글자로 되어 있는 '~#' 이 존재
>> 멜로디의 개수를 구해야하기 때문에, '#'이 들어간 멜로디는 소문자로 변경
>> eg. 'C#' -> 'c', 'D#' -> 'd'
2. 재생 시간을 통해 1에서 처리한 멜로디를 어떻게 사용할 것인가?
>> 노래를 반복할 수도 있고, 중간에 끊을 수도 있다
>> 스트리밍 시간을 구하고, 노래시간을 나눠서 몫, 나머지를 활용한다
>> 몫 = 노래 반복횟수 / 나머지 = 처음에서 중간까지
>> eg. 스트리밍 시간 = 18분, 노래시간 = 7분인 경우 > 몫=2, 나머지=4
>> 즉, 2번 반복하고 0~4분까지 재생 후 종료
시간 복잡도
musicinfo의 개수 만큼 for문을 순회하며, 내부에서 멜로디 문자열을 변환하는 과정에서도 for문이 수행된다. musicinfo의 최대개수는 100개, 멜로디의 문자열 개수는 1439개 이므로 시간 내에 동작한다.
코드
## 멜로디 '#'이 붙는 것들을 소문자로 변경한다
def transform(m):
size=len(m)
ret=""
for i in range(size):
if i+2<=size and m[i:i+2]=="C#":
ret+='c'
elif i+2<=size and m[i:i+2]=="D#":
ret+='d'
elif i+2<=size and m[i:i+2]=="F#":
ret+='f'
elif i+2<=size and m[i:i+2]=="G#":
ret+='g'
elif i+2<=size and m[i:i+2]=="A#":
ret+='a'
elif m[i]!="#":
ret+=m[i]
return ret
def solution(m, musicinfos):
m=transform(m)
answer = "(None)"
max_v=0
for music in musicinfos:
## 스트리밍할 시간을 구한다
start,end,name,melody=music.split(",")
end_h,end_m=map(int,end.split(":"))
start_h,start_m=map(int,start.split(":"))
gap=(end_h*60+end_m)-(start_h*60+start_m)
#멜로디 철자를 변환 후 총 재생되는 멜로디를 구한다
melody=transform(melody)
melody_size=len(melody)
repeat=gap//melody_size
remain=gap%melody_size
streaming=melody*repeat+melody[:remain]
## 찾고자 하는 멜로디가 존재하고 길이가 크다면 값을 갱신한다
if m in streaming and len(streaming)>max_v:
answer=name
max_v=len(streaming)
return answer