[프로그래머스] 테이블 해시 함수 Javascript (lv2)

Taemin Jang·2023년 6월 12일
0

코딩테스트

목록 보기
9/9
post-thumbnail

문제 링크

[프로그래머스] 테이블 해시 함수

문제 설명

완호가 관리하는 어떤 데이터베이스의 한 테이블은 모두 정수 타입인 컬럼들로 이루어져 있습니다. 테이블은 2차원 행렬로 표현할 수 있으며 열은 컬럼을 나타내고, 행은 튜플을 나타냅니다.
첫 번째 컬럼은 기본키로서 모든 튜플에 대해 그 값이 중복되지 않도록 보장됩니다. 완호는 이 테이블에 대한 해시 함수를 다음과 같이 정의하였습니다.

  1. 해시 함수는 col, row_begin, row_end을 입력으로 받습니다.
  2. 테이블의 튜플을 col번째 컬럼의 값을 기준으로 오름차순 정렬을 하되, 만약 그 값이 동일하면 기본키인 첫 번째 컬럼의 값을 기준으로 내림차순 정렬합니다.
  3. 정렬된 데이터에서 S_i를 i 번째 행의 튜플에 대해 각 컬럼의 값을 i 로 나눈 나머지들의 합으로 정의합니다.
  4. 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
    • data[i][j]는 i + 1 번째 튜플의 j + 1 번째 컬럼의 값을 의미합니다.
  • 1 ≤ col ≤ data의 원소의 길이
  • 1 ≤ row_beginrow_enddata의 길이

입출력 예
data col row_begin row_end result
[[2,2,6],[1,5,10],[4,2,9],[3,8,3]] 2 2 3 4

입출력 예 설명
  • 정해진 방법에 따라 튜플을 정렬하면 {4, 2, 9}, {2, 2, 6}, {1, 5, 10}, {3, 8, 3} 이 됩니다.
  • S_2 = (2 mod 2) + (2 mod 2) + (6 mod 2) = 0 입니다.
  • S_3 = (1 mod 3) + (5 mod 3) + (10 mod 3) = 4 입니다.
  • 따라서 해시 값은 S_2 XOR S_ 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);
}
profile
하루하루 공부한 내용 기록하기

0개의 댓글