본문 바로가기
프로그래머스

[프로그래머스] lv2. 테이블 해시 함수 - Python

by whereisco 2023. 6. 8.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/147354

위 문제는 문제 조건을 착실히 구현하면 비교적 해결할 수 있는 문제입니다. 그러나 저의 경우 비트연산자(XOR)를 기억하지 못해 이를 참조하며 해결하였는데요. 문제 조건을 먼저 살펴보도록 하겠습니다.

문제 조건

조건 2를 통해 가장 먼저 정렬을 해주어야 함을 알 수 있습니다. lambda를 활용해 정렬의 우선순위를 정해주어 이를 해결할 수 있습니다.

조건 3을 통해 정렬된 데이터를 순회하며 (데이터 % 인덱스)의 값을 누적시켜야 함을 알 수 있습니다.

조건 4를 통해 우리는 문제에서 주어지는 row_begin ~ row_end 구간의 합을 누적하여 누적합의 XOR 값을 구해주어야 함을 알 수 있습니다.

이는 아래와 같이 표현할 수 있습니다. (주석으로 위 조건들이 코드로 나타낸 곳을 표시하였습니다.)

Python

def solution(data, col, row_begin, row_end):
    answer = 0
    
    #col번째 컬럼의 값을 기준으로 오름차순 정렬, 조건 2
    data.sort(key=lambda x: (x[col-1], -x[0]))
    
    for i, val in enumerate(data):
        sum = 0
        if row_begin-1 <= i <= row_end-1:
            for j in val: #조건 3
                sum += j % (i+1)
            answer ^= sum #조건 4
    return answer

 

비트 연산자

XOR 연산 예제

파이썬에서 XOR은 ^를 활용해 나타낼 수 있습니다.

위의 표를 통해 ^=는 비트 XOR 연산 후 할당을 의미하는 것을 알 수 있습니다.

따라서, 위 문제를 각 행의 합을 구해주며 XOR 연산자를 통해 XOR 연산한 값이 저장되도록 하여 해결할 수 있었습니다.

출처

파이썬 코딩 도장: 47.1 비트 연산자 사용하기