https://programmers.co.kr/learn/courses/30/lessons/17683
코딩테스트 연습 - [3차] 방금그곡
방금그곡 라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 '방금그곡' 서비스를 이용하곤 한다. 방금그곡에서는 TV,
programmers.co.kr
일단 처음에 무식하게 구현했다. 효율생각 하나도 안 하고.
문자열을 다루는것을 최우선으로 그렇게 무식하게.... 그리고 풀었는데
리스트 인덱스를 딱 1개 초과하는 탐색이 있는 코드가 나왔다.
수정전에 시간초과가 뜰거같다고 생각해서 일단 돌렸는데
성공, 런타임에러가 뜨는경우, 그리고 많은 시간초과가 나왔다(런타임애러는 이미 나올지 알고있었다)
그 코드는 맨 아래 기재해놓겠다 ㅋㅋ.....
그래서 자료구조나 기타 알고리즘을 사용한 좀 더 효율적인 코드를 생각했다.
#을 다루기가 어렵다. 그래서 문자열에 쓰는 replace함수를 통해 C#같은 것들을 한개의 문자로 치환해주었다.
또 딕셔너리의 key값에 전체 노래가사를 넣는다. val에는 제목을 넣는다
딕셔너리의 key값은 .keys( ) 메서드를 이용해서 문자열형태로 뺄 수 있고
이를 통해 if "찾고자 하는 문자열" in dic.key( )
조건문으로 찾을 수 있다. 저건 문자열 안에 타겟문자열을 "포함"만 하고 있어도 True를 반환한다.
두번째로 푼 코드(맞은 코드)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
def solution(m, musicinfos):
answer = '(None)'
# 샾을 다루기 어렵기때문에 한 문자로 대체해줌
m = m.replace("C#", "H")
m = m.replace("D#", "I")
m = m.replace("F#", "J")
m = m.replace("G#", "K")
m = m.replace("A#", "L")
dic = {}
for mu in musicinfos:
start, end, title, song = mu.split(",")
song = song.replace("C#", "H")
song = song.replace("D#", "I")
song = song.replace("F#", "J")
song = song.replace("G#", "K")
song = song.replace("A#", "L")
hour1, min1 = start.split(":")
hour2, min2 = end.split(":")
mu_time = (int(hour2) - int(hour1)) * 60 + int(min2) - int(min1)
song = song * (mu_time // len(song)) + song[0:(mu_time % len(song))]
dic[song] = title
for song in dic.keys():
if m in song:
if answer == "(None)":
answer = song
else:
if len(song) > len(answer):
answer = song
if answer != '(None)':
answer = dic[answer]
return answer
|
cs |
맨 처음 무식하게 짠 코드와 그 결과 ㅋㅋ....(틀린코드)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
def solution(m, musicinfos):
# 분, 재생되는 노래 문자열 , 제목 순으로 저장
all_info = []
for i in range(len(musicinfos)):
# 몇 분이나 재생했는지 구해주는 반복문
music = musicinfos[i].split(",")
s_t = music[0].split(":")
f_t = music[1].split(':')
h = (int(f_t[0]) - int(s_t[0])) * 60
minit = int(f_t[1]) - int(s_t[1])
sum_m = h + minit
# 그에따라 어떻게 재생됐는지 구해주는 부분
m_str = music[3]
p_str = ''
idx = 0
num = 0
while 1:
if m_str[idx] == '#':
p_str += m_str[idx]
else:
p_str += m_str[idx]
num += 1
idx += 1
if num == sum_m:
break
if idx > len(m_str) - 1:
idx = 0
all_info.append([sum_m, p_str, music[2]])
result = []
print(all_info)
for a in all_info:
for i in range(len(a[1]) - len(m) + 1):
con = a[1][i:i + len(m)]
if m == con:
if a[1][i + len(m)] != '#':
result.append(a)
break
result = sorted(result, key=lambda x: (-x[0]))
return result[0][2]
|
cs |
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스 LV 2] 점프와 순간 이동 (파이썬/python) (0) | 2021.06.12 |
---|---|
[프로그래머스 LV 2] 이진 변환 반복하기 (파이썬/python) (0) | 2021.06.12 |
[프로그래머스 LV 2] 쿼드압축 후 개수 세기 (파이썬/python) (0) | 2021.06.11 |
[프로그래머스 LV 2] 방문길이 (파이썬/python) (0) | 2021.06.11 |
[프로그래머스 LV 2] 가장 큰 정사각형 찾기 (파이썬/python) (0) | 2021.06.11 |