Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • DFS
  • 프로그래머스
  • BFS
  • 백트래킹
  • boj
  • docker
  • Network
  • Kubernetes
  • 다이나믹 프로그래밍
  • django

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

Algorithm/프로그래머스

[프로그래머스] level2 순위 검색 (Python)

2022. 1. 26. 02:17

입력이 50,000이고, 쿼리가 100,000이다.

쿼리가 10만이라서 쿼리에 대한 답은 log 시간복잡도가 필요할거라고 감을 잡았다.

 

그리고 "java backend junior pizza 150" 

위와 같은 문자열이 들어오면

- and - and - and - 1000

- and - and - and pizza 1000

- and - and junior and - 1000 

...

이러한 쿼리의 답에 모두 속하게 된다

그래서 각 info마다 어떤 쿼리의 답이 될 지 모르기 때문에 모든 쿼리에 대한 경우의 수를 모두 구해야겠다고 생각했다.

 

_info = [i.split(' ') for i in info]
_query = []
for q in query:
    a = q.split(' and ')
    la = a[3].split(' ')
    na = ''.join([a[0], a[1], a[2], la[0]])
    num = int(la[1])
    _query.append((na, num))

위 코드를 통해 info와 query를 재구성하면

_info는 [["java", "backend", "junior", "pizza", "150"]] 이러한 배열로 변하고

_query는 [["java", "backend", "junior", "pizza", "100"]] 같은 배열로 변한다.

 

 

def dfs(n, info, nkey):
    global mydict
    
    if n == len(info) - 1:
        try:
            mydict[nkey].append(int(info[n]))
        except:
            mydict[nkey] = [int(info[n])];
        return
        
    dfs(n+1, info, nkey + info[n])
    dfs(n+1, info, nkey + '-')

각 _info의 원소(배열)을 가지고 백트래킹을 시도한다.

백트래킹을 할 때, 현재 인덱스의 값을 선택할지 말지를 정해서 key를 만들 수 있다.

따라서 'javabackendjuniorpizza' 이라는 문자열이 백트래킹을 통해서 만들어질 수 있고 'java-juniorpizza' 처럼 중간에 backend대신 '-'가 들어갈 수 있다.

현재 info 값이 어떤 쿼리에 속할 수 있는지 모두 확인하고, 속할 수 있는 쿼리가 key인 딕셔너리에 info값의 점수를 추가해준다. (배열 append)

 

global mydict
        
for k in mydict.keys():
    mydict[k].sort()

for q in _query:
    try:
        ins = bisect.bisect_left(mydict[q[0]], q[1])
        answer.append(len(mydict[q[0]]) - ins)
    except:
        answer.append(0)

 

딕셔너리의 key에 해당하는 모든 배열들을 오름차순 정렬한다.

그리고 쿼리를 key값으로 해서 해당 쿼리에 속하는 점수들의 배열을 찾을 수 있다.

점수 배열은 오름차순 정렬이 되어있고, 쿼리의 점수 이상인 점수들의 개수를 알아야 하므로 파이썬의 lower_bound를 사용해 해당 쿼리 점수 이상인 값의 개수를 알 수 있다.

 

 

전체 코드

import bisect

mydict = {}

def dfs(n, info, nkey):
    global mydict
    
    if n == len(info) - 1:
        try:
            mydict[nkey].append(int(info[n]))
        except:
            mydict[nkey] = [int(info[n])];
        return
        
    dfs(n+1, info, nkey + info[n])
    dfs(n+1, info, nkey + '-')
    

def solution(info, query):
    answer = []
    _info = [i.split(' ') for i in info]
    _query = []
    for q in query:
        a = q.split(' and ')
        la = a[3].split(' ')
        na = ''.join([a[0], a[1], a[2], la[0]])
        num = int(la[1])
        _query.append((na, num))
        
    for i in _info:
        dfs(0, i, "")
    
    global mydict
        
    for k in mydict.keys():
        mydict[k].sort()
    
    for q in _query:
        try:
            ins = bisect.bisect_left(mydict[q[0]], q[1])
            answer.append(len(mydict[q[0]]) - ins)
        except:
            answer.append(0)
    return answer

 

 

 

 

 

 

 

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스 level2] H-index (C++)  (0) 2022.02.22
[프로그래머스] 다리를 지나는 트럭(C++) level2  (0) 2022.01.27
[프로그래머스] level2 전화번호 목록 (C++)  (0) 2022.01.18
[프로그래머스] level2 단체사진 찍기 (C++)  (0) 2022.01.18
[프로그래머스] level2 빛의 경로 사이클 (C++)  (0) 2022.01.18
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스 level2] H-index (C++)
    • [프로그래머스] 다리를 지나는 트럭(C++) level2
    • [프로그래머스] level2 전화번호 목록 (C++)
    • [프로그래머스] level2 단체사진 찍기 (C++)

    티스토리툴바