algorithm/코딩 테스트
테이블 해시 함수
토끼띠NJW
2023. 7. 15. 18:00
문제 설명
열은 컬럼을 나타내고 행은 튜플을 나타내는 2차원 배열이 있다. col 번째 컬럼을 오름차순으로 정렬하되 그 값이 동일하면 첫 번째 컬럼의 값으로 내림차순 정렬을 한다.
그리고 row_begin부터 row_end까지의 값에다가 해당 튜플을 나눈 나머지의 전체 합을 s_i라고 할 때 각 s_i의 누적 xor 값을 반환하는 문제이다.
https://school.programmers.co.kr/learn/courses/30/lessons/147354?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
첫 번째 접근
일단 주어진 조건에 맞게 2차원 배열을 정렬해줘야 한다.
파이썬
data.sort(key = lambda x: (x[col-1], -x[0]))
자바
Arrays.sort(data, (o1, o2) -> {
if(o1[col-1]==o2[col-1]){
return -(o1[0] - o2[0]);
}
return o1[col-1] - o2[col-1];
});
Arrays.sort(data, new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2){
if(o1[col-1] == o2[col-1]){
return -(o1[0]-o2[0]);
}else{
return o1[col-1]-o2[col-1];
}
}
});
자바는 둘 중에 하나만 써도 되지만 첫 번째 있는 것이 더 보기 편하고 또 쓰기도 편할 듯하다.
그리고 2차원 배열을 row_begin부터 row_end까지 돌면서 해당하는 각 튜플을 i+1만큼 나눈 값을 더해줬다. 안쪽의 배열이 끝나면 ^(xor 연산)을 이용해 값을 누적해줬다.
코드
python
def solution(data, col, row_begin, row_end):
answer = 0
data.sort(key = lambda x: (x[col-1], -x[0]))
row_begin -= 1
tmpArr = []
for i in range(row_begin, row_end):
tmp = 0
for j in range(len(data[i])):
tmp += data[i][j]%(i+1)
answer = answer ^ tmp
return answer
java
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) -> {
if(o1[col-1]==o2[col-1]){
return -(o1[0] - o2[0]);
}
return o1[col-1] - o2[col-1];
});
/*
Arrays.sort(data, new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2){
if(o1[col-1] == o2[col-1]){
return -(o1[0]-o2[0]);
}else{
return o1[col-1]-o2[col-1];
}
}
});*/
row_begin -= 1;
for(int i=row_begin; i<row_end; i++){
int tmp = 0;
for(int j=0; j<data[i].length; j++){
tmp += (data[i][j]%(i+1));
// System.out.print(data[i][j]);
}
answer = answer ^ tmp;
// System.out.println();
}
return answer;
}
}