✔ 테이블 해시 함수
문제 분석하기
col번째 컬럼의 값을 기준으로 오름차순 정렬
→ 값이 동일할 경우, 첫 번째 컬럼의 값을 기준으로 내림차순 정렬
→ row_begin부터 row_end 행에 대해 i로 나눈 나머지들의 합의 저장
→ 나머지들의 합을 가지고 XOR한 값을 반환
손으로 풀어보기
- col번째 컬럼의 값을 기준으로 오름차순 정렬
- 값이 동일할 경우, 첫 번째 컬럼의 값을 기준으로 내림차순 정렬
- row_begin부터 row_end 행에 대해 i로 나눈 나머지들의 합의 저장
- 나머지들의 합을 가지고 XOR한 값을 반환
슈도코드 작성하기
data(테이블의 데이터)
col, row_begin, row_end(해시 함수에 대한 입력)
answer(테이블의 해시 값)
data를 커스텀 정렬하기
for(i -> row_begin -1부터 row_end까지) {
total(나머지들의 합)
for(d -> data[i]만큼) {
total에 d % (i + 1) 저장하기
}
answer = (answer ^ total) 저장하기
}
answer 반환
코드 구현하기
/**
* 147354) 테이블_해시_함수
*/
public class L088_147354 {
// data(테이블의 데이터)
// col, row_begin, row_end(해시 함수에 대한 입력)
public int solution(int[][] data, int col, int row_begin, int row_end) {
// answer(테이블의 해시 값)
int answer = 0;
// data를 커스텀 정렬하기
Arrays.sort(data, (o1, o2) -> {
// 값이 동일할 경우, 첫 번째 컬럼의 값을 기준으로 내림차순 정렬
if (o1[col - 1] == o2[col - 1])
return o2[0] - o1[0];
// col번째 컬럼의 값을 기준으로 오름차순 정렬
return o1[col - 1] - o2[col - 1];
});
// row_begin부터 row_end 행에 대해 i로 나눈 나머지들의 합 저장
for (int i = row_begin - 1; i < row_end; i++) {
// total(나머지들의 합)
int total = 0;
for (int d : data[i]) {
// total에 d % (i + 1) 저장하기
total += (d % (i + 1));
}
// 나머지들의 합을 가지고 XOR한 값 저장하기
answer = (answer ^ total);
}
// answer 반환
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
L088_147354 solution = new L088_147354();
int[][] data = { { 2, 2, 6 }, { 1, 5, 10 }, { 4, 2, 9 }, { 3, 8, 3 } };
int col = 2;
int row_begin = 2;
int row_end = 3;
int result = solution.solution(data, col, row_begin, row_end);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[148653] 마법의 엘리베이터 (0) | 2024.02.09 |
---|---|
[148652] 유사 칸토어 비트열 (0) | 2024.02.08 |
[142085] 디펜스 게임 (0) | 2024.02.07 |
[140107] 점 찍기 (0) | 2024.02.07 |
[138476] 귤 고르기 (0) | 2024.02.05 |