어디까지 갈 수 있을까?
[딕셔너리/이분탐색] 프로그래머스 순위검색 본문
문제링크 https://programmers.co.kr/learn/courses/30/lessons/72412
0. 딕셔너리에 문자열 모두 붙여서 key값으로 넣기
1. 컴비네이션으로 내가 들어갈 수 있는 모든 경우의 수를 만들어 내 int 값을 넣기
2. 정렬된 값에서 이분탐색으로 위치 찾기
[답코드]
from collections import defaultdict
from itertools import combinations
def solution(info, query):
dict=defaultdict(list)
for i in info:
i = i.split()
dict_key=i[:-1]
dict_val=int(i[-1])
for size in range(0, 5):
for c in combinations(dict_key, size):
tmp_key = ''.join(c)
dict[tmp_key].append(dict_val)
for key in dict.keys():
dict[key].sort()
answer=[]
for q in query:
q = q.replace('and ', '').replace('- ', '').split()
st = ''.join(q[:-1])
score = int(q[-1])
if st not in dict:
answer.append(0)
continue
scores = dict[st]
left = 0
right = len(scores)
while left < right: #이상이므로
mid = (left + right) // 2
if scores[mid] >= score:
right = mid
else:
left = mid + 1
answer.append(len(scores) - left)
return answer
https://gaegosoo.tistory.com/77 이 분 코드를 많이 봤다
[풀이법]
처음에 info의 크기가 5*10^4 이므로 O(n^2)의 알고리즘을 짜면 1억이 넘어가서 딕셔너리를 이용해야겠다고 감 잡았다.
def solution(info, query):
dict=defaultdict(list)
for i in info:
i = i.split()
dict_key=i[:-1]
dict_val=int(i[-1])
딱 여기서 막혔는데 딕셔너리에 원하는 값을 포함하는 key값을 찾으려고 하면 포함되는 값이 모두 나오는 게 아니라 하나만 나오기 때문에 여기서 어떻게 해야될 지 떠오르지 않았다.
for size in range(0, 5):
for c in combinations(dict_key, size):
tmp_key = ''.join(c)
dict[tmp_key].append(dict_val)
combination을 이용해서 내가 들어갈 수 있는 모든 경우의 수를 찾고 값을 dictionary의 value에 저장해놓는 아이디어가 정말 참신했다.
[느낀점]
프로그래머스 level 2라서 골랐는데 털렸다,, 문제가 요즘 점점 어렵게 나오는 것 같다 분발하자.
728x90
'알고리즘 > 문제' 카테고리의 다른 글
[파이썬] 백준 16926 배열 돌리기 1, 16927 배열 돌리기 2 (0) | 2021.09.24 |
---|---|
[투포인터] 프로그래머스 보석 쇼핑 (0) | 2021.06.25 |
[비트마스킹] 백준 1062 가르침 (0) | 2021.05.28 |
[BFS] 백준 16940 BFS 스페셜 저지 (0) | 2021.05.27 |
[DFS] 프로그래머스 여행경로 (0) | 2021.05.14 |
Comments