알고리즘
프로그래머스 - 테이블 해시 함수(Java)
ksb-dev
2023. 2. 6. 13:26
단순 구현 문제입니다.
주어진 조건에 맞춰 정확히 구현만 하시면 됩니다.
문제 조건을 하나씩 살펴보겠습니다.
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;
}
}