[Programmers] 테이블 해시 함수 - Python

2024. 11. 15. 14:55·알고리즘/프로그래머스

 

난이도: Lv. 2

문제 설명


완호가 관리하는 어떤 데이터베이스의 한 테이블은 모두 정수 타입인 컬럼들로 이루어져 있습니다. 테이블은 2차원 행렬로 표현할 수 있으며 열은 컬럼을 나타내고, 행은 튜플을 나타냅니다.


첫 번째 컬럼은 기본키로서 모든 튜플에 대해 그 값이 중복되지 않도록 보장됩니다. 완호는 이 테이블에 대한 해시 함수를 다음과 같이 정의하였습니다.

  1. 해시 함수는 col, row_begin, row_end을 입력으로 받습니다.

  2. 테이블의 튜플을 col번째 컬럼의 값을 기준으로 오름차순 정렬을 하되, 만약 그 값이 동일하면 기본키인 첫 번째 컬럼의 값을 기준으로 내림차순 정렬합니다.

  3. 정렬된 데이터에서 S_i를 i 번째 행의 튜플에 대해 각 컬럼의 값을 i 로 나눈 나머지들의 합으로 정의합니다.

  4. row_begin ≤ i ≤ row_end 인 모든 S_i를 누적하여 bitwise XOR 한 값을 해시 값으로서 반환합니다.

 

테이블의 데이터 data와 해시 함수에 대한 입력 col, row_begin, row_end이 주어졌을 때 테이블의 해시 값을 return 하도록 solution 함수를 완성해주세요.

 

제한 사항


  • 1 ≤ data의 길이 ≤ 2,500
  • 1 ≤ data의 원소의 길이 ≤ 500
  • 1 ≤ data[i][j] ≤ 1,000,000
    • data[i][j]는 i + 1 번째 튜플의 j + 1 번째 컬럼의 값을 의미합니다.
  • 1 ≤ col ≤ data의 원소의 길이
  • 1 ≤ row_begin ≤ row_end ≤ data의 길이

 

문제 예제


data col row_begin row_end result
[[2,2,6], [1,5,10], [4,2,9], [3,8,3]] 2 2 3 4
  • 정해진 방법에 따라 튜플을 정렬하면 {4, 2, 9}, {2, 2, 6}, {1, 5, 10}, {3, 8, 3} 이 됩니다.
  • S_2 = (2 mod 2) + (2 mod 2) + (6 mod 2) = 0 입니다.
  • S_3 = (1 mod 3) + (5 mod 3) + (10 mod 3) = 4 입니다.
  • 따라서 해시 값은 S_2 XOR S_ 3 = 4 입니다.

 

✏️ 내 풀이


def solution(data, col, row_begin, row_end):
    answer = 0
    data.sort(key = lambda x:x[0], reverse = True)
    data.sort(key = lambda x:x[col-1])
    
    for i in range(len(data)):
        temp = 0
        if row_begin <= i + 1 <= row_end:
            for d in data[i]:
                temp += d%(i+1)
            answer = answer ^ temp
            
    return answer

 

이  문제는 정렬이 제일 중요한 것 같다. 결국 해시 함수 정의 2번이 잘 동작해야 정확한 답을 구할 수 있기 때문이다.

 

정의된 내용은 정렬을 col을 기준으로 오름차순 정렬을 하고, 만약 그 값이 동일하면 첫 번째 컬럼의 값을 기준으로 내림차순 정렬하는 것이다.

 

단순히 sort(key = lambda x:(x[col-1], x[0]))을 해버리면 원하는 결과가 나오지 않는다.

첫 번째 컬럼의 값을 기준으로는 내림차순 정렬을 해야하기 때문이다.

 

따라서, 먼저 첫번째 컬럼 값을 기준으로 내림차순 정렬을 해주고
        → data.sort(key = lambda x:x[0], reverse = True)

그 뒤에, col을 기준으로 오름차순 정렬을 하면 원하는 결과를 얻을 수 있다.
        → data.sort(key = lambda x:x[col-1])

 

그 뒤에는 문제에서 시키는 대로 코딩하면 정답을 구할 수 있다.

 

다른 사람들의 풀이를 보니 굳이 sort를 두번 안해도 다음과 같이 할 수 있는 것 같다.
       →   sort(key = lambda x:(x[col-1], -x[0]))


[Programmers] 테이블 해시 함수 - Python

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[Programmers] 오픈채팅방  (0) 2024.11.24
[Programmers] 불량 사용자 - Python  (0) 2024.11.23
[Programmers] 프렌즈4블록 - Python  (1) 2024.11.20
[Programmers] 등굣길 - Python  (0) 2024.11.17
[Programmers] 야근 지수 - Python  (1) 2024.11.16
'알고리즘/프로그래머스' 카테고리의 다른 글
  • [Programmers] 불량 사용자 - Python
  • [Programmers] 프렌즈4블록 - Python
  • [Programmers] 등굣길 - Python
  • [Programmers] 야근 지수 - Python
Laewon Jeong
Laewon Jeong
  • Laewon Jeong
    래원
    Laewon Jeong
    글쓰기 | 관리
  • GitHub

    • github.com/laewonJeong
  • 전체
    오늘
    어제
    • 분류 전체보기 (172)
      • Docker 및 Kubernetes (11)
        • Docker (5)
        • Kubernetes (6)
      • Data Engineering (18)
        • Hadoop (5)
        • Spark (5)
        • Kafka (5)
        • Airflow (3)
      • CI|CD (3)
      • 알고리즘 (136)
        • 알고리즘 (2)
        • LeetCode (118)
        • 프로그래머스 (11)
        • BOJ (1)
        • 코딩테스트 대비 (4)
      • 서버 (2)
        • 미니 서버 (2)
      • 잡담 (1)
  • 태그

    누적합
    알고리즘
    아파치 하둡
    DP
    dfs
    Kubernetes
    이진탐색
    그래프
    아파치 스파크
    BFS
    docker
    프로그래머스
    String
    리트코드
    코딩테스트
    leetcode
    Python
    티스토리챌린지
    문자열
    백트래킹
    우선순위큐
    Apache Spark
    분산
    분산처리
    오블완
    heapq
    쿠버네티스
    도커
    programmers
    파이썬
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Laewon Jeong
[Programmers] 테이블 해시 함수 - Python
상단으로

티스토리툴바