๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

 

17140๋ฒˆ: ์ด์ฐจ์› ๋ฐฐ์—ด๊ณผ ์—ฐ์‚ฐ

์ฒซ์งธ ์ค„์— r, c, k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ r, c, k ≤ 100) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ 3๊ฐœ์˜ ์ค„์— ๋ฐฐ์—ด A์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ฐฐ์—ด A์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜๋Š” 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

www.acmicpc.net


1. ๋ฌธ์ œ ์š”์•ฝ

3x3 ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์ด ์žˆ๋‹ค. 

1์ดˆ๋งˆ๋‹ค ๋‘ ๊ฐ€์ง€ ์—ฐ์‚ฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ํ–‰์˜ ๊ฐœ์ˆ˜ >= ์—ด์˜ ๊ฐœ์ˆ˜ ์ผ ๊ฒฝ์šฐ, R ์—ฐ์‚ฐ(ํ–‰ ์ •๋ ฌ)์„ ์ˆ˜ํ–‰ํ•˜๊ณ 

ํ–‰์˜ ๊ฐœ์ˆ˜ < ์—ด์˜ ๊ฐœ์ˆ˜ ์ผ ๊ฒฝ์šฐ, C ์—ฐ์‚ฐ(์—ด ์ •๋ ฌ)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ •๋ ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง„๋‹ค.๊ฐ ํ–‰ ๋˜๋Š” ์—ด์— ์ˆ˜๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ํšŸ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋“ฑ์žฅ ํšŸ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.๋ฐฐ์—ด์— ๋‹ค์‹œ ๋„ฃ์–ด์ค„ ๋•Œ๋Š” ๋“ฑ์žฅํ•˜๋Š” ์ˆ˜, ๋“ฑ์žฅ ํšŸ์ˆ˜ ์ˆœ์„œ๋กœ ๋„ฃ์–ด์ค€๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, 1 2 1 ์ผ ๊ฒฝ์šฐ 1์ด 2๋ฒˆ, 2๊ฐ€ 1๋ฒˆ ๋“ฑ์žฅํ•˜๋ฏ€๋กœ 2 1 1 2 ๊ฐ€ ๋œ๋‹ค.r, c, k๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, r,c์ขŒํ‘œ ๊ฐ’์ด k๊ฐ€ ๋˜๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

* ์ˆ˜๋ฅผ ์ •๋ ฌํ•  ๋•Œ 0์€ ๋ฌด์‹œํ•œ๋‹ค.

* ํ–‰ ๋˜๋Š” ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 100์„ ๋„˜์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ ์ฒ˜์Œ 100๊ฐœ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” ๋ฒ„๋ฆฐ๋‹ค. => ๋ฐฐ์—ด ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 100x100 ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ

 

2. ํ’€์ด

์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ํ’€์—ˆ๋‹ค.

 

์ตœ๋Œ€ 100์ดˆ ๋™์•ˆ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๋‹ค์Œ์„ 100๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.

1, map[r][c] == k์ผ ๊ฒฝ์šฐ ๋ฐ˜๋ณต์„ ๋ฉˆ์ถ˜๋‹ค.

2. ํ–‰ ๊ฐœ์ˆ˜ >= ์—ด ๊ฐœ์ˆ˜ ์ด๋ฉด R์„ ์ˆ˜ํ–‰,

    ํ–‰ ๊ฐœ์ˆ˜ < ์—ด ๊ฐœ์ˆ˜ ์ด๋ฉด C๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

3. ์ •๋ ฌ์€

 - ๋“ฑ์žฅํšŸ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋“ฑ์žฅํšŸ์ˆ˜ ๊ฐ™์œผ๋ฉด ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด Priority Queue๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. - 1~100๊นŒ์ง€ ์ˆ˜์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค.1) ํ•˜๋‚˜์˜ ํ–‰ ๋˜๋Š” ์—ด์—์„œ map์˜ ์ขŒํ‘œ๋ฅผ ์ธ๋ฑ์Šค๋กœ ํ•˜์—ฌ ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•ด์ค€๋‹ค.    => ๋“ฑ์žฅํšŸ์ˆ˜ ์ €์žฅ๊ณผ ๋™์‹œ์— map์˜ ๊ฐ’์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.

