νλ‘κ·Έλλ¨Έμ€ - μμ΄ν μ€κΈ°
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μ ν, μ΄ ν·κ°λ¦Ό μ£ΌμνκΈ°. κ°λ μ΄ λ°λλΌμ μ½λ μμ±μ μ£Όμκ° νμνλ€.