https://school.programmers.co.kr/learn/courses/30/lessons/72412
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
으렵다. 레벨 2인데 이러면 어떡하지..ㅋㅋㅋㅋ
풀이과정 :
1. info를 공백을 기준으로 나눈다.
2. 점수와 나머지들을 각각 value, key로 구분한다.
3. key로 만들 수 있는 모든 조합을 combination을 이용해 만든다.
4. info_dict에 이 조합을 가진 지원자가 있음을 점수를 저장하면서 알려준다.
5. 저장한 점수들은 이분탐색을 이용할 것이므로 정렬해준다.
6. 쿼리를 돌면서 점수와 나머지값들을 구분해준다.
7. and와 - 를 제거해준다.
8. 만약 나머지값(key)가 info_dict에 있다면 저장되어있는 점수들을 확인하여 이분탐색한다.
9. bisect_lefft를 이용해 왼쪽 값을 반환받고 이를 전체 길이에서 빼주면 명수가 나온다.
10. answer에 붙여넣는다.
배운것
1. 리스트에서 특정 문자를 없애고 싶을 때
while '특정 문자' in 리스트 :
리스트.remove('특정 문자')
2. 이분탐색 - bisect
파이썬에는 이분탐색을 위한 라이브러리가 있다.
bisect인데 동일한 값에 대해 어떻게 대처할건지에 따라
bisect_left, bisect_right이 있다.
https://folivora.tistory.com/83
[Python] 이진 검색 (Binary Search): bisect_left와 bisect_right
이진 검색(binary search)은 정렬된 배열에서 빠르게 원소를 찾을 수 있는 방법 ( \( O( log n ) \) )이다. 기본 아이디어는 정렬이 되어 있는 배열의 중간값을 보고, 찾으려는 값보다 작으면 오른쪽, 찾으
folivora.tistory.com
참고 하세용
여기서는 해당 점수 이상인 사람의 수를 세면 되니까
동일한 점수의 경우 왼쪽에 위치하여 그 인덱스를 받고 전체 길이에서 빼주면 된다~!
코드 :
from itertools import combinations
from bisect import bisect_left
def solution(info, query):
answer = []
info_dict = {}
for i in range(len(info)):
infol = info[i].split() # info안의 문자열을 공백을 기준으로 분리
mykey = infol[:-1] # info의 점수제외부분을 key로 분류
myval = infol[-1] # info의 점수부분을 value로 분류
for j in range(5): # key들로 만들 수 있는 모든 조합 생성
for c in combinations(mykey, j):
tmp = ''.join(c)
if tmp in info_dict:
info_dict[tmp].append(int(myval)) # 그 조합의 key값에 점수 추가
else:
info_dict[tmp] = [int(myval)]
# dict안의 조합들을 점수순으로 정렬
# 이분탐색을 하기 위해서 정렬
for k in info_dict:
info_dict[k].sort()
for qu in query: # query도 마찬가지로 key와 value로 분리
myqu = qu.split()
qu_key = myqu[:-1]
qu_val = myqu[-1]
while 'and' in qu_key: # and 제거
qu_key.remove('and')
while '-' in qu_key: # - 제거
qu_key.remove('-')
qu_key = ''.join(qu_key) # dict의 key처럼 문자열로 변경
if qu_key in info_dict: # query의 key가 info_dict의 key로 존재하면
scores = info_dict[qu_key]
if scores: # score리스트에 값이 존재하면
enter = bisect_left(scores, int(qu_val))
answer.append(len(scores) - enter)
else:
answer.append(0)
return answer
참고 블로그 :
https://hongcoding.tistory.com/56
[프로그래머스] 순위 검색 (Python 파이썬)
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 s..
hongcoding.tistory.com
🐾 20221014
'알고리즘 > 프로그래머스문제풀이' 카테고리의 다른 글
[Python/프로그래머스]양과 늑대_(KaKao)_[DFS] (1) | 2022.10.01 |
---|---|
[Python/프로그래머스]보석쇼핑_(KaKao)_[투포인터] (2) | 2022.10.01 |
[Python/프로그래머스]뉴스 클러스터링_(KaKao)_Counter이용 (0) | 2022.09.26 |
[Python/프로그래머스]튜플_(KaKao)_문제 이해가 잘 안되요 (0) | 2022.09.26 |
[Python/프로그래머스]아이템 줍기_(BFS) (0) | 2022.09.22 |