순간을 성실히, 화려함보단 꾸준함을

[ boj : 17140 ] 이차원 배열과 연산 본문

알고리즘,SQL/백준,BOJ

[ boj : 17140 ] 이차원 배열과 연산

폭발토끼 2021. 7. 11. 11:38

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

문제 : 문제 그냥 읽고 오세요

해설 : 삼성문제 치고는 '그나마' 쉽게 나온 문제였네요. 

각 행과 열에서 각 수가 얼만큼 나왔는지 개수를 세고 개수를 기준으로 정렬을 해야하니 

개수를 세기 위해 필요한 map을 선언해주고

정렬을 하기 위한 vector를 선언해줍니다.

그리고 하나씩 vector에서 값들을 빼주어 채워주면서 매번 갱신해 주면 됩니다.

#include<bits/stdc++.h>

using namespace std;

int r, c, k;
int x = 3, y = 3;
int arr[110][110];

void garo();
void sero();
void show();

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> r >> c >> k;
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			cin >> arr[i][j];
	int t = 0,ans=-1;
	while (true) 
	{
		if (t > 100)break;
		if (arr[r - 1][c - 1] == k) {
			ans = t;
			break;
		}
		if (x >= y) 
			garo();		
		else 
			sero();
		
		t++;
	}
	cout << ans;
	return 0;
}
void garo()
{
	map<int, int> m;
	vector<pair<int, int>> v;

	for (int i = 0; i < 100; i++) {
		for (int j = 0; j < 100; j++)
			if (arr[i][j] != 0) {
				m[arr[i][j]]++;
				arr[i][j] = 0;
			}
		
		for (pair<int, int> u : m) 
			v.push_back(u);
		sort(v.begin(), v.end(), [](pair<int, int> a, pair<int, int> b)->bool {
			if (a.second == b.second)
				return a.first < b.first;
			return a.second < b.second;
			});

		int cur = 0;
		for (pair<int, int> u : v) {
			arr[i][cur] = u.first;
			arr[i][cur + 1] = u.second;
			cur += 2;
		}
		y = max(y, cur);
		m.clear();
		v.clear();
	}
	//show();
}
void sero()
{
	map<int, int> m;
	vector<pair<int, int>> v;

	for (int i = 0; i < 100; i++) {
		for (int j = 0; j < 100; j++)
			if (arr[j][i] != 0) {
				m[arr[j][i]]++;
				arr[j][i] = 0;
			}

		for (pair<int, int> u : m)
			v.push_back(u);
		sort(v.begin(), v.end(), [](pair<int, int> a, pair<int, int> b)->bool {
			if (a.second == b.second)
				return a.first < b.first;
			return a.second < b.second;
			});

		int cur = 0;
		for (pair<int, int> u : v) {
			arr[cur][i] = u.first;
			arr[cur+1][i] = u.second;
			cur += 2;
		}
		x = max(x, cur);
		m.clear();
		v.clear();
	}	
	//show();
}
void show()
{
	for (int i = 0; i < x; i++) {
		for (int j = 0; j < y; j++)
			cout << arr[i][j] << " ";
		cout << "\n";
	}
	cout << "\n";
}

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

[ boj : 21275 ] 폰 호석만  (0) 2021.07.17
[ boj : 21738 ] 얼음깨기 펭귄  (0) 2021.07.17
[ boj : 6416 ] 트리인가?  (0) 2021.07.10
[ boj : 18126 ] 너구리 구구  (0) 2021.07.06
[ boj : 2263 ] 트리의 순회  (0) 2021.07.04