본문 바로가기

code/BOJ

백준 17140 이차원 배열과 연산

문제 링크:

 

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;
}