![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJXKfX%2Fbtrn7qhhJm3%2FVrkhSrDt0QpiIqTNaFkBq0%2Fimg.png)
[programmers] 순위 검색 (2021 카카오 블라인드 채용)
resilient
·2021. 12. 17. 02:17
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/72412
코딩테스트 연습 - 순위 검색
["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt
programmers.co.kr
- 이 문제는 효율성 테스트 점수가 있습니다. 이 말은 어딘가에 시간 초과가 날 법한 조건이 있고, 시간 초과가 안 나게 다른 방법들로 구현해야 합니다. 예를 들면, dp, queue, 이분 탐색 등의 구현이 필요할 수도 있다는 점을 염두에 둬야겠죠?
- 내가 처음에 생각한 부분은 리스트에 관련된 부분이였습니다. 그래서 파이썬 딕셔너리를 써서 효율성을 통과해야겠다고 생각했고 두 번째로는 점수였습니다. 하나하나 점수를 비교하기에는 query 배열 크기의 최댓값이 너무 컸습니다. 그래서 이분 탐색, 파이썬에서 bisect를 써야겠다고 생각했습니다.
- 그 이후로는 단어들을 어떻게 비교해 줄 것인가였는데요, 처음엔 교집합을 구해주려고 했지만 시간초과가 발생했습니다.
- 그래서 combinations를 사용해서 나올 수 있는 단어들의 조합을 info 배열, query 배열 각각 구해주고 나중에 query단어들이 info배열 안에 있냐 없냐를 비교해주는 방법을 생각했습니다.
- 마지막으로 이분 탐색으로 query 데이터들 마지막에 주어진 점수를 넘겼는지 비교해주는 부분은 query 단어들이 info안에 있을 경우, query 단어들이 가진 점수들이 몇 번째 인덱스에 들어가면 좋을지를 생각해서 그 점수보다 큰 점수들이 몇 개나 있는지 찾아줬습니다.
- 자세한 구현은 아래 코드를 참고해주시면 됩니다.
from bisect import bisect_left
from itertools import combinations
from collections import defaultdict
def solution(info, query):
answer = []
dict_ = defaultdict()
for i in info:
info_data = i.split()
info_key = info_data[:-1]
info_value = info_data[-1]
for j in range(5):
for comb in combinations(info_key,j):
temp = ''.join(comb)
if temp in dict_:
dict_[temp].append(int(info_value))
else:
dict_[temp] = [int(info_value)]
for i in dict_:
dict_[i].sort()
for q in query: # query도 마찬가지로 key와 value로 분리
query_data = q.split(' ')
query_key = query_data[:-1]
query_value = query_data[-1]
# 제거를 해주면서 경우의 수를 구해준다.
while 'and' in query_key:
query_key.remove('and')
while '-' in query_key:
query_key.remove('-')
query_key = ''.join(query_key) # dict의 key처럼 문자열로 변경
if query_key in dict_: # query의 key가 info_dict의 key로 존재하면
scores = dict_[query_key]
# 이 부분이 코테 점수 이상을 받은 사람들 세는 구현
if scores:
enter = bisect_left(scores, int(query_value))
answer.append(len(scores) - enter)
else:
answer.append(0)
return answer
반응형
'자료구조 & 알고리즘 > 프로그래머스(programmers)' 카테고리의 다른 글
[programmers] 징검다리 (0) | 2022.02.01 |
---|---|
[programmers] 단어 변환 (0) | 2022.01.30 |
[programmers] 실패율 (2019 카카오 블라인드 채용) (0) | 2021.09.04 |
[programmers] 보석 쇼핑 (2020 카카오 인턴십) (1) | 2021.09.03 |
[programmers ] 캐시 (2018 카카오 블라인드 채용) (0) | 2021.09.01 |