출처: 프로그래머스 코딩 테스트 연습, [프로그래머스] [3차] 방금그곡
내가 진짜 문제를 잘 안읽는다 것을 느꼈다. C, C#
은 서로 다른 크기의 문자열은데 모두 1로 두고 구하고 있었다.
처음에 #
인 경우는 스킵하며 음이 같은지 확인하는 방법을 사용했는데 너무 복잡해지고 인덱싱을 하기 쉽지 않았다. 그래서 C
를 C#
와 크기를 맞추어 문자열이 같은지 비교하기 쉽게하였다.
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)'
문제를 꼼꼼히 읽고 어떻게 풀지 처음에 설계를 하고 풀자~~~!!!!!!!