[프로그래머스 - JAVA] 테이블 해시 함수
2024. 7. 26. 23:23ㆍAlgorithm
문제 설명
완호가 관리하는 어떤 데이터베이스의 한 테이블은 모두 정수 타입인 컬럼들로 이루어져 있습니다. 테이블은 2차원 행렬로 표현할 수 있으며 열은 컬럼을 나타내고, 행은 튜플을 나타냅니다.
첫 번째 컬럼은 기본키로서 모든 튜플에 대해 그 값이 중복되지 않도록 보장됩니다. 완호는 이 테이블에 대한 해시 함수를 다음과 같이 정의하였습니다.
- 해시 함수는 col, row_begin, row_end을 입력으로 받습니다.
- 테이블의 튜플을 col번째 컬럼의 값을 기준으로 오름차순 정렬을 하되, 만약 그 값이 동일하면 기본키인 첫 번째 컬럼의 값을 기준으로 내림차순 정렬합니다.
- 정렬된 데이터에서 S_i를 i 번째 행의 튜플에 대해 각 컬럼의 값을 i로 나눈 나머지들의 합으로 정의합니다.
- row_begin ≤ i ≤ row_end 인 모든 S_i를 누적하여 bitwise XOR 한 값을 해시 값으로서 반환합니다.
테이블의 데이터 data와 해시 함수에 대한 입력 col, row_begin, row_end이 주어졌을 때 테이블의 해시 값을 return 하도록 solution 함수를 완성해 주세요.
제한 사항
- 1 ≤ data의 길이 ≤ 2,500
- 1 ≤ data의 원소의 길이 ≤ 500
- 1 ≤ data[i][j] ≤ 1,000,000
- 1 ≤ col ≤ data의 원소의 길이
- 1 ≤ row_begin ≤ row_end ≤ data의 길이
입출력 예
data | col | row_begin | row_end | result |
[[2,2,6],[1,5,10],[4,2,9],[3,8,3]] | 2 | 2 | 3 | 4 |
풀이
내림차순 오름차순 정렬만 할 줄 알고 XOR 비트연산자에 대해 알고 있다면 쉽게 풀 수 있는 문제다. 하지만 나는 XOR 비트연산자를 개념적으로만 알았지 실제 코드에서 사용하는 법을 몰라 헤매다 검색으로 알았다. 또한 마지막 answer값을 추출하는 과정에서 xor이 1, N까지 전체에서 1 xor 2, 3 xor 4 ... = answer 형식으로 값이 더해져야 된다. 또한 주의할 점으로 제한사항에 data의 크기는 고정된 값이 아닌 500 이하의 값인 부분을 놓치면 안 된다.
import java.util.*;
class Solution {
public int solution(int[][] data, int col, int row_begin, int row_end) {
int answer = 0;
int colum = col - 1;
Arrays.sort(data, (o1, o2) -> {
if (o1[colum] == o2[colum]) {
return o2[0] - o1[0];
}
return o1[colum] - o2[colum];
});
for (int i = row_begin; i <= row_end; i++) {
int after = 0;
for (int j = 0; j < data[0].length; j++) {
after += data[i - 1][j] % i;
}
answer ^= after;
}
return answer;
}
}
'Algorithm' 카테고리의 다른 글
[프로그래머스 - JAVA] 전력망을 둘로 나누기 (0) | 2024.08.29 |
---|---|
[프로그래머스 - JAVA] 택배 배달과 수거하기 (0) | 2024.08.19 |
[프로그래머스 - JAVA] 마법의 엘리베이터 (0) | 2024.07.22 |
[15558 - JAVA] 점프 게임 (0) | 2024.07.21 |
[프로그래머스 - JAVA] 숫자 카드 나누기 (0) | 2024.07.17 |