말하는 컴공감자의 텃밭

프로그래머스 테이블 해시 함수 <level2> - 자바(java) 2차원배열 정렬, XOR 연산 본문

알고리즘/Programmers - Java

프로그래머스 테이블 해시 함수 <level2> - 자바(java) 2차원배열 정렬, XOR 연산

현콩 2023. 6. 17. 20:11
728x90

프로그래머스 테이블 해시 함수
이게 뭐라는거야

문제 이해가 조금 걸렸다.

 

먼저 2차원 배열 data가 주어지고, col이 주어지는데. col번째 값으로 배열을 정렬해주고,

i번째 튜플에 대해 각 컬럼의 값을 i로 나눈 나머지의 합을 S_i에 넣어준다.

이후 begin과 end까지 모든 S_i를 누적해서 XOR값을 해시값으로 반환.

 

어려웠다. 처음보는 유형이기도 했고, col 기준으로 2차원 배열 정렬과 XOR도 어떻게 해야하지 싶었다.

 

먼저 정렬은 Comparator 인터페이스로 정렬기준을 추가해야한다.

그 중 람다식을 사용해서 간결하게 구현한 예시를 통해 예제를 작성해 보았다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
int[][] arr = new int[][]{{1,2},{2,3},{12,4},{5,30},{6,1}}; // 입력값
 
Arrays.sort(arr, (o1, o2) -> {
    return o1[0]-o2[0]; 
});
--> {1,2},{2,3},{5,30},{6,1},{12,4// 첫번째 숫자로 정렬. 오름차순
 
Arrays.sort(arr, (o2, o1) -> {
    return o1[1]-o2[1]; 
});
--> {6,1},{1,2},{2,3},{12,4},{5,30// 두번째 숫자로 정렬. 오름차순
------------------------------------------------------------------
Arrays.sort(arr, (o1, o2) -> {
    return o2[0]-o1[0]; 
});
--> {12,4},{6,1},{5,30},{2,3},{1,2// 첫번째 숫자로 정렬. 내림차순
 
Arrays.sort(arr, (o2, o1) -> {
    return o2[1]-o1[1]; 
});
--> {5,30},{12,4},{2,3},{1,2},{6,1// 두번째 숫자로 정렬. 내림차순
cs

 

 

먼저 기본적인 틀을 보자. 이차원 배열중 첫번째를 비교하고 싶다면 배열의 첫번째 [0]로 비교한다. 두번째면 [1]이겠다.

오른차순을 원한다면 o1[0]-o2[0]; 내림차순을 원한다면 o2[0] - o1[0];으로 넣어주면 된다.

 

구분이 되어야합니두 드드두두 머신건

 

이후 XOR 계산은 2진수 비트로는 할 수 있으나 코드로는 처음접해서 찾아보니 ^ 기호를 사용하여 연산하더라.

 

꽤나 간단하게 코드를 완성시켰다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
 
class Solution {
    public int solution(int[][] data, int col, int row_begin, int row_end) {
        int answer = 0;
        Arrays.sort(data, (o1, o2) -> {       // 2차원 배열 정렬.
            if (o1[col - 1== o2[col - 1]) { // 만약 col번째가 같다면.
                return o2[0- o1[0];         // 첫번째 칼럼 내림차순 정렬
            } else {
                return o1[col - 1- o2[col - 1]; // 같지 않다면 오름차순 정렬
            }
        });
        for (int i = row_begin - 1; i < row_end; i++) { // begin ~ end 반복문
            int sum = 0;
            for (int column : data[i]) { // S_i 계산해서 sum에 넣기
                sum += (column % (i + 1));
            }
            answer ^= sum;  // ^기호로 XOR 연산
        }
        return answer;
    }
}
cs

 

참고: 2차원 배열 정렬 : https://ifuwanna.tistory.com/328

참고: 자바 XOR : https://codechacha.com/ko/java-xor/

 

728x90
Comments