728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/17683?language=python3
최종 코드
def solution(m, musicinfos):
musics = []
m = m.replace('C#', 'H').replace('D#', 'I').replace('F#', 'J').replace('G#', 'K').replace('A#', 'L')
for info in musicinfos:
info = info.split(",")
info[0] = info[0].split(":")
info[1] = info[1].split(":")
if int(info[1][1]) < int(info[0][1]):
mins = int(info[1][1]) + 60 - int(info[0][1])
hours = int(info[1][0]) - 1 - int(info[0][0])
else:
mins = int(info[1][1]) - int(info[0][1])
hours = int(info[1][0]) - int(info[0][0])
time = mins + hours*60
info[3] = info[3].replace('C#', 'H').replace('D#', 'I').replace('F#', 'J').replace('G#', 'K').replace('A#', 'L')
musics.append([time, len(info[3]), info[2], info[3]])
musics.sort(key = lambda x: -x[0])
for time, length, title, score in musics:
if time < len(m): continue
if time <= len(score):
if m in score[:time]: return title
continue
ptime = max(len(m), time)
music = score * (ptime//len(score)+1)
if m in music: return title
return "(None)"
풀이 과정
풀이 시간 43분
def solution(m, musicinfos):
musics = []
#음 변경 C# -> H, D# -> I, F# -> J, G# -> K, A# -> L
m = m.replace('C#', 'H').replace('D#', 'I').replace('F#', 'J').replace('G#', 'K').replace('A#', 'L')
for info in musicinfos:
#info[0] = 시작 시간, info[1] = 끝난 시간, info[2] = 제목, info[3] = 악보
info = info.split(",")
info[0] = info[0].split(":")
info[1] = info[1].split(":")
#재생 시간 분으로 바꾸기
if int(info[1][1]) < int(info[0][1]):
mins = int(info[1][1]) + 60 - int(info[0][1])
hours = int(info[1][0]) - 1 - int(info[0][0])
else:
mins = int(info[1][1]) - int(info[0][1])
hours = int(info[1][0]) - int(info[0][0])
time = mins + hours*60
#악보 음 변경 C# -> H, D# -> I, F# -> J, G# -> K, A# -> L
info[3] = info[3].replace('C#', 'H').replace('D#', 'I').replace('F#', 'J').replace('G#', 'K').replace('A#', 'L')
musics.append([time, len(info[3]), info[2], info[3]])
#[재생시간(분), 악보 길이, 제목, 악보]
#재생시간을 기준으로 내림차순 정렬
musics.sort(key = lambda x: -x[0])
for time, length, title, score in musics:
#재생시간이 m 시간보다 작은 경우, 방금 그 곡이 아니다
if time < len(m): continue
#악보 길이가 재생시간보다 크거나 같은 경우,
if time <= len(score):
#처음부터 재생시간 동안 재생한 음에 m이 속하면, 방금 그곡이다
if m in score[:time]: return title
continue
#m 시간과 재생시간 중 긴 시간을 ptime으로 지정
ptime = max(len(m), time)
#반복재생한 악보에 m이 속한 경우, 방금 그곡이다
music = score * (ptime//len(score)+1)
if m in music: return title
return "(None)"
#시간복잡도 = O(nlog n), 공간복잡도 = O(n)
참고
- 1. N진수 게임 - 2022.03.30 - [코테 노트/프로그래머스] - Level 2 [3차] n진수 게임 <2018 KAKAO BLIND RECRUITMENT> Python 3
- 3. 파일명 정렬 - https://hwayomingdlog.tistory.com/312
- 5. 자동완성
728x90
반응형
'코테 노트 > 프로그래머스' 카테고리의 다른 글
Level 2 [3차] 파일명 정렬 <2018 KAKAO BLIND RECRUITMENT> Python 3 (0) | 2022.03.29 |
---|---|
Level 2 [3차] 압축 <2018 KAKAO BLIND RECRUITMENT> Python 3 (0) | 2022.03.28 |
Level 3 풍선 터트리기 Python 3 (0) | 2022.03.23 |
Level 3 공 이동 시뮬레이션 Python 3 (0) | 2022.03.22 |
Level 3 110 옮기기 Python 3 (0) | 2022.03.16 |