완호가 관리하는 어떤 데이터베이스의 한 테이블은 모두 정수 타입인 컬럼들로 이루어져 있습니다. 테이블은 2차원 행렬로 표현할 수 있으며 열은 컬럼을 나타내고, 행은 튜플을 나타냅니다.
첫 번째 컬럼은 기본키로서 모든 튜플에 대해 그 값이 중복되지 않도록 보장됩니다. 완호는 이 테이블에 대한 해시 함수를 다음과 같이 정의하였습니다.
col
, row_begin
, row_end
을 입력으로 받습니다.col
번째 컬럼의 값을 기준으로 오름차순 정렬을 하되, 만약 그 값이 동일하면 기본키인 첫 번째 컬럼의 값을 기준으로 내림차순 정렬합니다.row_begin
≤ i ≤ row_end
인 모든 S_i를 누적하여 bitwise XOR 한 값을 해시 값으로서 반환합니다.테이블의 데이터 data
와 해시 함수에 대한 입력 col
, row_begin
, row_end
이 주어졌을 때 테이블의 해시 값을 return 하도록 solution 함수를 완성해주세요.
data
의 길이 ≤ 2,500data
의 원소의 길이 ≤ 500data
[i][j] ≤ 1,000,000
data
[i][j]는 i + 1 번째 튜플의 j + 1 번째 컬럼의 값을 의미합니다.data
의 원소의 길이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 |
주어진 예시를 테이블로 이해하기 쉽게 그려봤다.
우선 테이블을 정렬시켜야하는데 col = 2이므로 해당 그림에서 col이 2에 해당하는 값을 기준으로 sort 메서드를 사용했다.
sort 메서드를 사용하는데 col 2의 값이 같을 조건을 넣어주고 같으면 col 1 값을 기준으로 내림차순 아니면 오름차순으로 정렬을 해준다.
다음이 이제 중요한데, 예시에서 data의 col이 3까지 나왔다고 다른 테스트 코드도 3개라고 생각하면 안된다.
나는 처음에 3개라 생각해서 인덱스를 고정시켰다가 나머지 테스트 코드를 통과하지 못했다.
그리고 결과물을 각각 비교하여 xor 연산을 해줘야 하는데 자바스크립트에서 xor 연산은 ^로 할 수 있다.
따라서 각 코드를 reduce를 돌려서 xor 연산하고 더한 값을 리턴해주면 된다.
function solution(data, col, row_begin, row_end) {
const sortData = data.sort((a,b) => a[col - 1] === b[col - 1] ? b[0] - a[0] : a[col - 1] - b[col - 1]);
const arr = [];
for(let i = row_begin; i <= row_end; i++){
const xor = sortData[i-1].reduce((arr, cur) => arr + (cur % i), 0);
arr.push(xor);
}
return arr.reduce((arr, cur) => arr ^ cur, 0);
}