[Programmers] 테이블 해시함수(Lv.2)

Alice·2023년 6월 15일
0


풀이 소요시간 : 35분

문제 이름과는 다르게 굳이 따지자면 정렬 문제다. 사실 별다른 풀이 유형이 존재하는지는 잘 모르겠다. 요건에 맞게 정렬하고 합을 구하는 단순 구현 문제다.

이 문제를 풀면서 2차원 vector 를 각 vector 의 특정 요소 기준으로 정렬하는 방법을 공부하게 되었다.


bool Cmp(vector<int> A, vector<int> B) {
    if(A[COL - 1] == B[COL - 1]) {
        return A[0] > B[0];
    }
    return A[COL - 1] < B[COL - 1];
}

이럴테면, 이런 식으로 2차원 벡터 속 벡터들을 재배치(정렬) 할 수 있다. 각 벡터의 COL - 1 번째 원소를 기준으로 오름차순 정렬하고, 이 값이 같은경우 0번째 원소를 기준으로 내림차순 정렬한다. 그리고 sort 함수에 단지 이렇게 적어주면 된다. 여기서 data 는 2차원 벡터다.

sort(data.begin(), data.end(), Cmp);

이런식으로 2차원 벡터 속 1차원 벡터들의 위치를 재정렬 하는 것이 가능하다.

전체 코드


#include <vector>
#include <algorithm>
using namespace std;

int N, M; //N : 세로  M : 가로
int COL;
vector<int> Ans;


bool Cmp(vector<int> A, vector<int> B) {
    if(A[COL - 1] == B[COL - 1]) {
        return A[0] > B[0];
    }
    return A[COL - 1] < B[COL - 1];
}


int solution(vector<vector<int>> data, int col, int row_begin, int row_end) {
    
    N = data.size();
    M = data[0].size();
    COL = col;
    //전역 변수 초기화
    
    
    sort(data.begin(), data.end(), Cmp);
    //정렬
    
    
    //시작 열 -> 끝 열
    for(int i = row_begin - 1; i <= row_end - 1; i++) {
        int sum = 0;
        for(int k = 0; k < M; k++) {
            sum += (data[i][k] % (i + 1));
        }
        Ans.push_back(sum);
    }
    
    
    //정답 연산
    int Xor = Ans[0];
    for(int i = 1; i < Ans.size(); i++) {
        Xor ^= Ans[i];
    }
    return Xor;
    
    
}
profile
꾸준한 습관으로 만드는 내면의 견고함

0개의 댓글