백준 [17140] "이차원 배열과 연산"

Kimbab1004·2024년 8월 21일
0

Algorithm

목록 보기
76/102

배열을 이용한 구현 문제였고 R 연산과 C연산 구현에는 성공하였지만 Pair의 1개 index에서 2개의 값을 추출해 하나의 다른 배열에 순서대로 넣는 점을 구현하지 못해 정답을 찾아보았다.

접근 방식은 맞았는데 마지막 넣는 것 만을 구현하지 못해 많이 아쉬웠다.

정답 출처

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


using namespace std;

int map[101][101];

int r, c, k;
int t = 0;
int check[101] = { 0 };

void find() {
	int row = 3;
	int column = 3;
	int ti = 0;

	while (true) {
		if (map[r][c] == k) {
			t = ti;
			break;
		}
		if (ti > 100) {
			t = -1;
			break;
		}

		if (row >= column) {
			int max_row = 0;
			for (int i = 1; i <= row; i++) {
				memset(check, 0, sizeof(check));
				vector<pair<int, int>> v;

				for (int j = 1; j <= row; j++) {
					check[map[i][j]]++;
				}

				for (int j = 1; j <= 101; j++) {
					if (check[j] != 0) {
						//숫자 횟수, 숫자 넣기
						v.push_back({ check[j],j });
					}
				}

				int len = v.size();
				max_row = max(len * 2, max_row);

				sort(v.begin(), v.end());

				for (int j = 1; j <= row; j++) {
					map[i][j] = 0;
				}
				int idx = 1;

				for (int j = 0; j < len; j++) {
					map[i][idx++] = v[j].second;
					map[i][idx++] = v[j].first;
				}

			}
			row = max_row;
		}
		else {
			int max_column = 0;
			for (int i = 1; i <= column; i++) {
				memset(check, 0, sizeof(check));
				vector<pair<int, int>> v;

				for (int j = 1; j <= column; j++) {
					check[map[j][i]]++;
				}

				for (int j = 1; j <= 101; j++) {
					if (check[j] != 0) {
						//숫자 횟수, 숫자 넣기
						v.push_back({ check[j],j });
					}
				}

				int len = v.size();
				max_column = max(len * 2, max_column);

				sort(v.begin(), v.end());

				for (int j = 1; j <= row; j++) {
					map[i][j] = 0;
				}

				int idx = 1;

				for (int j = 0; j < len; j++) {
					map[idx++][i] = v[j].second;
					map[idx++][i] = v[j].first;
				}

			}
			column = max_column;
		}
		ti++;
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> r >> c >> k;

	for (int i = 1; i <= 3; i++) {
		for (int j = 1; j <= 3; j++) {
			cin >> map[i][j];
		}
	}
	

	//바로 정답을 찾을 경우
	if (map[r][c] == k) {
		cout << 0;
		return 0;
	}

	find();

	cout << t;

	return 0;
}

0개의 댓글