컴퓨터 공학 기초/알고리즘 (구현)

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

JongSeok_12 2020. 7. 28. 19:37

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

해당 문제는 간단한 구현 문제이다.

Y, X, K 값이 주어지며 배열의 Y, X 번째 요소가 K가 되는 경우를 찾는 문제이다.

3 * 3 에 해당하는 2차원 배열에 각 수가 주어지며 다음과 같은 조건일 때 배열이 변화한다.

Y 축의 값과 X축의 값을 비교했을 때 Y 축의 값이 X 보다 크거나 같다면 X축의 값을들 비교한다.

위의 경우가 아닌경우 Y축의 값들을 비교한다.

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;
int my = 3, mx = 3;
int map[100][100];
struct Node{
	int overLap;
	int num;
};

bool comps(Node a, Node b){
	if (a.overLap < b.overLap) return true;
	else if (a.overLap == b.overLap){
		if (a.num < b.num) return true;
		else return false;
	}
	else return false;
}

void checkR(){

	int cpMap[100][100] = { 0 };
	int tmpY = 0;
	int maxx = 0;
	
    // X 축을 고정으로 Y축을 변경해가며 Y축의 값들을 정렬한다.
	for (int x = 0; x < mx; ++x){
		int idx = 0;
		vector<int> idxList;
		vector<Node> result;
		Node nodeList[150] = { 0 };

		for (int y = 0; y < my; ++y){
			if (map[y][x] == 0) continue;
            // 만약 배열의 현재 요소가 0 보다 크면서 한번도 나오지 않은 숫자일경우
			if (nodeList[map[y][x]].overLap == 0){
				idxList.push_back(map[y][x]);
				nodeList[map[y][x]].num = map[y][x];
			};
            // 배열의 숫자에 해당하는 인덱스의 중첩 값 ++
			nodeList[map[y][x]].overLap++;
		}

		int n = idxList.size();

		for (int j = 0; j < n; ++j){
			result.push_back(nodeList[idxList[j]]);
		}
		sort(result.begin(), result.end(), comps);

		for (int j = 0; j < n; ++j){
			if (result[j].num == 0) break;
			if (idx >= 100) break;
			if (idx + 2 > tmpY) tmpY = idx + 2;
			cpMap[idx][x] = result[j].num;
			cpMap[idx + 1][x] = result[j].overLap;
			idx += 2;
		}
	}
	memcpy(map, cpMap, 4 * 100 * 100);
	my = tmpY;
}

void checkC(){
	int cpMap[100][100] = { 0 };
	int tmpX = 0;
	int maxx = 0;
	for (int i = 0; i < my; ++i){
		int idx = 0;
		vector<int> idxList;
		vector<Node> result;
		Node nodeList[150] = { 0 };

		for (int j = 0; j < mx; ++j){
			if (map[i][j] == 0) continue;
			if (nodeList[map[i][j]].overLap == 0){ 
				idxList.push_back(map[i][j]);
				nodeList[map[i][j]].num = map[i][j];
			};
			nodeList[map[i][j]].overLap++;
		}

		int n = idxList.size();

		for (int j = 0; j < n; ++j){
			result.push_back(nodeList[idxList[j]]);
		}
		sort(result.begin(), result.end(), comps);
		
		for (int j = 0; j < n; ++j){
			if (result[j].num == 0) break;
			if (idx >= 100) break;
			if (idx + 2 > tmpX) tmpX = idx + 2;
			cpMap[i][idx] = result[j].num;
			cpMap[i][idx + 1] = result[j].overLap;
			idx += 2;
		}
	}
	memcpy(map, cpMap, 4 * 100 * 100);
	mx = tmpX;
}

int main(){
	//freopen_s(new FILE*, "tes.text", "r", stdin);
	int ty, tx, k;
	int cnt = 0;

	cin >> ty >> tx >> k;
	ty--; tx--;

	for (int i = 0; i < 3; ++i){
		for (int j = 0; j < 3; ++j){
			cin >> map[i][j];
		}
	}
	
	while (1){
		if (map[ty][tx] >= 100) break;
		if (map[ty][tx] == k) break;
		if (cnt > 100) {
			cnt = -1;
			break;
		}
		if (my >= mx) checkC();
		else if (my < mx) checkR();
		++cnt;
	}
	printf("%d ", cnt);
}