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;
}
}
}
}
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 17471 ๊ฒ๋ฆฌ๋งจ๋๋ง - Java (1) | 2022.10.28 |
---|---|
[BOJ] 17779 ๊ฒ๋ฆฌ๋งจ๋๋ง2 - Java (0) | 2022.10.27 |
[BOJ] 16236 ์๊ธฐ์์ด - Java (0) | 2022.10.23 |
[BOJ] 17143 ๋์์ - Java (0) | 2022.10.23 |
[BOJ] 14891 ํฑ๋๋ฐํด - JAVA (1) | 2022.09.25 |