어흥

[프로그래머스] 테이블 해시 함수(C++) 본문

알고리즘/프로그래머스

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

라이언납시오 2023. 8. 7. 16:40
728x90
반응형

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/147354

 

프로그래머스

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

programmers.co.kr

1. 주의할 점

- 행과 열이 0이 아닌 1부터 시작한다

- 한번은 오름차순 정렬, 한번은 내림차순 정렬이다

- 원소들의 합에 대한 mod 연산이 아닌, 각 원소의 mod 연산에 대한 합이다

- 첫 mod 합은 XOR 연산을 수행하지 않는다 

 

2. 구현

- 조건에 따른 정렬을 하는 우선순위 큐를 사용한다

- 해시값에 대해서 XOR 연산을 계속해서 수행한다

#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
struct info{
    int idx,colVal,keyVal;
};
struct cmp{
    bool operator()(info &a, info &b){
    	//기본키에 대한 내림차순 정렬
        if(a.colVal==b.colVal){
            return a.keyVal < b.keyVal;
        }
        //col 칼럼에 대한 오름차순 정렬
        return a.colVal > b.colVal;
    }
};
using namespace std;

int solution(vector<vector<int>> data, int col, int row_begin, int row_end) {
	//answer 최초 초기화
    int answer = -1;
    priority_queue<info,vector<info>,cmp> pq;
    for(int i=0;i<data.size();i++)
        pq.push({i,data[i][col-1],data[i][0]});
    
    int cnt = 1;
    while(!pq.empty()){
        info ii = pq.top();
        pq.pop();
        if(row_begin<=cnt && cnt<=row_end){
            int sum = 0;
            for(int j=0;j<data[ii.idx].size();j++){
                int remain = data[ii.idx][j]%cnt;
                sum+=remain;
            }
            if(answer==-1) answer = sum;
            else answer^=sum;
        }
        cnt++;
    }
    return answer;
}

 

728x90
반응형
Comments