Bin's Blog

[프로그래머스] Level2 - 테이블 해시 함수(Javascript) 본문

Algorithm

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

hotIce 2023. 8. 21. 14:43
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝 문제 요약

1️⃣ 테이블은 2차원 행렬로 표현 열은 컬럼, 행은 튜플, 첫 번째 컬럼은 기본키로서 모든 튜플에 대해 그 값이 중복되지 않는다. 

2️⃣ col번째 컬럼의 값을 기준으로 오름차순 정렬을 하되 만약 그 값이 동일시 PK기준으로 내림차순 정렬을 한다.

3️⃣ 정렬된 데이터 S_i를 i번째 행의 튜플에 대해 각 컬럼의 값을 i로 나눈 나머지들의 합으로 정의한다.

4️⃣ row_begin <= i <= row_end인 S_i를 누적하여 bitwise XOR한 값을 해시 값으로서 반환한다. 

 

 정답 코드 

function solution(data, col, row_begin, row_end) {
    let answer = 0;
    let temp = [];
    let acc = 0;
    // col-1번째 값을 기준으로 정렬하되, 두개가 같으면 기본키의 값을 기준으로 정렬한다. 
    const sorted_data = data.sort((a, b) => a[col-1] - b[col-1] || b[0] - a[0])
    

    // data의 모든 요소에서
    for (let i = 0; i< data.length; i++) {
        // 반드시 다음 행으로 갈 때 누적값은 초기화 해줘야 한다. 
        acc = 0;
        for (let j = 0; j < data[0].length; j++) {
            // S_i를 i번째 행의 튜플에 대해 각 컬럼의 값을 i로 나눈 나머지들의 합으로 정의한다.
            acc += (sorted_data[i][j] % (i+1))
        }
        temp.push(acc);
    }

    // slice로 row_begin <= i <= row_end인 값들 구하기
    let scope_value = temp.slice(row_begin-1, row_end);
    
    // 범위에 해당하는 모든 S_i를 누적하여 bitwise XOR 한 값을 해시 값으로서 반환한다. 
    answer = scope_value.reduce((acc, val) => acc ^ val, 0);
    return answer
    

}

 

🖨️ 실행결과

 

📔느낀점

👉 처음에 다음 행을 지날때 값을 초기화를 시키지 않아서 틀렸었다. 

👉 문제의 요구사항을 준수하면서 문제를 해결했다. 

👉 다중 조건 정렬, slice로 범위 구하기, reduce로 범위의 값들을 XOR하기 이런 것들이 핵심이다. 

👉 메서드를 적재적소에 쓰는 법을 익히는 것이 중요한 거 같다. 

 

728x90