Post

Programmers_2018 KAKAO BLIND RECRUITMENT[3차] 방금그곡(python)

프로그래머스 -방금그곡 문제 입니다.

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/17683#


2. 분류 및 난이도

Programmers 문제입니다.
KAKAO BLIND RECRUITMENT[3차] 문제입니다. Level 2난이도의 문제입니다.


3. 생각한 것들(문제 접근 방법)

  • KMP으로 풀었습니다.
  • ’#’에 대한 처리가 굉장히 힘들었습니다.

4. 접근 방법을 적용한 코드

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#KMP table 만들기
def maketable(m):
    size = len(m)
    li = [0] * size
    j = 0
    for i in range(1,size):
        while j > 0 and m[i] != m[j] : 
            j = li[j-1]
        if m[i] == m[j] :
            j+=1
            li[i] =j
    
    return li

#kmp
def KMP(m,li,table):
    msize = len(m)
    lisize = len(li)
    j = 0
    for i in range(lisize):
        while j > 0 and li[i] != m[j] : 
            j = table[j-1]
        if li[i] == m[j] : 
            if j == msize-1 :
                #마지막인데, 만약 비교대상의 뒤가 #인경우 
                # 즉 패턴은 ABC인데, 비교대상이 ABC#인 경우 업데이트하고 걸러줌. 
                if i+1 <lisize and li[i+1] =="#":
                    j= table[j]    
                else:
                    return True
            else :
                j+=1
    return False
    

# 총 시간을 계산합니다.    
def calcutime(start,end):
    starthour,startmin = start.split(":")
    endhour,endmin = end.split(":")
    hour = int(endhour) - int(starthour)
    mini = int(endmin) - int(startmin)
    return hour*60 + mini
        
def solution(m, musicinfos):

    answer = ""
    anstime = 0
    # m(패턴)에 대한 테이블을 미리 만들어둡니다.
    table = maketable(m)
    for i in range(len(musicinfos)):
        start,end,name,li = musicinfos[i].split(',')
        totaltime = calcutime(start,end)
        #temp는 #을고려해서 문자열을 재배치한 문자열입니다.
        temp= ""
        lisize = len(li)
        idx = 0
        #재배치 과정
        for k in range(totaltime) : 
            temp += li[idx%lisize]
            idx+=1
            if(li[idx%lisize] == "#" ) :
                temp += "#"
                idx+=1
        #print(start,end,name,temp,totaltime)
        #KMP
        if KMP(m,temp,table):
            #만약 들어온 값보다 재생시간이 더 큰값이 들어오면 갱신합니다. 같은 경우는 어차피 이미 들어온값이 작거나 먼저나온 것이므로.. 고려 안합니다.
            if anstime < totaltime : 
                anstime = totaltime
                answer = name
    #None            
    if answer =="":
        return "(None)"
    return answer

5. 결과

필요시. c++ 짜드리겠습니다.

This post is licensed under CC BY 4.0 by the author.