๋งํฌ
https://www.acmicpc.net/problem/2178
๋ฌธ์ ์์ฝ
๋ฏธ๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ก์ ๋, (1,1)์์ ์ถ๋ฐํ์ฌ (N, M)์ผ๋ก ์ด๋ํ ๋ ์ง๋์ผ ํ๋ ์ต์์ ์นธ ์ ๊ตฌํ๊ธฐ
1์ ์ด๋ํ ์ ์๋ ์นธ, 0์ ์ด๋ํ ์ ์๋ ์นธ์ ์๋ฏธํ๋ค.
์ ํ
- ์ฒซ์งธ ์ค์ ๋ ์ ์ N, M(2 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค.
- ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์ ์๋ก ๋ฏธ๋ก๊ฐ ์ฃผ์ด์ง๋ค.
- ๊ฐ๊ฐ์ ์๋ค์ ๋ถ์ด์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
ํ์ด
๋ฌธ์ ์์ (1,1)์ด๋ผ๊ณ ์ฃผ์ด์ก๋๋ฐ, ์ด๋ ๋ฐฐ์ด์์ (0,0) ๊ฐ์ ์๋ฏธํฉ๋๋ค.
๋ฐ๋ผ์ ์ผ์ชฝ ๋งจ ์์์ ์ค๋ฅธ์ชฝ ๋งจ ์๋๋ก ์ด๋ํ๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค.
[์ ๋ ฅ]
ํ์์ ๋ค๋ฅด๊ฒ ๊ฐ๊ฐ์ ์๋ค์ด ๋ถ์ด์ ์ฃผ์ด์ง๋๋ค. ๊ทธ๋์ StringTokenizer๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ฝ๊ฒ ๋ ์ฌ๋ฆด ์ ์๋ ์ ๋ ฅ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
- ํ ์ค์ `String str` ์ ์ ๋ ฅ๋ฐ๋๋ค.
- `str`์ ์ํํ๋ฉฐ `str.charAt(i)-'0'` ๊ฐ์ `int` ๋ฐฐ์ด์ `i`๋ฒ์งธ ๊ฐ์ ์ ์ฅํ๋ค.
for(int i=0; i<N; i++){
String str = br.readLine();
for(int j=0; j<M; j++){
board[i][j] = str.charAt(j)-'0';
}
}
์ฝ๋์ ๊ธธ์ด๋ ๋ณต์ก๋์ ์๊ด์์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ์ 5์ค์ ์กฐ๊ธ ์ค์ด๊ณ ์ถ์์ต๋๋ค..!
๊ทธ๋์ `String → int []` ๋ก ๋ง๋ค์ด์ฃผ๋ ์๋ฐ api ์๋~ ์ฐพ๋ค๊ฐ ์ด๋ฐ ๊ฑธ ๋ฐ๊ฒฌํฉ๋๋ค.

https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html#chars()
String (Java SE 21 & JDK 21)
All Implemented Interfaces: Serializable, CharSequence, Comparable , Constable, ConstantDesc The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class. Strings are constan
docs.oracle.com
`chars`๋ผ๋ ํจ์์ธ๋ฐ, String์ IntStream์ผ๋ก ๋ณํํด ์ฃผ๋ ํจ์์ ๋๋ค.
๊ทผ๋ฐ, `String` ์ ๊ฐ๊ฐ์ `char` ๊ฐ์ ์์คํค์ฝ๋ ๊ฐ์ผ๋ก ๋ณํํด ์ฃผ๊ธฐ ๋๋ฌธ์ `char ’ 0’`์ ์์คํค์ฝ๋ ๊ฐ์ ๋นผ์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๊ฑด `map()` ํจ์๋ฅผ ํตํด ์ํํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก `IntStream`์ `array` ๋ก ๋ณํํ๊ธฐ ์ํด `toArray()` ํจ์๋ฅผ ์ฐ๋ฉด ์ต์ข ์ ์ผ๋ก ์ ๋ ฅ๋ฐ๋ ๋ถ๋ถ์ด ์์ฑ๋ฉ๋๋ค.
for(int i=0; i<N; i++){
board[i] = br.readLine().chars().map(val -> val-'0').toArray();
}
[ํ๋ฆ]
N๊ณผ M์ ์ต๋๊ฐ์ด 10^2์ด๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ `O(N^3)`๊น์ง๋ ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ํ ํ์ ๋ฌธ์ ๋ก, BFS๋ก ๋ฌธ์ ๋ฅผ ํ์์ต๋๋ค.
- ๋ฐฐ์ด์ ์
๋ ฅ๋ฐ๋๋ค.
- ๋์์ ๊ฐ์ด 1์ธ ์นธ์ ์ ๋ณด(์ขํ, int์ ์ต๋๊ฐ)๋ฅผ ํ์ ์ฝ์ ํ๋ค.
- ๊ธฐ์ค์ ์ ๋ณด๋ฅผ ํ์ ์ฝ์
ํ๋ค. ์ ๋ณด๋ ์ขํ ๊ฐ๊ณผ ์ด๋ ๊ฑฐ๋ฆฌ์ด๋ค.
- ์์์ ์ธ (1,1)์ ์ด๋ ๊ฑฐ๋ฆฌ๊ฐ 1์ด๋ค.
- ์์์ ์ผ๋ก๋ถํฐ 4 ๋ฐฉํฅ(์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ)์ผ๋ก ๊ฐ ์ ์๋ 1์นธ์ ์ฐพ๋๋ค.
- ๋ง์ฝ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ 1์นธ์ด ์๋ค๋ฉด, ํด๋น ์นธ์ ์ ๋ณด(์ขํ, ์ด๋ ๊ฑฐ๋ฆฌ)๋ฅผ ํ์ ์ฝ์
ํ๋ค.
- ์ด๋ ๊ฑฐ๋ฆฌ๋ (๊ธฐ์กด ์ด๋๊ฑฐ๋ฆฌ ๊ฐ, ๊ธฐ์ค์ +1) ์ค ์์ ๊ฐ์ด๋ค.
- ํ์์ ํ๋์ฉ ์ ๋ณด๋ฅผ ๋นผ๋ด์ ์ด๋ฅผ ๊ธฐ์ค์ ์ผ๋ก 2~4 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ๋ง์ฝ ์๋ก ํ์ํ ์์น๊ฐ ๋ชฉ์ ์ง ์์น๋ผ๋ฉด, ์ด๋ฅผ ๋ฐํํฉ๋๋ค.
์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int[][] board;
static boolean[][] visited;
static int[] dx = {0,-1,0,1};
static int[] dy = {1,0,-1,0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
board = new int[N][M];
visited = new boolean[N][M];
for(int i=0; i<N; i++){
board[i] = br.readLine().chars().map(val -> val-'0').toArray();
}
System.out.println(bfs(0,0));
}
static int bfs(int startX, int startY){
// ์์์ ์ด๊ธฐํ
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{startX, startY, 1});
visited[startX][startY]=true;
while(!queue.isEmpty()){
int[] info = queue.poll();
for(int i=0; i<4; i++){ // ์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ 4๋ฐฉํฅ์ผ๋ก ํ์
int nx = info[0] + dx[i];
int ny = info[1] + dy[i];
if(nx<0 || ny<0 || nx>=N || ny>=M) continue; // ๊ฒฝ๊ณ ๋ฒ์ ์ฒดํฌ
if(nx==N-1 && ny==M-1){ // ๋ชฉ์ ์ง์ ๋๋ฌํ๋ฉด ๋ต ๋ฐํ
return info[2]+1;
}
if(board[nx][ny]==1 && !visited[nx][ny]){ // ๋ฐฉ๋ฌธํ์ง ์์ 1์นธ์ ํ์ ์ฝ์
visited[nx][ny]=true;
queue.add(new int[]{nx,ny,info[2]+1}); // ์๋ก์ด ์นธ ์ต์ ๊ฑฐ๋ฆฌ = ์ด์ ์นธ ์ต์ ๊ฑฐ๋ฆฌ + 1
}
}
}
return -1;
}
}
๐ท ์๊ฐ ๋ณต์ก๋
- board: `N` * `M` ๋ฐฐ์ด
- `bfs()` ํจ์๋ ๋ชจ๋ ์ขํ๋ฅผ ์ํํ๋ฏ๋ก, `O(N*M)`
- ์ต์ข ์๊ฐ ๋ณต์ก๋: `O(N*M)`
๐ท ์คํ ์๋
Time: 124 ms, Memory: 14956 KB
'๐ช Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ/๋ฐฑ์ค] 1010 ๋ค๋ฆฌ ๋๊ธฐ (JAVA) (1) | 2025.02.13 |
|---|---|
| [BOJ/๋ฐฑ์ค] 13023 ABCDE(JAVA) (1) | 2025.02.12 |
| [BOJ/๋ฐฑ์ค] 1931 ํ์์ค ๋ฐฐ์ (JAVA) (1) | 2025.02.10 |
| [BOJ/๋ฐฑ์ค] 2573 ๋น์ฐ (JAVA) (1) | 2025.02.09 |