2) ๋“ฑ์žฅํšŸ์ˆ˜ ๋ฐฐ์—ด์—์„œ ๋“ฑ์žฅ ํšŸ์ˆ˜๊ฐ€ 0์ด ์•„๋‹ ๊ฒฝ์šฐ, ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ pq์— ๋„ฃ์–ด์ค€๋‹ค.

3) pq๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ map ์— ์ˆ˜(์ธ๋ฑ์Šค), ๋“ฑ์žฅํšŸ์ˆ˜(๊ฐ’) ์ˆœ์„œ๋กœ ๋„ฃ์–ด์ค€๋‹ค.

   => ๊ฐ€๋กœ ๊ธธ์ด ๋˜๋Š” ์„ธ๋กœ ๊ธธ์ด์˜ max๋ฅผ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

         => ๋ฐ˜๋ณต๋ฌธ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ R ๋˜๋Š” C ์ค‘ ์–ด๋–ค ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ• ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์ด๊ธฐ ๋•Œ๋ฌธ

 

 

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.util.*;
import java.io.*;

public class BOJ_17140_์ด์ฐจ์›๋ฐฐ์—ด๊ณผ์—ฐ์‚ฐ {

	static int[] numCnt;
	static int[][] map;
	static List<Integer> list;
	static int r,c,k, ans, rLen, cLen;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		r = Integer.parseInt(st.nextToken()) -1;
		c = Integer.parseInt(st.nextToken()) -1;
		k = Integer.parseInt(st.nextToken());
		rLen = 3;
		cLen = 3;
		map = new int[100][100];
		for (int i=0; i<3; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j=0; j<3; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		} //์ž…๋ ฅ ๋
		
		solution();
		System.out.println(ans);
	}
	
	static void solution() {
		for(int t=0; t<100; t++) {
			if (map[r][c] == k) {
				break;
			}
			//2. ๋ฐฐ์—ด ํฌ๊ธฐ ํ™•์ธ -> R์—ฐ์‚ฐํ• ์ง€ C์—ฐ์‚ฐํ• ์ง€ ์ฒดํฌ
			if (rLen >= cLen) doR();
			else doC();
			ans++;
		}
		if (map[r][c] != k) ans = -1;
	}
	
	static void doR() { //ํ–‰๋งˆ๋‹ค ์ •๋ ฌ
		for (int r=0; r<rLen; r++) {
			PriorityQueue<Node> pq = new PriorityQueue<> ();
			numCnt = new int[101];
			
			for (int c=0; c<cLen; c++) {
				numCnt[ map[r][c] ]++;
				map[r][c] = 0;
			}
			//1. pq์— ๋„ฃ์–ด์คŒ -> ์ž๋™์ •๋ ฌ
			for (int n=1; n<=100; n++) {
				if (numCnt[n] == 0) continue;
				pq.offer(new Node(n, numCnt[n]));
			}
			//2. map์— ๋‹ค์‹œ ๋„ฃ์–ด์คŒ
			int len = 0;
			while(!pq.isEmpty()) {
				Node cur = pq.poll();
				map[r][len++] = cur.num;
				map[r][len++] = cur.cnt;
			}
			cLen= Math.max(cLen, len+1);
		}
	}
	
	static void doC() { //์—ด๋งˆ๋‹ค ์ •๋ ฌ
		for (int c=0; c<cLen; c++) {
			PriorityQueue<Node> pq = new PriorityQueue<> ();
			numCnt = new int[101];
			
			for (int r=0; r<rLen; r++) {
				numCnt[ map[r][c] ]++;
				map[r][c] = 0;
			}
			//1. pq์— ๋„ฃ์–ด์คŒ -> ์ž๋™์ •๋ ฌ
			for (int n=1; n<=100; n++) {
				if (numCnt[n] == 0) continue;
				pq.offer(new Node(n, numCnt[n]));
			}
			//2. map์— ๋‹ค์‹œ ๋„ฃ์–ด์คŒ
			int len = 0;
			while(!pq.isEmpty()) {
				Node cur = pq.poll();
				map[len++][c] = cur.num;
				map[len++][c] = cur.cnt;
			}
			rLen= Math.max(rLen, len+1);
		}
	}
	
	static class Node implements Comparable<Node>{
		int num, cnt;
		Node(int num, int cnt) {
			this.num = num;
			this.cnt = cnt;
		}
		@Override
		public int compareTo(Node o) {
			if (this.cnt==o.cnt) {
				return this.num-o.num;
			} else {
				return this.cnt-o.cnt;
			}
		}
	}
}