완호가 관리하는 어떤 데이터베이스의 한 테이블은 모두 정수 타입인 컬럼들로 이루어져 있습니다. 테이블은 2차원 행렬로 표현할 수 있으며 열은 컬럼을 나타내고, 행은 튜플을 나타냅니다. 첫 번째 컬럼은 기본키로서 모든 튜플에 대해 그 값이 중복되지 않도록 보장됩니다. 완호는 이 테이블에 대한 해시 함수를 다음과 같이 정의하였습니다.
테이블의 데이터 data와 해시 함수에 대한 입력 col, row_begin, row_end이 주어졌을 때 테이블의 해시 값을 return 하도록 solution 함수를 완성해주세요.
| data | col | row_begin | row_end | result |
|---|---|---|---|---|
| [[2,2,6],[1,5,10],[4,2,9],[3,8,3]] | 2 | 2 | 3 | 4 |
sort() 함수를 통해 직접 compare를 구현해서 풀 것이고, 3~4번 과정은 row_begin부터 row_end까지의 행을 각각 계산하면서 bitwise XOR 연산을 하면 될 것으로 보인다.O(N*logN) 만큼의 시간복잡도가 걸릴 것으로 추정되고, 3, 4번 과정은 (row_end - row_begin) * data의 원소 길이만큼의 시간복잡도로 O(N*d)가 걸릴 것으로 추정되기 때문에 총 O(N*(logN+d))의 시간복잡도가 걸릴 것으로 추정되고 여기서 N은 최대 2,500이고 d는 최대 500이기 때문에 충분히 알맞은 알고리즘으로 보인다.#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> data, int col, int row_begin, int row_end) {
int answer = 0;
// 정렬
sort(data.begin(), data.end(), [col](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];
});
// i번째 행의 튜플에 대해 각 값을 i로 나눈 나머지의 합을 구하기
for(int i = row_begin - 1; i <= row_end - 1; i++){
int sum = 0;
for(int j = 0; j < data[i].size(); j++){
sum += data[i][j] % (i + 1);
}
// bitwise XOR 연산
answer = answer ^ sum;
}
return answer;
}
하노이 탑(Tower of Hanoi)은 퍼즐의 일종입니다. 세 개의 기둥과 이 기동에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있습니다. 게임의 목적은 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것입니다.
하노이 탑의 세 개의 기둥을 왼쪽 부터 1번, 2번, 3번이라고 하겠습니다. 1번에는 n개의 원판이 있고 이 n개의 원판을 3번 원판으로 최소 횟수로 옮기려고 합니다.
1번 기둥에 있는 원판의 개수 n이 매개변수로 주어질 때, n개의 원판을 3번 원판으로 최소로 옮기는 방법을 return하는 solution를 완성해주세요.
| n | result |
|---|---|
| 2 | [[1,2],[1,3],[2,3]] |




O(2^N)만큼이 걸릴 것으로 추정되고, N의 최대가 15기 때문에 알맞은 알고리즘으로 보인다.#include <string>
#include <vector>
using namespace std;
void hanoi(int n, int start, int end, int via, vector<vector<int>>& answer){
if(n == 1){
answer.push_back(vector<int>{start, end});
return;
}
hanoi(n - 1, start, via, end, answer);
answer.push_back(vector<int>{start, end});
hanoi(n - 1, via, end, start, answer);
}
vector<vector<int>> solution(int n) {
vector<vector<int>> answer;
hanoi(n, 1, 3, 2, answer);
return answer;
}