본문 바로가기

코딩 테스트/PROGRAMMERS

[Java] Lv.2 테이블 해시 함수

문제

 

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

PriorityQueue를 쓰든 Arrays.sort를 쓰든 Comparator를 이용하여 정렬 기준을 정해주어야한다

col번째 데이터를 기준으로 해당 숫자끼리 비교했을 때 같으면 첫 번째 데이터를 기준으로 내림차순 정렬

아니면 col번째 데이터를 기준으로 오름차순 정렬이다. (배열은 0부터 시작이므로 당연히 col - 1을 기준으로 비교해야한다.)

 

이후 각 자리수를 row_begin ~ row_end로 나눈 나머지를 각각 더해서 각 숫자를 ^ 연산해주면 끝.

자바 코드

import java.util.*;
class Solution {
    public int solution(int[][] data, int col, int row_begin, int row_end) {
        int answer = 0;
        
        // data를 람다식으로 정렬
        Arrays.sort(data, (o1, o2) -> {
            // col번째 데이터를 기준으로 비교하여 숫자가 같으면 첫번째 데이터를 기준으로 내림차순 정렬
            if(o1[col - 1] == o2[col - 1])
                return o2[0] - o1[0];
            // 같지 않다면 해당 col번째 데이터를 기준으로 오름차순 정렬
            return o1[col - 1] - o2[col - 1];
        });
        
        // row_begin번째 데이터의 sData를 구해서 answer에 미리 저장
        answer = getSortData(data[row_begin - 1], row_begin);
        
        // row_begin + 1 자리부터 row_end 자리까지의 데이터를 확인
        for(int i = row_begin; i < row_end; i++){
            int[] row = data[i];
            
            // 각 컬럼 값을 i로 나눈 나머지 합 구하기
            // 구한 값을 기존 answer와 XOR 연산하여 저장
            answer = answer ^ getSortData(row, i + 1);
        }
        
        return answer;
    }
    
    public int getSortData(int[] row, int i){
        int sortData = 0;
            for(int num : row)
                sortData += num % i;
        
        return sortData;
    }
}