본문 바로가기

알고리즘/백준

백준 17140 이차원 배열과 연산

https://www.acmicpc.net/problem/17140

 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net

구현..구현 문제다... 아 힘들어...

 

/* 이차원 배열과 연산 */

#include <iostream>
#include <map>
#include <algorithm>
#include <vector>

#define pp pair<int,int>

using namespace std;

void input();
void solve();

inline bool comp(pp& a, pp& b) {
	if (a.second == b.second) {
		return a.first < b.first;
	}
	return a.second < b.second;
}

int r, c, k, R,C;
vector<vector<int>> v_main;

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	input();
	solve();
	return 0;
}

void input() {
	cin >> r >> c >> k;
	R = 3;
	C = 3;
	v_main.resize(4);
	for (int i = 1; i <= 3; i++) {
		v_main[i].resize(4);
		for (int j = 1; j <= 3; j++) {
			cin >> v_main[i][j];
		}
	}
}

void solve() {
	int time = 0;
	
	while (true) {
		vector<vector<int>> v_temp;

		int maxi = 0;

		if (r <= R && c <= C&& v_main[r][c] == k) 
			break;
		if (time > 100) {
			time = -1;
			break;
		}
	
		time++;
		if (R >= C) {
			v_temp.resize(R + 1);
			for (int i = 1; i <= R; i++) {
				vector<pp> v;
				map<int, int> m;
				for (int j = 1; j <= C; j++) {
					// 없으면
					if (m.count(v_main[i][j]) == 0) {
						m.insert(make_pair(v_main[i][j], 1));
					}
					// 있으면
					else {
						m.find(v_main[i][j])->second++;
					}
				}
				m.erase(0);
				maxi = max(maxi, 2 * (int)m.size());
				
				//한 행 다 끝났음. 

				// m은 {숫자, 개수}로 정리되어있는데 우선 개수 기준으로 오름차순을 하므로
				// 개수 기준으로 오름차순 한 뒤에 숫자 기준으로 오름차순을 한다. 
				// 그럴려면 vector v에 개수부터 넣어야 한다. 
				for (auto iter = m.begin(); iter != m.end(); iter++) {
					if (iter->first == 0)
						continue;
					v.push_back(make_pair(iter->first, iter->second));
				}

				// value, key 순으로 나열된다. 
				sort(v.begin(), v.end(), comp);
				
				v_temp[i].push_back(0);
				//  입력한다.
				for (auto k : v) {
					v_temp[i].push_back(k.first);
					v_temp[i].push_back(k.second);
				}
			}

			// 다 정렬했으면 원래 함수에 옮겨야한다. 
			for (int i = 1; i <= R; i++) {
				v_temp[i].resize(maxi + 1, 0);
			}
			C = min(100 + 1, maxi);

			v_main = v_temp;
		}

		else {
			v_temp.resize(C + 1);
			for (int i = 1; i <= C; i++) {
				vector<pp> v;
				map<int, int> m;
				for (int j = 1; j <= R; j++) {
					// 없으면
					if (m.count(v_main[j][i]) == 0) {
						m.insert(make_pair(v_main[j][i], 1));
					}
					// 있으면
					else {
						m.find(v_main[j][i])->second++;
					}
				}
				m.erase(0);
				maxi = max(maxi,2 * (int)m.size());
				
				//한 열 다 끝났음. 숫자// 개수// 로 저장되어 있던걸
				// 정렬을 위해서 개수, 숫자로 저장한다. 
				for (auto iter = m.begin(); iter != m.end(); iter++) {
					if (iter->first == 0) continue;
					v.push_back(make_pair(iter->first, iter->second));
				}

				// 정렬하면 개수 오름차순, 동일개수는 숫자 오름차순이 된다.
				sort(v.begin(), v.end(), comp);
				v_temp[i].push_back(0);

				for (auto k : v) {
					v_temp[i].push_back(k.first);
					v_temp[i].push_back(k.second);
				}
			}

			// 다 정렬했으면 원래 함수에 옮겨야한다. 
			for (int i = 1; i <= C; i++) {
				v_temp[i].resize(maxi + 1, 0);
			}
			
			vector<vector<int>> vv;
			vv.resize(maxi+1);

			for (int i = 1; i <= maxi; i++) {
				vv[i].resize(C + 1, 0);
			}
			R = min(100 + 1, maxi);
			for (int i = 1; i <= C; i++) {
				for (int j = 1; j <= maxi; j++) {
					vv[j][i] = v_temp[i][j];
				
				};
			}

			v_main = vv;
		}
	}

	cout << time << '\n';
	return;
}

 

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 10165 버스 노선  (0) 2020.08.30
백준 1256 사전  (0) 2020.08.29
백준 5719 거의 최단 경로  (0) 2020.08.28
백준 5557 1학년  (0) 2020.08.28
백준 1162 도로포장  (0) 2020.08.27