문제 링크:
17140번: 이차원 배열과 연산
첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.
www.acmicpc.net
코드:
/* 오답-파악 1. r, c는 1부터이므로 -1해주기 */
/* 오답-문법 2. for문의 body가 2줄 이상이면 중괄호 생략 불가! */
/* 오답-설계 3. sz 갱신 시점 잘 잡기 */
/* 오답-파악 4. 0은 연산에 포함시키지 않기 */
/* 5. 마지막에 padding된 연속된 0만 skip, 나머지는 연산에 반영해야 한다. */
/* 6. container 상 아주 큰 값 -> boundary, traverse 방향 체크 필요! */
/* 7. 4번 틀림 그냥 0은 모두 skip */
#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
int r, c, k;
int arr[2][100][100];
int sz[2] = { 3, 3 };
int szi[100];
unordered_map<int, int> ctr;
vector<pair<int, int>> srt;
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> r >> c >> k; --r; --c; /* 1 */
for (int n = 0; n < 3; ++n) for (int m = 0; m < 3; ++m) {
int pnt; cin >> pnt;
arr[0][n][m] = arr[1][m][n] = pnt;
}
int t; bool a = false;
for (t = 0; t <= 100; ++t) {
if ((!a && arr[a][r][c] == k) || (a && arr[a][c][r] == k))
break;
if (a != (sz[0] < sz[1])) {
a = !a;
for (int o1 = 0; o1 < sz[a]; ++o1)
for (int o2 = 0; o2 < sz[!a]; ++o2)
arr[a][o1][o2] = arr[!a][o2][o1];
}
for (int o1 = 0; o1 < sz[a]; ++o1) {
ctr.clear();
for (int o2 = 0; o2 < sz[!a]; ++o2) { /* 2 */ /* 5 */ /* 6 */
if (arr[a][o1][o2] && !ctr.insert({ arr[a][o1][o2], 1 }).second) /* 7 */
++ctr[arr[a][o1][o2]];
}
srt.clear();
for (auto p : ctr)
srt.emplace_back(p.second, p.first);
sort(srt.begin(), srt.end());
int o2 = 0;
for (auto p : srt) {
arr[a][o1][o2++] = p.second;
arr[a][o1][o2++] = p.first;
}
szi[o1] = o2;
}
sz[!a] = *max_element(szi, szi + sz[a]); /* 3 */
for (int o1 = 0; o1 < sz[a]; ++o1)
fill(arr[a][o1] + szi[o1], arr[a][o1] + sz[!a], 0);
}
if (t == 101) cout << -1;
else cout << t;
return 0;
}