2021 KAKAO BLIND RECRUITMENT 순위 검색 파이썬

1 분 소요

2021 KAKAO BLIND RECRUITMENT 순위 검색 파이썬 풀이

이번 문제는 레벨 2입니다.

접근방식

  1. 입력된 info와 query를 전처리 해주는 과정을 거칩니다.
  2. query의 경우 and를 기준으로 split 시켜줍니다.
  3. info의 경우 공백을 기준으로 나눠주고 오른쪽의 공백을 제거해줍니다.
  4. 앞에서부터 차례대로 query와 비교해줍니다.
  5. 만약 query에 “-“ 가 있다면 비교하지 않아도 되므로 다음 비교로 넘어갑니다.
  6. 정상적으로 넘어갔을 경우 마지막으로 점수를 비교해줍니다.

내 풀이

def solution(info, query):
    answer = []
    for i in query:
        cnt = 0
        q = i.split('and')
        search = []
        for j in q:
            search.extend(j.strip().split(' '))
        for s in info:
            info_split = s.split(" ")
            for t in range(5):
                if info_split[t] == search[t] or search[t] == "-":
                    t += 1
                    if t == 4 and int(info_split[t]) >= int(search[t]):
                        cnt += 1
                elif search[t] != "-" and info_split[t] != search[t]:
                    break
        answer.append(cnt)
    return answer

하지만, 위의 코드는 정확성 테스트에서만 통과했고, 효율성 측면에선느 통과하지 못했습니다.

이에 대해서는 다른 분들의 풀이를 참고했고, 그 중에서 yuneg11님의 깃헙 에 상세한 풀이가 나와 있어서

이를 추천드립니다.

아직 구조화하는 부분과 다양한 구현법에 대해서 이해가 쉽게 되지 않아, 이 문제의 효율성은 앞으로도 더 공부를 해야할 필요성이 있습니다.

모범코드

from functools import reduce
from collections import defaultdict
from bisect import insort, bisect_left

def solution(info, query):
    table = {"c": 3, "j": 5, "p": 6, "b": 6, "f": 5, "s": 6, "-": 0}
    conv = lambda l, t: (reduce(lambda a, k: (a << 3) + t(table[k[0]]), l[:-1], 0), int(l[-1]))
    info = list(map(lambda s: conv(s.split(" "), lambda x: 7 - x), info))
    query = list(map(lambda s: conv([c for c in s.split(" ") if c != "and"], lambda x: x), query))
    d = defaultdict(list)
    for k, v in info:
        insort(d[k], v)
    return [sum([len(l) - bisect_left(l, v) for k, l in d.items() if not k & q]) for q, v in query]

정확성 뿐 아니라 효율성을 잡아야 하는 문제를 풀기 위해서는

주어진 입력값에 대한 구조화, 시간 및 공간 복잡도를 계산하여 효율적을 단축시킬 수 있는 방법에 대해

구상할 줄 아는 능력이 많이 필요한 것 같습니다.

알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady

댓글남기기