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

2024. 7. 26. 23:23Algorithm

 

문제 설명

 

완호가 관리하는 어떤 데이터베이스의 한 테이블은 모두 정수 타입인 컬럼들로 이루어져 있습니다. 테이블은 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
  • 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

 

풀이

 

내림차순 오름차순 정렬만 할 줄 알고 XOR 비트연산자에 대해 알고 있다면 쉽게 풀 수 있는 문제다. 하지만 나는 XOR 비트연산자를 개념적으로만 알았지 실제 코드에서 사용하는 법을 몰라 헤매다 검색으로 알았다. 또한 마지막 answer값을 추출하는 과정에서 xor이 1, N까지 전체에서 1 xor 2, 3 xor 4 ... = answer 형식으로 값이 더해져야 된다. 또한 주의할 점으로 제한사항에 data의 크기는 고정된 값이 아닌 500 이하의 값인 부분을 놓치면 안 된다.

import java.util.*;

class Solution {
    public int solution(int[][] data, int col, int row_begin, int row_end) {
        int answer = 0;
        
        int colum = col - 1;
        Arrays.sort(data, (o1, o2) -> {
            if (o1[colum] == o2[colum]) {
                return o2[0] - o1[0];
            }
            return o1[colum] - o2[colum];
                
        });
        
        for (int i = row_begin; i <= row_end; i++) {
            int after = 0;
            for (int j = 0; j < data[0].length; j++) {
                after += data[i - 1][j] % i;
            }
            answer ^= after;
        }
        
        return answer;
    }
}