큰 특이한 점 없이 주어진데로 구현하면 된다.
R연산은 row에 대해 하는 것이라 직관적으로 바로 가능하고,
C연산이 col에 대해 하고, 결과 값도 col으로 적어서 transpose가 필요하다.
이번엔 그냥 직접 구현했는데, 다음엔 transpose 관련 STL을 써보도록 연습하는걸로..
하나 주의할 점은 문제에서 주어진 r, c가 항상 배열의 바운더리에 포함되어있다는 보장이 없다.
이것때문에 에러 어딘지 제대로 못찾고 살짝 삽질했다;
그리고 100초 넘기면 바로 return하면 되는데, 괜히 밑에서 return 전에 따로 체크해줬다가 제출하면서 outofbounds 에러를 겪었다;
구현을 간소화하는 습관을 들여야 할 것 같다...
이 코드도 문제가 쉬워보여서 처음에 대충 구현하다 누더기로 붙이다보니 코드가 좀 더러워졌다.
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int r, c, k;
void Print_Map(const vector<vector<int>> map)
{
printf("Print Map : \n");
for (int i = 0; i < map.size(); i++) {
for (int j = 0; j < map[i].size(); j++)
printf("%d ", map[i][j]);
printf("\n");
}
}
typedef struct __num_cnt {
int num;
int cnt;
} num_cnt;
int cur_row_size = 3;
int cur_col_size = 3;
bool comp(num_cnt a, num_cnt b)
{
if (a.cnt == b.cnt)
return a.num < b.num;
return a.cnt < b.cnt;
}
const inline void padding_zero(vector<vector<int>>& map, int size)
{
for (int i = 0; i < map.size(); i++)
while (map[i].size() != size)
map[i].push_back(0);
}
vector<vector<int>> do_R_op(const vector<vector<int>> map)
{
vector<vector<int>> new_map;
int local_size = 0;
for (int i = 0; i < map.size(); i++) {
int countMap[105] = { 0, };
for (int j = 0; j < map[i].size(); j++) {
if (map[i][j] == 0)
continue;
countMap[map[i][j]]++;
}
vector<num_cnt> row_vector;
for (int j = 0; j < 105; j++)
if (countMap[j] != 0)
row_vector.push_back({ j, countMap[j] });
sort(row_vector.begin(), row_vector.end(), comp);
vector<int> tmp, row_result;
for (int j = 0; j < row_vector.size(); j++) {
tmp.push_back(row_vector[j].num);
tmp.push_back(row_vector[j].cnt);
}
if (tmp.size() > 100) {
for (int k = 0; k < 100; k++)
row_result.push_back(tmp[k]);
}
else {
row_result = tmp;
}
if (row_result.size() > local_size)
local_size = row_result.size();
new_map.push_back(row_result);
}
cur_row_size = new_map.size();
cur_col_size = local_size;
padding_zero(new_map, local_size);
return new_map;
}
vector<vector<int>> do_C_op(const vector<vector<int>> map)
{
vector<vector<int>> trans_map;
int local_size = 0;
for (int i = 0; i < cur_col_size; i++) {
vector<int> trans_vector;
int countMap[105] = { 0, };
for (int j = 0; j < cur_row_size; j++) {
if (map[j][i] == 0)
continue;
countMap[map[j][i]]++;
}
vector<num_cnt> col_vector;
for (int j = 0; j < 105; j++)
if (countMap[j] != 0)
col_vector.push_back({ j, countMap[j] });
sort(col_vector.begin(), col_vector.end(), comp);
vector<int> tmp, row_result;
for (int j = 0; j < col_vector.size(); j++) {
tmp.push_back(col_vector[j].num);
tmp.push_back(col_vector[j].cnt);
}
if (tmp.size() > 100) {
for (int k = 0; k < 100; k++)
row_result.push_back(tmp[k]);
}
else {
row_result = tmp;
}
if (row_result.size() > local_size)
local_size = row_result.size();
trans_map.push_back(row_result);
}
int row_size = trans_map.size();
padding_zero(trans_map, local_size);
vector<vector<int>> nmap(local_size, vector<int>(row_size, 0));
for (int i = 0; i < row_size; i++)
for (int j = 0; j < local_size; j++)
nmap[j][i] = trans_map[i][j];
cur_row_size = local_size;
cur_col_size = row_size;
return nmap;
}
int main(void)
{
int result = 0;
vector<vector<int>> map(3, vector<int>(3, 0));
cin >> r >> c >> k;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
cin >> map[i][j];
while (1) {
if (r - 1 < cur_row_size && c - 1 < cur_col_size)
if (map[r - 1][c - 1] == k)
break;
if (result > 100) {
printf("-1");
return 0;
}
if(cur_row_size >= cur_col_size)
map = do_R_op(map);
else
map = do_C_op(map);
result++;
}
cout << result << "\n";
return 0;
}