STUDY/알고리즘

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

디리릭 2023. 9. 10. 19:24
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/147354

 

프로그래머스

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

programmers.co.kr

 

이 문제를 풀기 위해서 크게 3단계 과정이 필요하다. 

  1. 주어진 data 정렬하기
  2. row_begin ~ row_end 사이 행의 튜플을 각 행의 인덱스로 나눠 그 나머지 값을 더한다. 
  3. 각 행 누적값을 xor 연산으로 더한다. 

 

첫번째 과정을 구현한 함수가 sortData이다. 

문제에서 주어진 방법대로 col번째 컬럼 기준으로 오름차순하고, 

만약 값이 같을 경우에는 key값인  첫번째 컬럼 기준으로 내림차순을 해 정렬해준다. 

 

두번째 과정을 위해 row_begin ~ row_end 사이의 행만 추리기 위해 slice 내장함수를 사용했다. 

그리고 각 행마다 행의 인덱스로 나머지값을 구해 누적하는 값을 구해준게 result이다. 

 

마지막 과정으로 result 리스트의 값을 xor 연산을 해줬다. 그게 (a ^ b) 이다. 

 

 

구현한 코드는 아래와 같다. 👇👇👇

function solution(data, col, row_begin, row_end) {
    const sortedData = sortData(data,col-1);
    const sliceData = sortedData.slice(row_begin-1,row_end);
    
    const result = sliceData.map((tp,i)=>
        tp.reduce((ac,cur)=> (cur%(row_begin+i)) + ac ,0)
    )
    
    return result.reduce((ac,cur)=> ac ^ cur , 0);
}

function sortData(data, targetCol){
    return data.sort((a,b)=> {
        if(a[targetCol] === b[targetCol]){
            return b[0]- a[0];
        }
        return a[targetCol] - b[targetCol];
    })
    
}
728x90