[해시] PRG 72412: 순위 검색 (틀림)

LeeJE20·2021년 9월 6일
0

파이썬 문제풀이

목록 보기
21/26

사용 언어: python 3.9.5

❓ Problem

문제 설명

https://programmers.co.kr/learn/courses/30/lessons/72412

query에 해당하는 값을 뽑아내는 문제.

정확도, 효율성 채점기준이 따로 있다.

난이도

레벨 2

🚩 Solution


시도 01)

1. 접근법

데이터를 정렬시켜둔다.

데이터를 언어, 직군, 경력, 소울푸드가 변하는 지점의 인덱스를 체크해둔다.

쿼리가 들어오면 해당 범위 내에서의 숫자을 이분탐색하며 찾는다.

→ 나중에 cpp안에도 backend, frontend가 있고, java 안에도 backend, frontend가 있는 등 범위가 한가지가 아니라는 것을 깨닫고 포기

(30분정도 소요)

2. 코드

"""
아이디어
인원수: n, 문제수: N

그때그떄 하나씩 서치하면 -> nN

정보를 저장해둬야함..

처음에 정렬을 해두고, binary search로 탐색?

1. info를 split으로 분리
2. 전체 정렬
3. binary search로 탐색하기

"""

def b_search()

def solution(info, query):

    info.sort()
    data = []
    for i in info:
        data.append(i.split())

    

    d = {"cpp":0, "java": 1, "python":2,
     "backend":0, 'frontend': 1,
 'junior':0, 'senior': 1,
 'chicken':0, 'pizza': 1}

    for i in query:
        start = 0
        end = len(data)
        q = query.split()
        for j in range(5):
            if q[j] == "-":
                pass
            else:
                while True:
                    mid = (start+ end)// 2

                    # 큰 곳을 탐색해야 함
                    if d[data[mid][j]] < d[q[j]]:
                        start = mid
                    # 올바른 값:
                    elif d[data[mid][j]]==d[q[j]]:
                        # start와 end 범위 조정
                        while d[data[start][j]]!=d[q[j]]:
                            start += 1
                        while d[data[end][j]]!=d[q[j]]:
                            end -= 1
                        break
                    # 작은 곳을 탐색해야 함
                    else: 
                        end = mid
            

    answer = []
    return answer

3. 시간복잡도

O(nlogn)O(nlogn)

4. 결과

실패

원인: 구현 실패

5. 소요 시간

30분 정도

시도 02)

1. 접근법

배열 안에 넣어서 해보려고 함

data[cpp][backend][경력][소울푸드] = [점수]

이런식으로 사용할 수 있게..

⇒그런데 -가 들어있어서 data[-][backend][-][chicken] 같은 경우는 배열을 사용하기가 복잡함.

-가 있으면 반복이 필요한데, 재귀를 쓰기도 반복문을 쓰기도 애매함.

그래서 포기

2. 코드

def solution(info, query):
    d = {"cpp":0, "java": 1, "python":2,
     "backend":0, 'frontend': 1,
 'junior':0, 'senior': 1,
 'chicken':0, 'pizza': 1}

    # info.sort(key= lambda x: (x[4], x[0], x[1], x[2], x[3]))
    info.sort()
    data = [[[[[]for _ in range(2)] for _ in range(2)]for _ in range(2)]for _ in range(3)]
    for i in info:
        dt = i.split()
        data[d[dt[0]]][d[dt[1]]][d[dt[2]]][d[dt[3]]].append(dt[4])

    for i in query:
        q = query.split()

        qu = [q[0], q[2], q[4], q[6]]

        for j in qu:
            if j == "-":
                for

3. 시간복잡도

O(n)O(n)

4. 결과

실패

원인: 구현 실패

5. 소요 시간

📕 피드백

1. 검색한 내용

해설지

https://tech.kakao.com/2021/01/25/2021-kakao-recruitment-round-1/

-가 들어갈 수 있는 모든 경우의 수에 대해 미리 그룹을 지어 둔다.

한 사람을 찾을 수 있는 조합은 16가지인데, 모든 16가지 조합이 그 한 사람을 가리킬 수 있게 해둬야 한다.

2. 실수

3. 발전 방향 (개선/추가사항)

30분만 해야하는데, 너무 오래동안 문제를 붙잡고 있었다.

안 풀리는 문제는 빨리 손 놓자.

4. 다른 사람 풀이

풀이1)

  • 링크

https://whwl.tistory.com/193

  • 접근법

카카오 풀이

  • 배울 점

조합에 대해 combinations 모듈 사용

defaltdictionary로 경우의 수 16개에 대한 해시 작성

0개의 댓글