[코테] 테이블 해시 함수 (해시)

ekil·2026년 3월 29일

코딩테스트

목록 보기
4/14

테이블 해시 함수 (해시)

2026.3.29.

https://school.programmers.co.kr/learn/courses/30/lessons/147354?language=javascript

핵심 개념

  • 테이블 개념 (row, column으로 구성된 이차원 배열에 대한 개념적 이해)
  • 코드 내에서 접근할 때의 index(0-based)와 문제에서 말하는 col번째(1-based)의 차이 구별: 이전에 다른 문제들에서 접했던 개념이고, 코드 추가할 때마다 어떤 값이 나오는지 계속 console 로깅하면서 왜 정렬이 의도대로 안되는지 고민해보다 알아챔
  • JavaScript % 연산자, ^ 연산자 - ^ 연산자는 살면서 쓸일이 없었어서 처음 써봤다. 문제에 냅다 'bitwise XOR' 연산을 수행하래서 그게 뭔데.. 하면서 개념 찾아보니 이진수로 변환해서 두 수를 자릿수별로 비교하는데, 값이 같으면 0을 다르면 1을 리턴하게 하고 그 결괏값을 리턴하라는 것이었다. . (결괏값도 이진법으로 적혀있는데 문제에서 반환하라는 값은 십진법 베이스여서 다시 역산이 필요)
    클로드에게 이거 직접 연산하는 게 맞는지 물어보니 ^ 연산자를 쓰면 된다고 힌트를 줘서 사용했다.

내 풀이

function solution(data, col, row_begin, row_end) {
    // 정렬부터
    const sorted = data.sort((a, b) => a[col - 1] === b[col - 1] ? b[0] - a[0] : a[col - 1] - b[col - 1]);

    let result = 0;
    
    // S_i 구하기
    // row_begin ~ row_end 빼먹는 것 없이 실행
    for (let i = row_begin - 1; i < row_end; i++) {
        const row = sorted[i];
        const sum = row.reduce((acc, cur) => acc + cur % (i + 1), 0);
        
        result = result ^ sum;
    }
    
    return result;
}

개선된 풀이

function solution(data, col, row_begin, row_end) {
    // 정렬부터
    const sorted = [...data].sort((a, b) => a[col - 1] === b[col - 1] ? b[0] - a[0] : a[col - 1] - b[col - 1]);

    let result = 0;
    
    // S_i 구하기
    // row_begin ~ row_end 빼먹는 것 없이 실행
    for (let i = row_begin - 1; i < row_end; i++) {
        const row = sorted[i];
        const sum = row.reduce((acc, cur) => acc + cur % (i + 1), 0);
        
        result = result ^ sum;
    }
    
    return result;
}

핵심 차이

  • 이미 깔끔하다고.. ㅎㅎㅎ
  • sort()는 원본 배열을 변경하므로 spread 연산자를 사용해 새 배열을 생성하고 그것을 정렬하는 것이 안전하다.

막혔던 포인트

  • bitwise XOR 개념을 몰라서
  • 오히려 근데 문제가 논리적으로 로직으로 옮기기만 하면 되는 형태여서 고민할 부분이 적었다.

풀면서 찾은 개념

  • 오늘도 reduce 문서 다시보기~ 세번째 인자로 currentIndex를 받을 수 있음을 체크하고, 반복문 안에서 reduce 호출할 때 그 값도 사용하려 했는데, cur 값이 이미 해당 row의 컬럼값이 찍히고 있었다. 그래서 인덱스는 필요가 없었음. 이미 row에 대해서 반복을 돌리고 있어서 그런 거네.

다음에 비슷한 문제 만나면

반복문 인덱스(0-based)와 문제의 행 번호(1-based)가 다를때

  • i로 배열 접근, i+1로 계산에 사용
  • console.log로 값 찍어가며 확인하는 습관이 도움됨
profile
좋아하는 일을 잘함으로써 먹고살고 싶은 프론트엔드 개발자입니다.

1개의 댓글

comment-user-thumbnail
2026년 3월 29일

이 문제는 해시 개념을 이용하는 문제라기보다, 정렬 + 구현 능력을 보는 문제에 가깝다. 해시 유형으로 분류된 이유는 문제의 "소재"가 해시 함수여서라고 보는 게 맞다. (해시 함수 자체를 구현하는 문제)

답글 달기