읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
4차원 배열로 정확성은 통과했으나 효율성은 통과하지 못했다. 라이트업을 보니 와일드카득 ㅏ들어갈 모든 경우의 수에 대해 hash키를 만들고 모조리 16가지의 키에 저장하여 키 조회 때마다 정렬된 배열을 불러와 이분탐색을 사용해 시간복잡도를 줄여야 했다. 너무 신박한 풀이라 애초에 혼자서는 해결할 수 없었을 것이다.
- 각 기준에 와일드카드를 넣을 지 결정하는 16가지경우의 수에 대해 삽입합수 정의
- 사전에 모든 키에 대해 조회하여 정렬 수행
- 각 쿼리에 대해 키를 조회하여 lower bound를 찾고 값 저장
python 코드
from collections import defaultdict
from itertools import combinations
from bisect import bisect_left
def solution(info, query):
tmp = [[0], [1], [2], [3]]
for i in range(2, 5):
s = [j for j in range(4)]
com = combinations(s, i)
for co in list(com):
tmp.append(list(co))
def make_case(info_l, score, tmp):
user_dict["".join(info_l)].append(score)
for c in tmp:
buf = info_l.copy()
for x in c:
buf[x] = "-"
key = "".join(buf)
user_dict[key].append(score)
user_dict = defaultdict(list)
for user in info:
info_list = user.split()
info_l = info_list[:-1]
score = int(info_list[-1])
make_case(info_l, score, tmp)
for key in list(user_dict):
user_dict[key].sort()
answer = []
for que in query:
que_l = que.split()
q_l = [que_l[0], que_l[2], que_l[4], que_l[6]]
score = int(que_l[7])
key = "".join(q_l)
value_list = user_dict[key]
answer.append(len(value_list) - bisect_left(value_list, score))
return answer
'Algorithms > Programmers' 카테고리의 다른 글
Programmers. 광고 삽입 (0) | 2021.09.10 |
---|---|
Programmers. 블록 이동하기 (0) | 2021.09.10 |
Programmers. 가사 검색 (0) | 2021.09.10 |
Programmers. 외벽 점검 (0) | 2021.09.10 |
Programmers. 매칭 점수 (0) | 2021.09.10 |