프로그래머스 코딩테스트 (5) - 테이블 해시 함수

박규범·2023년 3월 3일
1
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 함수를 완성해주세요.

👨🏻‍💻 코드와 분석

function solution(data, col, row_begin, row_end) {
  var answer = 0;

  // col의 열을 먼저 오름차순 한다.
  // col의 열끼리 비교했을 때 같다면, 0번째 열을 내림차순으로 비교한다.
  data = data.sort((a, b) => {
    if (a[col - 1] > b[col - 1]) return 1;
    else if (a[col - 1] < b[col - 1]) return -1;
    else if (a[col - 1] === b[col - 1]) {
      if (a[0] < b[0]) return 1;
      else if (a[0] > b[0]) return -1;
      else return 0;
    }
    return 0;
  });

  // row_begin과 end 값을 포함하고 사이값만 루프를 태운다.
  // 각 배열 값을 인덱스로 나누고 나머지 값을 더한뒤 XOR 연산을 한 값을 더해준다.
  for (let i = row_begin; i <= row_end; i++) {
    answer ^= data[i - 1].reduce((a, c) => a + (c % i), 0);
  }

  return answer;
}

😀 마무리

제목이 해시 테이블 함수여서 일단 해시테이블에 대한 공부를 먼저했다. (관련해서 정리한 내용은 해시 테이블 에서 확인할 수 있다!)
문제의 내용은 그렇게 어렵지 않은 내용이였고 잘~ 읽어본다면 쉽게 해결할 수 있다!

profile
즐겁게 코딩합시다 😀

0개의 댓글