본문 바로가기

알고리즘

프로그래머스 - 테이블 해시 함수(Java)

단순 구현 문제입니다.

 

주어진 조건에 맞춰 정확히 구현만 하시면 됩니다.

문제 조건을 하나씩 살펴보겠습니다.

 

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

- 입력 숫자는 1부터 시작한 다는 것만 주의하시면 됩니다.

 

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

- Comparator만 사용할 줄 아시면 문제 조건에 맞춰 람다식 혹은 익명 함수로 구현하시면 됩니다.

// 람다식 사용
int finalCol = col;
Arrays.sort(data, (o1, o2) -> {
    if (o1[finalCol] == o2[finalCol]) return o2[0] - o1[0];
        return o1[finalCol] - o2[finalCol];
});

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

- i 만큼 반복을 하면서, 그 배열 각 원소에 mod 연산을 한 뒤 총합을 구하면 됩니다.

int finalI = i + 1;
int dataTotal = Arrays.stream(data[i])
    .map(j -> j % finalI)
    .sum();


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

- 구해진 각 배열의 총합을 ^ 연산자를 사용하여 XOR 하면 됩니다.

answer = (answer ^ dataTotal);

 

[구현 코드]

class Solution {
    public static int solution(int[][] data, int col, int row_begin, int row_end) {
        int answer = 0;

        col -= 1;
        row_begin -= 1;

        // 2. 정렬
        int finalCol = col;
        Arrays.sort(data, (o1, o2) -> {
            if (o1[finalCol] == o2[finalCol]) return o2[0] - o1[0];
            return o1[finalCol] - o2[finalCol];
        });

        // 3. S_i 합 구하기
        for (int i = row_begin; i < row_end; i++) {

            int finalI = i + 1;
            int dataTotal = Arrays.stream(data[i])
                    .map(j -> j % finalI)
                    .sum();

            // 4. XOR한 값 저장
            answer = (answer ^ dataTotal);
        }

        return answer;
    }
}