읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
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 |