본문 바로가기
CS/알고리즘

백준 17140 이차원 배열과 연산(시뮬)

by zieunee 2020. 5. 6.
반응형

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

 

3시간 이내에 푼 문제 .. 이렇게만 나왔으면 

 

#include<iostream>
#include<algorithm>
#include<vector>	
#include<string.h>
using namespace std;

int map[101][101]; 
int R,C,K;
int res;
int arr[102];
int r, c;
int rr, cc;
vector <pair<int, int>> v;

bool compare(const pair<int, int>& a, const pair<int, int>& b) {
	if (a.first == b.first)
		return a.second < b.second;
	return a.first < b.first;
}

void solve() {
	while (-1) {
		memset(arr, 0, sizeof(arr));

		if (map[R][C] == K) {
			printf("%d", res);
			break;
		}
		if (res > 100) {
			printf("-1");
			break;
		}

		// r 행 , c 열 
		if (r >= c) {
			//R연산 모든 행
			for (int i = 0; i < r; i++) { //행
				for (int j = 0; j < c; j++) { //열
					if (map[i][j] != 0) {
						arr[map[i][j]]++;

					}
				}
				for (int z = 1; z <= 100; z++) {
					if (arr[z] != 0) {
						v.push_back({ arr[z],z });
					}
				}
				for (int j = 0; j < c; j++) {
					map[i][j] = 0;
				}

				//횟수, 수 순서 
				sort(v.begin(), v.end(), compare);

				// 큰 배열 기준으로 나머지 0으로 채워넣기 
				int vsize = v.size() * 2;
				cc = max(cc, vsize);
				rr = r;


				for (int cp = 0; cp < v.size(); cp++) {
					map[i][cp * 2] = v[cp].second;
					map[i][cp * 2 + 1] = v[cp].first;
				}
				memset(arr, 0, sizeof(arr));
				v.clear();
			}

		}
		else {
			//C연산  모든 열
			for (int j = 0; j < c; j++) { //열
				for (int i = 0; i < r; i++) { //행
					if (map[i][j] != 0) {
						arr[map[i][j]]++;
					}
				}
				for (int z = 1; z <= 100; z++) {
					if (arr[z] != 0) {
						v.push_back({ arr[z],z });
					}
				}
				for (int i = 0; i < r; i++) {
					map[i][j] = 0;
				}
				//횟수, 수 순서 
				sort(v.begin(), v.end(), compare);

				// 큰 배열 기준으로 나머지 0으로 채워넣기 
				int vsize = v.size() * 2;
				rr = max(rr, vsize);
				cc = c;
				
				for (int cp = 0; cp < v.size(); cp++) {
					map[cp*2][j] =  v[cp].second;
					map[cp * 2 + 1][j] = v[cp].first;
				}
				memset(arr, 0, sizeof(arr));
				v.clear();
			}

		}

		r = rr; c = cc;
		res++;
	}
}
int main() {

	scanf("%d%d%d", &R, &C, &K);
	R = R - 1;
	C = C - 1;
	res = 0;
	memset(map, 0, sizeof(map));

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			scanf("%d",&map[i][j]);
		}
	}

	r = 3; c = 3;
	solve();

}
반응형

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

백준 1063 킹(시뮬)_String  (0) 2020.05.06
백준 17822 원판 돌리기(시뮬)  (0) 2020.05.06
백준 17825 주사위 윷놀이(시뮬+dfs)  (0) 2020.05.06
백준 17143 낚시왕(시뮬)  (0) 2020.05.06
백준 16236 아기상어(bfs)  (0) 2020.05.06