https://programmers.co.kr/learn/courses/30/lessons/17683
악보(music)가 시작한 시각부터 끝난 시각까지 반복 재생될 때 기억한 멜로디(m)와 악보(music)을 비교하며 네오가 찾는 음악의 제목을 구하는 문제이다.
멜로디와 악보에 사용되는 음에는 #이 붙은 음도 있으므로, 단순한 문자열 비교로는 문제가 풀리지 않는다.
#이 붙은 음과 붙지 않는 음을 비교하기 위해, add_zero 메서드로 #이 붙지 않는 음에는 0을 붙이도록 설정하였다.
(ex) ABC -> A0B0C0, ABC# -> A0B0C#
get_play_time 메서드를 통해 총 재생시간을 구한 뒤, get_entire_music 메서드로 재생 시간만큼 재생된 전체 악보 문자열을 구하였다. 전체 악보 문자열에서 내가 찾는 m이 있는지(if m in entire_music) 확인하면 되는 문제이다.
주의할 점은 "조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다."라는 제약 조건이 있다는 것이다.
먼저 입력된 순서대로 처리하고 있으므로, 재생된 시간이 제일 긴 음악인지만(max_play_time < play_time) 확인하는 로직을 넣으면 된다.
def add_zero(music):
result = ''
idx = 0
while(idx < len(music)):
result += music[idx]
if music[(idx+1) % len(music)] == '#':
result += '#'
idx +=1
else:
result += '0'
idx += 1
return result
def get_play_time(start, end):
start_hh, start_mm = map(int, start.split(":"))
end_hh, end_mm = map(int, end.split(":"))
return (end_hh - start_hh) * 60 + end_mm - start_mm
def get_entire_music(music, play_time):
return music*((play_time*2) // len(music)) + music[:(play_time*2) % len(music)]
def solution(m, musicinfos):
answer = '(None)'
max_play_time = -1
m = add_zero(m)
for musicinfo in musicinfos:
start, end, title, music = musicinfo.split(",")
music = add_zero(music)
play_time = get_play_time(start, end)
entire_music = get_entire_music(music, play_time)
if (m in entire_music) and (max_play_time < play_time):
max_play_time = play_time
answer = title
return answer
정확성 테스트
테스트 1 〉 통과 (0.03ms, 10.4MB)
테스트 2 〉 통과 (0.03ms, 10.4MB)
테스트 3 〉 통과 (0.03ms, 10.4MB)
테스트 4 〉 통과 (0.03ms, 10.5MB)
테스트 5 〉 통과 (0.03ms, 10.4MB)
테스트 6 〉 통과 (0.03ms, 10.4MB)
테스트 7 〉 통과 (0.10ms, 10.4MB)
테스트 8 〉 통과 (0.12ms, 10.4MB)
테스트 9 〉 통과 (0.11ms, 10.4MB)
테스트 10 〉 통과 (0.29ms, 10.5MB)
테스트 11 〉 통과 (0.10ms, 10.4MB)
테스트 12 〉 통과 (0.11ms, 10.4MB)
테스트 13 〉 통과 (0.11ms, 10.4MB)
테스트 14 〉 통과 (0.12ms, 10.5MB)
테스트 15 〉 통과 (0.11ms, 10.5MB)
테스트 16 〉 통과 (0.11ms, 10.4MB)
테스트 17 〉 통과 (0.10ms, 10.4MB)
테스트 18 〉 통과 (0.12ms, 10.5MB)
테스트 19 〉 통과 (0.58ms, 10.4MB)
테스트 20 〉 통과 (0.11ms, 10.4MB)
테스트 21 〉 통과 (0.11ms, 10.4MB)
테스트 22 〉 통과 (0.11ms, 10.4MB)
테스트 23 〉 통과 (0.11ms, 10.5MB)
테스트 24 〉 통과 (0.11ms, 10.5MB)
테스트 25 〉 통과 (0.04ms, 10.5MB)
테스트 26 〉 통과 (0.03ms, 10.4MB)
테스트 27 〉 통과 (0.05ms, 10.5MB)
테스트 28 〉 통과 (0.04ms, 10.4MB)
테스트 29 〉 통과 (8.47ms, 10.5MB)
테스트 30 〉 통과 (7.97ms, 10.5MB)
오 #이 없는거에 0을 추가하셨군요,,
저걸 보니 #이 있는 부분을 소문자로 바꾸는 방식도 가능하겠네요! (C# -> c)
배워갑니다,,