👀 문제
https://programmers.co.kr/learn/courses/30/lessons/72412
👊 도전
1. 설계
- info[i]의 점수를 제외한 데이터와 ‘-‘를 가지고 모든 경우의 수를 만든다.
- 만든 경우의 수는 key가 되고, 점수는 value가 된다. value는 리스트 형태로 만들어서 오름차순 정렬 후 이분탐색으로 사용한다.
- query[i]가 해시맵의 key에 있다면 그 value를 통해 점수 조건에 맞는 개수를 answer에 넣으면 된다.
2. 구현
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
from itertools import combinations
import bisect
def solution(info, query):
answer = []
hashmap={}
for i in info:
i=i.split()
data=i[:-1]
score=int(i[-1])
for n in range(5):
comb=list(combinations(range(4), n))
for c in comb:
_data=data.copy()
for c_idx in c:
_data[c_idx]='-'
_data=''.join(_data)
if _data in hashmap:
hashmap[_data].append(score)
else:
hashmap[_data]=[score]
for value in hashmap.values():
value.sort()
for q in query:
q=[i for i in q.split() if i!='and']
q_score=int(q[-1])
q_cnd=q[:-1]
q_cnd=''.join(q_cnd)
if q_cnd in hashmap:
value_list=hashmap[q_cnd]
answer.append(len(value_list)-bisect.bisect_left(value_list, q_score, 0, len(value_list)))
else:
answer.append(0)
return answer
3. 결과
🤟 성공 🤟
4. 설명
- 조합을 구한다
- 조합으로 만드는 인덱스는 data(info[i]의 점수를 제외한 데이터들)에 ‘-‘를 넣을 위치가 된다.
- (), (0), (1), … (0,1,2,3) == ‘-‘ 위치
- 생성한 경우의 수 리스트(_data)를 join연산으로 하나의 문자열로 바꾼 후 _data에 넣는다.
- _data가 hashmap에 있다면 value(리스트 형) 뒤에 추가한다.
- 아니라면, hashmap에 추가.
- value 이분탐색을 위해 오름차순 정렬한다.
- 해시맵에서 조건에 맞는 값을 리턴한다
- q를 스페이스 기준, and를 제외하고 배열에 넣는다.
- q_cnd(점수를 제외한 데이터)가 해시맵에 존재한다면, 해당 value에서 이분탐색으로 q_score의 삽입 위치를 찾는다(bisect_left 사용)
- 리턴받은 숫자가 조건에 맞지 않는 개수이므로 value.size()에서 리턴숫자를 뺀 값이 정답이 된다. answer에 넣는다.
- 해시맵에 없다면 0을 answer에 넣는다.
👏 해결 완료!
- [프로그래머스] 순위 검색 / Python https://dev-note-97.tistory.com/131
- [프로그래머스] 순위 검색(Python) https://velog.io/@study-dev347/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%9C%EC%9C%84-%EA%B2%80%EC%83%89Python