풀이 소요시간 : 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);
#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;
}