강의로 돌아가기
유강현

python 정답 주의

해설은 인터넷에 많이 나와있으나, 구현하는 과정에서 좀 더 간단한 코드를 찾기 힘들어서 올립니다.

흔히 알려져 있는 방법으로 풀었습니다.

  1. 하나의 info에서 나올 수 있는 16가지의 key를 만들어서 infomap[key]에 값을 추가해줍니다.
  2. 이분탐색을 위해 infomap의 값들을 정렬합니다.
  3. query의 값을 key로 만들고 이분탐색으로 point 이상의 값 개수를 구합니다.
작성중인 코드―solution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import bisect, itertools, collections

def solution(info, query):
    infomap = collections.defaultdict(list)
    binarys = list(itertools.product((True, False), repeat=4))
    for inf in info:
        inf = inf.split()
        for binary in binarys:
            key = ''.join([inf[i] if binary[i] else '-' for i in range(4)]) 
            infomap[key].append(int(inf[4]))

    for k in infomap.keys():
        infomap[k].sort()

    answers = []
    for q in query:
        l,_,p,_,c,_,f, point = q.split()
        key = ''.join([l,p,c,f])
        i = bisect.bisect_left(infomap[key], int(point))
        answers.append(len(infomap[key]) - i)

    return answers
  • 서병일

    효율성에서 계속 걸려서, 올려 주신 코드로 조금씩 수정했는데, 이상하게도 별것 아닌 것 같은 12-13행이 핵심이네요.ㅠㅠ 저는 query for문 돌 때 필요한 key의 list에 대해서만 sort하는 게 빠를 거라 생각했는데... 하여간 덕분에 많이 배우고 잘 풀었습니다. 감사합니다!

    서병일―2022.10.13 16:48
1 개의 답변
HS

헤매고 있었는데 덕분에 좋은 풀이 배웠습니다
감사합니다 :)

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.