알고리즘/프로그래머스문제풀이

[Python/프로그래머스]순위검색_(KaKao)_[구현,bisect(이분탐색)]

개발자 덕구🐾 2022. 9. 27. 11:15
728x90

 

 

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

반응형