2021 KAKAO BLIND RECRUITMENT 순위 검색 파이썬
이번 문제는 레벨 2입니다.
접근방식
- 입력된 info와 query를 전처리 해주는 과정을 거칩니다.
- query의 경우 and를 기준으로 split 시켜줍니다.
- info의 경우 공백을 기준으로 나눠주고 오른쪽의 공백을 제거해줍니다.
- 앞에서부터 차례대로 query와 비교해줍니다.
- 만약 query에 “-“ 가 있다면 비교하지 않아도 되므로 다음 비교로 넘어갑니다.
- 정상적으로 넘어갔을 경우 마지막으로 점수를 비교해줍니다.
내 풀이
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
댓글남기기