[Programmers] 테이블 해시 함수

2023. 8. 3. 14:54Computer Sciences/Problem Solve

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

 

프로그래머스

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

programmers.co.kr

문제 설명

처음에 문제를 읽는데 이해가 한 번에 되지 않아 애먹었다. 간단히 정리하면 다음과 같다.

  1. 주어진 2차원 정수 배열을 정렬한다. 이때 주어진 col 기준 오름차순으로 정렬하되 값이 같다면 기본 키인 첫 번 째 열 기준 내림차순으로 정렬한다.
  2. 주어진 row_begin부터 row_end까지 행을 순회하면서 각 행의 값들을 해당 행 번호로 mod 연산 한 값을 더한다.
  3. 만들어진 총합 값들을 모두 XOR연산한다.

2, 3은 단순 for 문으로 금방 해결할 수 있다. 관건은 1번인 2차원 배열 정렬이다. 아마 직접 구현하려면 좀 귀찮을텐데 Java에서 기본 제공하는 Arrays.sort()를 활용하면 간단히 해결할 수 있다.

코드

import java.util.Arrays;

class Solution {
    public int solution(int[][] data, int col, int row_begin, int row_end) {
        // 1. 튜플 정렬
        Arrays.sort(data, (t1, t2) -> {
            // 값이 같은 경우 기본 키 기준 내림차순
            int result = Integer.compare(t1[col - 1], t2[col - 1]);
            if (result == 0) {
                return Integer.compare(t2[0], t1[0]);
            }
            // 다른 경우 해당 컬럼 값 기준 오름차순
            return result;
        });
        
        // 2. 해시값 계산
        int answer = 0;
        for (int i = row_begin - 1; i < row_end; i++) {
            int s_i = 0;
            for (int j = 0; j < data[0].length; j++) {
                s_i += data[i][j] % (i + 1);
            }
            answer ^= s_i;
        }
        
        return answer;
    }
}