본문 바로가기

PS/프로그래머스

[프로그래머스 LV 2] 방금 그 곡 (파이썬/python)

728x90

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

 

728x90