Post

Programmers_2021 KAKAKO BLIND RECURITMENT 순위 검색(python)

프로그래머스 -순위 검색 문제 입니다.

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/72412


2. 분류 및 난이도

Programmers 문제입니다.
2021 KAKAO BLIND RECURITMENT 문제입니다.

Level 2난이도의 문제입니다.


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

  • 문제의 핵심은 효율성 부분입니다.
  • 많은 사람들이 효율성 때문에 틀리고, 저 또한 효율성으로 2시간이나 잡고 있었습니다… 실전이었으면 이미 탈락.
  • 다 풀고나서는 코드가 그리 길지않고 생각하는 게 어렵지 않다고 느껴서 Level 2답네 라고 했지만.. 진짜 이게 Level 2 문제인가? 싶기도 합니다.

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
import copy
def solution(info, query):
    answer = []
    infolist = []
    for i in range(len(info)) : 
        #info tuple에 담기
        temptp = info[i].split(' ')
        temptp = (temptp[0][0],temptp[1][0],temptp[2][0],temptp[3][0],int(temptp[4]))
        infolist.append(temptp)
    #정렬
    infolist = sorted(infolist, key = lambda tp : tp[0])
        
    for i in range(len(query)):
        #query 처리문
        querytemp = query[i]
        querytemp  = querytemp.split(" and ")
        querylast = querytemp[3].split(' ')
        del querytemp[3]
        querytemp.append(querylast[0])
        querytemp.append(querylast[1])
        #print(querytemp)
        start = 0 
        end = len(info)-1
        templist = copy.deepcopy(infolist)
        for qidx in range(4):
            k = 0
            while k < len(templist):
                #print(templist)
                findlist = templist[k][qidx]
                findquery = querytemp[qidx][0]
                if findquery =="-" :
                    templist = sorted(templist, key = lambda tp : tp[qidx+1])
                    #print("templist : ",templist)
                    break
                if findlist == findquery :
                    start = k
                    while k< len(templist) and templist[k][qidx] ==  findquery :
                        k+=1
                    end = k
                    #print(start,end)
                    del templist[:start]
                    del templist[end-start:]
                    templist = sorted(templist, key = lambda tp : tp[qidx+1])
                    #print("templist : ",templist)
                else : 
                    k+=1
        #print("최종 : ",start,end,templist) 
        count = 0 
        for res in range(len(templist)):
            if int(querytemp[4]) <= templist[res][4]:
                #print(querytemp[4], templist[res][4])
                count+=1
        answer.append(count)
    return answer

정답인 코드

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
# 쿼리문 조건에 맞는 것들을 계속 리턴합니다.
def findstr(idx,char,infolist) : 
    res = []
    for k in infolist:
        if k[idx] == char : 
            res.append(k)
    return res
# lower boundary를 이용합니다. (타겟과 같거나 처음으로 큰 값 나타나는 인덱스 리턴)
def binary_search(array,target,start,end):
    while start < end :
        mid = (start + end) //2
        if array[mid] == target : 
            end = mid
        elif array[mid] < target:
            start = mid + 1
        elif target < array[mid]:
            end = mid
    return end
            
    

def solution(info, query):
    answer = []
    dic = {}
    for i in range(len(info)) : 
        #dic에 담기
        temptp = info[i].split(' ')
        score = int(temptp[4])
        temptp= (temptp[0][0] + temptp[1][0] + temptp[2][0] + temptp[3][0])
        if temptp not in dic :
            lt = []
            dic[temptp] = lt
            dic[temptp].append(score)
        else : 
            dic[temptp].append(score)
    #나중에 이진탐색을 할 것이므로 정렬을 미리 해둡니다.
    for k in dic:
        dic[k].sort()
        
    for i in range(len(query)):
        #query 처리문
        querytemp = query[i]
        querytemp  = querytemp.split(" and ")
        querylast = querytemp[3].split(' ')
        first = querytemp[0][0] + querytemp[1][0] + querytemp[2][0] + querytemp[3][0]
        qscore = int(querylast[1])
        # 있는 경우
        if first in dic : 
            count = 0 
            for k in (dic[first]) : 
                if k >= qscore : 
                    count+=1
            answer.append(count) 
        else : 
            count = 0
            infolist = dic.keys()
            totalsize = 0
            for k in range(4) : 
                if first[k]=="-" : 
                    continue
                else :
                    infolist = findstr(k,first[k],infolist)
            for lt in infolist : 
                size = len(dic[lt])
                idx = binary_search(dic[lt],qscore,0,size)
                if size != idx:
                    count +=  (size - idx)
            answer.append(count)
            
        
        
    return answer

5. 결과

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

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