https://school.programmers.co.kr/learn/courses/30/lessons/87694
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์
- ์งํ์ ๊ฐ ๋ณ์ด x์ถ, y์ถ๊ณผ ํํํ ์ง์ฌ๊ฐํ์ด ๊ฒน์ณ์ง ํํ๋ก ํํ
- ์บ๋ฆญํฐ๋ ์ด ๋ค๊ฐํ์ ๋๋ (๊ตต์ ์ )๋ฅผ ๋ฐ๋ผ์ ์ด๋ํ๋ค.
- ์ค์์ ๋น ๊ณต๊ฐ์ด ์๊ธฐ๋ ๊ฒฝ์ฐ, ๋ค๊ฐํ์ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ํ ๋๋ฆฌ๊ฐ ์บ๋ฆญํฐ์ ์ด๋ ๊ฒฝ๋ก๊ฐ ๋๋ค.
- ์๋ก ๋ค๋ฅธ ๋ ์ง์ฌ๊ฐํ์ด ๊ผญ์ง์ ์์ ๋ง๋๊ฑฐ๋, ๋ณ์ด ๊ฒน์น๋ ๊ฒฝ์ฐ ๋ฑ์ ์๋ค.
- ์งํ์ด 2๊ฐ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋ ๊ฒฝ์ฐ๋ ์๋ค.
- ํ ์ง์ฌ๊ฐํ์ด ๋ค๋ฅธ ์ง์ฌ๊ฐํ ์์ ์์ ํ ํฌํจ๋๋ ๊ฒฝ์ฐ ๋ํ ์๋ค.
- rectangle์ ์์๋ ๊ฐ ์ง์ฌ๊ฐํ์ [์ข์ธก ํ๋จ x, ์ข์ธก ํ๋จ y, ์ฐ์ธก ์๋จ x, ์ฐ์ธก ์๋จ y] ์ขํ ํํ๋ก ์ฃผ์ด์ง๋ค.
- ์ด๊ธฐ ์บ๋ฆญํฐ์ ์์น characterX, characterY, ์์ดํ ์ ์์น itemX, itemY๊ฐ ์ฃผ์ด์ง๋ค.
- ์บ๋ฆญํฐ๊ฐ ์์ดํ ์ ์ค๊ธฐ ์ํด ์ด๋ํด์ผ ํ๋ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ.
์ ํ์ฌํญ
- ์ง์ฌ๊ฐํ์ ๋ํ๋ด๋ ๋ชจ๋ ์ขํ๊ฐ์ 1 ์ด์ 50 ์ดํ์ธ ์์ฐ์
- charcterX, charcterY๋ 1 ์ด์ 50 ์ดํ์ธ ์์ฐ์
- itemX, itemY๋ 1 ์ด์ 50 ์ดํ์ธ ์์ฐ์
ํ์ด
์ขํ๊ณ๋ฅผ ๊ทธ๋ํ๋ก ํํํ๊ณ , ๋ฐ๊นฅ์ชฝ ํ ๋๋ฆฌ๋ฅผ ๊ตฌํด ๊ทธ๋ํ ํ์์ ์ด์ฉํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
์ด ๋ฌธ์ ์ ํต์ฌ์ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ํ ๋๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค. ์ฒ์ ํ ๋๋ฆฌ๋ฅผ ๊ตฌํ๋ ํ์ด ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ฆฌ๋ค๊ฐ ์์ ์ ํ์๋ ๋ฐฑ์ค ์น์ฆ ๋ฌธ์ (https://www.acmicpc.net/problem/2636)๊ฐ ์๊ฐ์ด ๋ฌ๋ค. ์น์ฆ ๋ฌธ์ ์์๋ ๋ฐ๊นฅ์ชฝ ํ ๋๋ฆฌ๋ฅผ ๊ตฌํ์ด์ผ ํ๋ค. ๊ทธ๋์ ์น์ฆ๊ฐ ์๋ ์ขํ์ ๋ํด 4๋ฐฉ ํ์์ ํด์, ๋น ๊ณต๊ฐ์ด ์์ผ๋ฉด ํ ๋๋ฆฌ๋ผ๊ณ ํ์๋ฅผ ํ๋ค.
์ด ๋ฌธ์ ์๋ ์ด ํ์ด๋ฅผ ์ ์ฉํ๋ ค๊ณ ํ์๋ค. ํ์ง๋ง ๋ณ์ด ์ง๊ฐ์ผ๋ก ๊บพ์ด๋ ์ง์ ์์์ ์ขํ์ ๋ํด์๋ 4๋ฐฉ ํ์์ ํ์ ๋, ๋น ๊ณต๊ฐ์ด ์๋๋ผ ๋ชจ๋ ์ ์ด๋ค. ์น์ฆ ๋ฌธ์ ์์๋ ๋ฉด์ด๋ผ์ ๊ฐ๋ฅํ์ง๋ง, ์ด ๋ฌธ์ ์์๋ ์ ์ด๋ผ์ ์ ์ฉ์ด ์ด๋ ต๋ค.
๊ทธ๋ฆฌ๊ณ ์น์ฆ ๋ฌธ์ ์์๋ ์ฒ์๋ถํฐ ์น์ฆ์ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ์์๋ ์ง์ฌ๊ฐํ ์ ๋์ ์ ์ขํ ๊ฐ์ด ์ฃผ์ด์ง๋ฏ๋ก ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ณ , ํ์์ ํ๋ ๊ณผ์ ์ ์๊ฐ์ด ์ค๋๊ฑธ๋ ค ๋นํจ์จ์ ์ด๋ค.
- ๊ทธ๋ํ ํํ
- int ํ์ 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ฐ ์ขํ๊ฐ์ ๋น ๊ณณ(0), ์ง์ฌ๊ฐํ ๋ด๋ถ(1), ๋ฐ๊นฅ์ชฝ ํ ๋๋ฆฌ(2)๋ก ํํํ๋ค.
- ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ํ
๋๋ฆฌ ๊ตฌํ๊ธฐ
- ์
๋ ฅ์ผ๋ก ๋ค์ด์ค๋ ์ง์ฌ๊ฐํ์ ์ขํ๊ฐ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฐ๋ค
- ์ขํ๊ฐ ํ ๋๋ฆฌ์ธ ๊ฒฝ์ฐ : ๋น ๊ณณ(0)์ผ ๋๋ง ํ ๋๋ฆฌ(2)๋ฅผ ๊ทธ๋ฆฐ๋ค. ์ด๋ฏธ ๋ด๋ถ๋ก ์น ํ ๊ฒฝ์ฐ(1)๋ผ๋ฉด, ์ ์ ๊ทธ๋ฆด ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ขํ๊ฐ ์ง์ฌ๊ฐํ ๋ด๋ถ์ธ ๊ฒฝ์ฐ : ์ง์ฌ๊ฐํ์ด ๊ฒน์น ์ ์์ผ๋ฏ๋ก ํ ๋๋ฆฌ(2) ์๊ด์์ด ๋ชจ๋ ๋ด๋ถ(1)๋ก ์น ํ๋ค.
- ์
๋ ฅ์ผ๋ก ๋ค์ด์ค๋ ์ง์ฌ๊ฐํ์ ์ขํ๊ฐ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฐ๋ค
์ด๋ ๊ฒ ๊ทธ๋ํ๋ฅผ ๋ง๋ค๊ณ , BFS ํ์์ ๋๋ฆฌ๋ ค๊ณ ํ๋ค. ํ์ง๋ง ํ์์ ๊ฑธ๋ฆฌ๋ ๋ถ๋ถ์ด ์๋ค.
1) ๋ฐ๊นฅ์ชฝ ํ ๋๋ฆฌ๊ฐ ใท์๋ก ๋์ด์๋ ๋ถ๋ถ
ํ ์ ์ ๋ํด 4๋ฐฉ ํ์์ ํ ๋, ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ง ์์ง๋ง ํด๋น ์ง์ ์ ํ ๋๋ฆฌ์ด๋ฏ๋ก ์ด๋์ด ๊ฐ๋ฅํด์ง๊ฒ ๋๋ค.
2) ์ค์์ ๋น ๊ณต๊ฐ์ด ์๊ณ , ๋ฉด์ ์ด 1์ธ ๊ฒฝ์ฐ
ํ ์ ์ ๋ํด 4๋ฐฉ ํ์์ ํ ๋, ์ ์ชฝ ํ ๋๋ฆฌ๋ก๋ ์ด๋์ด ๊ฐ๋ฅํด์ง๋ค. ๋ฐ๊นฅ์ชฝ ํ ๋๋ฆฌ๋ง ์ด๋์ด ๊ฐ๋ฅํ๋ฏ๋ก ์๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ๊ณ์ ์๊ฐํด๋ณด๋ค๊ฐ ๋์ ํ ์๊ฐํ ์๊ฐ ์์ด์ ๋ฌธ์ ๋ด์ ์ง๋ฌธํ๊ธฐ ๊ฒ์ํ์ ์๋ ํ ๊ธ์ ๋ดค๋ค.
(https://school.programmers.co.kr/questions/21253)
์ขํ๋ฅผ 2๋ฐฐ๋ก ํ์ฅ์์ผ ์ ๊ทผํ๋ผ๋ ํํธ๊ฐ ์์๋ค. ์ขํ๋ฅผ 2๋ฐฐ๋ก ํ์ฅ์ํค๋ฉด ์์์ ์ธ๊ธํ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
ํ ๋๋ฆฌ์ ํด๋น์ด ๋์ด ํ์นธ์ผ๋ก ์ด๋์ด ๊ฐ๋ฅํด์ก๋ ๊ณณ์ด 2๋ฐฐ๋ก ๋๋ ธ๋๋ ํ์นธ์ผ๋ก ์ด๋์ด ๋ถ๊ฐ๋ฅํด์ง๊ฒ ๋๋ค.
- ์ขํ๊ณ๋ฅผ 2๋ฐฐ๋ก ํ์ฅํ๊ธฐ
- ๊ทธ๋ํ ํฌ๊ธฐ๋ฅผ 2๋ฐฐ๋ก ๋ง๋ค๊ธฐ : ์ ํ์ฌํญ์์ 1์ด์ 50์ดํ์ ์์ฐ์์ด๋ฏ๋ก ํฌ๊ธฐ๋ 50*2+1์ธ 101์ด ๋๋ค.
- ์ง์ฌ๊ฐํ์ ์ขํ๊ฐ์ 2๋ฐฐํ์ฌ ํ ๋๋ฆฌ์ ๋ด๋ถ ์ฑ์ฐ๊ธฐ
- 2๋ฐฐ๋ ์ขํ๊ฐ์ผ๋ก ๊ทธ๋ํ ํ์ํ๊ธฐ
- BFS ํ์
- ์ต์ ์ด๋์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก ๋๋น์ฐ์ ํ์์ด ์ ํฉํ๋ค.
- ํ๋ฅผ ๋๋ฆด์ ๋งค๋ฒ ํ์ ์ฌ์ด์ฆ๋งํผ ๋์ด์ ํ์ํ๋ค.
- ํ์ ์์์ ์ ๋ด์ 4๋ฐฉ์ผ๋ก ํ์ํ๋ฉฐ, ํ ํฌ๋ฆฌ์ผ ์ ํ์ ๋ด์ ๊ณ์ ํ์ํ๋ค.
- ๋์ฐฉํ๋ค๋ฉด ๋ฐ๋ก ์ด๋ ํ์๋ฅผ return ํ๋ค. (์ต์๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก ๋ ์ด์ ํ์ํ ํ์๊ฐ ์๋ค.)
์ฝ๋
import java.util.*;
class Solution {
static int[][] graph; //๊ทธ๋ํ : 0, 1(๋ด๋ถ), 2(ํ
๋๋ฆฌ)
static boolean[][] visited;
static int[] di = {-1, 1, 0, 0};
static int[] dj = {0, 0, -1, 1};
static class Point {
int i, j; //y์ขํ(ํ), x์ขํ(์ด)
Point(int i, int j) {
this.i = i;
this.j = j;
}
}
public int solution(int[][] rectangle, int characterX, int characterY, int itemX, int itemY) {
graph = new int[50*2+1][50*2+1];
//๊ทธ๋ํ ์์ญ ์ฑ์ฐ๊ธฐ
for(int[] r : rectangle) {
int x1 = r[0]*2; //์ข์ธก ํ๋จ x
int y1 = r[1]*2; //์ข์ธก ํ๋จ y
int x2 = r[2]*2; //์ฐ์ธก ์๋จ x
int y2 = r[3]*2; //์ฐ์ธก ์๋จ y
for(int i = y1; i <= y2; i++) {
for(int j = x1; j <= x2; j++) {
if(i == y1 || i == y2 || j == x1 || j == x2) { //์ขํ๊ฐ ํ
๋๋ฆฌ
if(graph[i][j] == 0) { //๋น ๊ณณ
graph[i][j] = 2; //ํ
๋๋ฆฌ ๊ทธ๋ฆฌ๊ธฐ
}
} else { //์ขํ๊ฐ ๋ด๋ถ
graph[i][j] = 1; //๋ด๋ถ ์น ํ๊ธฐ
}
}
}
}
//๊ทธ๋ํ ํ์
visited = new boolean[50*2+1][50*2+1];
int answer = bfs(characterX * 2, characterY * 2, itemX * 2, itemY * 2) / 2; //2๋ฐฐ ๋๋ ธ์ผ๋ 2๋ก ๋๋๊ธฐ
return answer;
}
public int bfs(int characterX, int characterY, int itemX, int itemY) {
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(characterY, characterX));
visited[characterY][characterX] = true;
int count = 0; //์ด๋ ์นด์ดํธ
while(!queue.isEmpty()) {
int size = queue.size(); //๋๋น ํ์์ ์ํ ์ฌ์ด์ฆ
for(int s = 0; s < size; s++) { //์ฌ์ด์ฆ๋งํผ ๋์ด์ ํ์
Point point = queue.poll();
if(point.i == itemY && point.j == itemX) { //๋์ฐฉ
return count;
}
for(int d = 0; d < 4; d++) {
int ni = point.i + di[d];
int nj = point.j + dj[d];
if(1 <= ni && ni <= 100 && 1 <= nj && nj <= 100) {
if(!visited[ni][nj] && graph[ni][nj] == 2) {
queue.add(new Point(ni, nj));
visited[ni][nj] = true;
}
}
}
}
count++;
}
return count;
}
}
๊ฒฐ๊ณผ
๋ฐฐ์ด์
- ์ขํ๊ณ๋ฅผ 2๋ฐฐ๋ก ๋๋ฆฌ๋ ๋ฐฉ๋ฒ๋ ์์
- x, y์ ํ, ์ด ํท๊ฐ๋ฆผ ์ฃผ์ํ๊ธฐ. ๊ฐ๋ ์ด ๋ฐ๋๋ผ์ ์ฝ๋ ์์ฑ์ ์ฃผ์๊ฐ ํ์ํ๋ค.
'Algorithm > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค - ๊ฐ์ฅ ํฐ ์ (0) | 2023.09.07 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค - ์ด์ง ๋ณํ ๋ฐ๋ณตํ๊ธฐ (0) | 2023.08.30 |
ํ๋ก๊ทธ๋๋จธ์ค - ์คํฌํธ๋ฆฌ (0) | 2023.08.17 |
ํ๋ก๊ทธ๋๋จธ์ค - n์ง์ ๊ฒ์ (0) | 2023.08.17 |
ํ๋ก๊ทธ๋๋จธ์ค - ํธํ ๋์ค (0) | 2023.08.04 |