문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/17683
- musicinfos에 노래의 재생 시작 시간, 종료 시간, 제목, 음악의 멜로디가 문자열로 주어진다. ("03:00,03:30,FOO,CC#B" 형식)
- 시간은 00:00에서 23:59까지이며 멜로디의 음에는 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 가 포함된다.
- musicinfos에 있는 재생된 음악 중에 네오가 기억한 멜로디 m이 포함이 되어있는지 확인하고, 여러 개라면 재생시간이 제일 긴 음악 제목을 반환, 재생된 시간이 같다면 먼저 입력된 음악 제목을 반환한다.
- musicinfos에 멜로디 m이 포함된 재생음악이 없다면 (None)을 반환한다.
접근
- 지난번 개인정보수집유효기간 문제에서 날짜를 계산해줄 때 크게 데였기 때문에, 가장 먼저 재생 시간을 작은 단위인 분으로 바꿔 계산해줘야겠다고 생각했다.
- 그 뒤에 네오가 기억한 멜로디가, 노래의 길이보다 길다면 재생시간만큼 노래를 이어붙여주고, 짧다면 멜로디만큼 노래 길이를 잘라주었다.
- 2번에서 만들어진 노래에 네오가 기억한 멜로디가 있는지 확인하고 있다면 후보 배열에 추가했다.
- 마지막으로 후보가 여러 개라면 정렬을 해서 조건에 맞는 값을 반환하고, 하나일 때는 그대로 반환, 없다면 (None)을 반환했다.
틀림
하지만.. 음에 #이 있다는 것을 간과해서 틀렸다.
문자열로는 #이 포함된 음을 구분짓기 어렵기 때문에 음 단위로 쪼개 배열로 만들어주었다.
배열로 만들다보니 노래에 네오가 기억한 멜로디를 찾을 때, m in play
라는 연산자를 쓸 수 없게 되었다.(문자열만 가능)
이를 해결하기 위해 for문을 돌리면서 play의 특정구간이 memory 배열과 일치하는지 일일이 비교하고, 일치한다면 추후 반환값 선별을 위해 재생시간과 입력순서, 제목을 tmp 배열에 넣어주었다.
코드
def solution(m, musicinfos):
answer = ""
tmp = []
cnt = 0
for info in musicinfos:
arr = info.split(",")
# 시간 계산 -> 분
srt_time = list(map(int, arr[0].split(":")))
end_time = list(map(int, arr[1].split(":")))
time = (end_time[0] * 60 + end_time[1]) - (srt_time[0] * 60 + srt_time[1])
# 악보를 배열로 옮기기
music = []
for i in arr[3]:
if i == "#":
music[-1] += "#"
continue
music.append(i)
# m을 배열로 옮기기
memory = []
for i in m:
if i == "#":
memory[-1] += "#"
continue
memory.append(i)
# 재생된 음 구하기
music_len = len(music)
if time > music_len:
play = music * (time // music_len) + music[0 : time % music_len]
elif time < music_len:
play = music[0:time]
else:
play = music
# m이 재생되는 악보에 포함된다면 후보에 추가
play_len = len(play)
m_len = len(memory)
for i in range(play_len - m_len + 1):
if memory == play[i : i + m_len]:
tmp.append((time, cnt, arr[2]))
break
cnt += 1
if len(tmp) > 1:
tmp.sort(key=lambda x: (-x[0], x[1]))
return tmp[0][2]
elif len(tmp) == 1:
return tmp[0][2]
else:
return "(None)"
회고
처음부터 문제 제대로 파악하기.
'코테 준비' 카테고리의 다른 글
[프로그래머스] 호텔 대실 (0) | 2024.04.04 |
---|---|
[프로그래머스] 멀짱한 사각형 (0) | 2024.03.29 |
[프로그래머스] 큰 수 만들기 (js) (1) | 2024.03.28 |
[프로그래머스] 숫자 블록 (python) (0) | 2024.03.22 |
[프로그래머스] 조이스틱(python) (0) | 2024.03.22 |