Lewis's Tech Keep

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

JAVA/알고리즘

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

Lewis Seo 2024. 8. 5. 02:21

링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

설명

문제에 나온 조건을 먼저 읽어봅니다.

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

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

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

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

 

먼저, 입력으로 받아 List<int[]> dataInfo 배열에 저장해줍니다.

 

그리고 필요로 하는 조건들을 만족하기 위해 정렬 기준을 잡아줍니다.

1. 입력받은 col 값 기준으로 오름차순 정렬
2. col 값이 같다면 첫 번째 컬럼 값을 기준으로 내림차순 정렬

 

반복문을 돌면서 각 숫자 % mod 의 합으로 값을 저장해줍니다.

 

다 저장됐다면 기존 XOR 연산에 계속해서 XOR 연산을 누적해줍니다. (a ^ b) 

 

결과값을 반환합니다.

 

풀이

더보기
더보기
import java.util.*;

class Solution {
    public int solution(int[][] data, int col, int row_begin, int row_end) {
        List<int[]> dataInfo = new ArrayList<>();
        for (int[] dataRow: data) {
            dataInfo.add(dataRow);
        }
        
        Collections.sort(dataInfo, (d1, d2) -> {
            if (col-1 == 0) {
                return d1[0] - d2[0];
            }
            
            int cmp = Integer.compare(d2[col-1], d1[col-1]);
            if (cmp != 0) {
                return d1[col-1] - d2[col-1];
            } else {
                return d2[0] - d1[0];   
            }
        });
        
        int XOR = 0;
        for (int i=row_begin-1 ; i<row_end; i++) {
            int[] row = dataInfo.get(i);
            int rowHash = 0;
            for (int j=0; j<row.length; j++) {
                int hashValue = row[j] % (i + 1);
                rowHash += hashValue;
            }
            XOR = XOR ^ rowHash;
        }
        
        return XOR;
    }
}
Comments