티스토리 뷰

백준 :: BOJ :: 17140 :: 이차원 배열과 연산

 

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

#include<bits/stdc++.h>
using namespace std;

#define F(p,q,z) for(int p=q; p<z; p++)
#define pi pair<int,int>
int r, c, k, A[100][100], N = 3, M = 3, i, j, ans, ss;

void G(int ii, int jj) {
	ss = 0; F(i, 0, ii) {
		set<int>s1; multiset<int> s2; priority_queue<pi, vector<pi>, greater<pi>>pq; int B = 0;
		F(j, 0, jj) { 
			if (N >= M) { if (!A[i][j]) continue; s1.insert(A[i][j]); s2.insert(A[i][j]); A[i][j] = 0;}
			else {if (!A[j][i]) continue; s1.insert(A[j][i]); s2.insert(A[j][i]); A[j][i] = 0;}
		}
		for (auto it = s1.begin(); it != s1.end(); it++)pq.push(make_pair(s2.count(*it),*it));
		int gg = 0, mm=pq.size(); ss=max(ss,(mm*2));
		while (!pq.empty()) {
			pi tmp = pq.top(); pq.pop();
			if (N >= M) {A[i][gg++] = tmp.second; A[i][gg++] = tmp.first;}
			else {A[gg++][i] = tmp.second; A[gg++][i] = tmp.first;}
			if (gg > 99)break;
		}
	}
}

int main() {
	cin >> r >> c >> k;
	F(i, 0, 3) F(j, 0, 3) cin >> A[i][j];
	while (ans < 101 && A[r - 1][c - 1] != k) { (N >= M ? G(N, M) : G(M, N)); (N >= M ? M = ss : N = ss); ans++; }
	cout << (ans > 100 ? -1 : ans);
	return 0;
}

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

[BOJ 17779] 게리맨더링 2  (0) 2019.10.24
[BOJ 17142] 연구소 3  (0) 2019.09.18
[BOJ 17143] 낚시왕  (0) 2019.05.14
[BOJ 17144] 미세먼지 안녕!  (2) 2019.05.14
[BOJ 3190] 뱀  (0) 2019.01.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함