Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- SerialDate 리펙터링
- 자바의 정석
- Design Pattern
- java
- 9장
- 백준
- java의 정석
- programmers
- 2166번
- 가장 긴 증가하는 부분 수열2
- DxTrace
- Dxerr.h
- 1300번
- 1043번
- 클린코드
- 코딩 테스트
- BOJ
- 2206번
- Spring
- 10830번
- 2156번
- springboot
- 11758번
- Design Patterns
- 코딩테스트
- Adapater Pattern
- 17장
- 프로그래머스
- 11286번
- 냄새와 휴리스틱
Archives
- Today
- Total
Don't give up!
[백준] 2206번 : 벽 부수고 이동하기 (java) 본문
2206번: 벽 부수고 이동하기 (acmicpc.net)
어떻게 생각하고 문제를 풀었는가?
(1,1)부터 (N,M)까지의 최단 경로를 구하기 위해서는 BFS를 사용하여 문제를 해결할 수 있을 것이라고 생각하였습니다.
문제에서 단 한번 벽을 부술 수 있다는 것을 고려해야 하는데, 이를 해결하기 위해서 벽을 부순 상태에서의 최단거리와 벽을 부수지 않은 상태에서의 최단거리를 별도로 계산하여 해결하고자 하였습니다.
코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
int N = Integer.parseInt(tokenizer.nextToken());
int M = Integer.parseInt(tokenizer.nextToken());
String[] board = new String[N];
for(int i=0; i<N; i++){
board[i] = reader.readLine();
}
reader.close();
int[][][] dist = new int[N][M][2];
Queue<Player> queue = new LinkedList<>();
queue.add(new Player(0,0, 0));
dist[0][0][0]=1;
int min = -1;
while(!queue.isEmpty()){
Player current = queue.poll();
int currentRow = current.row;
int currentColumn = current.column;
int destroyed = current.destroyed;
if(currentRow==N-1 && currentColumn==M-1){
min = dist[currentRow][currentColumn][destroyed];
break;
}
if(currentRow>0){
if(board[currentRow-1].charAt(currentColumn)=='0' && dist[currentRow-1][currentColumn][destroyed] == 0){
queue.add(new Player(currentRow-1, currentColumn, destroyed));
dist[currentRow-1][currentColumn][destroyed] = dist[currentRow][currentColumn][destroyed]+1;
}else if(board[currentRow-1].charAt(currentColumn)!='0' && destroyed==0 && dist[currentRow-1][currentColumn][1] == 0){
queue.add(new Player(currentRow-1, currentColumn,1));
dist[currentRow-1][currentColumn][1] = dist[currentRow][currentColumn][destroyed]+1;
}
}
if(currentColumn>0){
if(board[currentRow].charAt(currentColumn-1)=='0' && dist[currentRow][currentColumn-1][destroyed] == 0){
queue.add(new Player(currentRow, currentColumn-1, destroyed));
dist[currentRow][currentColumn-1][destroyed] = dist[currentRow][currentColumn][destroyed]+1;
}else if(board[currentRow].charAt(currentColumn-1)!='0' && destroyed==0 && dist[currentRow][currentColumn-1][1]==0){
queue.add(new Player(currentRow, currentColumn-1,1));
dist[currentRow][currentColumn-1][1] = dist[currentRow][currentColumn][destroyed]+1;
}
}
if(currentColumn+1<M){
if(board[currentRow].charAt(currentColumn+1)=='0' && dist[currentRow][currentColumn+1][destroyed]==0){
queue.add(new Player(currentRow, currentColumn+1, destroyed));
dist[currentRow][currentColumn+1][destroyed] = dist[currentRow][currentColumn][destroyed]+1;
}else if(board[currentRow].charAt(currentColumn+1)!='0' && destroyed==0 && dist[currentRow][currentColumn+1][1]==0){
queue.add(new Player(currentRow, currentColumn+1,1));
dist[currentRow][currentColumn+1][1] = dist[currentRow][currentColumn][destroyed]+1;
}
}
if(currentRow+1<N){
if(board[currentRow+1].charAt(currentColumn)=='0' && dist[currentRow+1][currentColumn][destroyed]==0){
queue.add(new Player(currentRow+1, currentColumn, destroyed));
dist[currentRow+1][currentColumn][destroyed] = dist[currentRow][currentColumn][destroyed]+1;
}else if(board[currentRow+1].charAt(currentColumn)!='0' && destroyed==0 && dist[currentRow+1][currentColumn][1]==0){
queue.add(new Player(currentRow+1, currentColumn,1));
dist[currentRow+1][currentColumn][1] = dist[currentRow][currentColumn][destroyed]+1;
}
}
}
System.out.println(min);
}
static class Player{
int row;
int column;
int destroyed;
Player(int row, int column, int destroyed){
this.row = row;
this.column = column;
this.destroyed = destroyed;
}
}
}
Queue를 사용하여 BFS를 구현하였습니다.
상/하/좌/우 네방향으로 이동할 수 있는지 체크하고, 벽이 있고 부술 수 있다면 벽을 부순 상태의 최단거리를 계산합니다.
BFS이므로 먼저 도착한 결과는 최단거리를 갖습니다. 변수 min의 값을 갱신하고 갱신되지 않았을 경우 초기화 값인 -1을 결과로 출력합니다.
'Coding Test > BOJ' 카테고리의 다른 글
[백준] 1043번: 거짓말 (java) (0) | 2021.08.11 |
---|---|
[백준] 1929번 : 소수 구하기 (java) (0) | 2021.08.08 |
[백준] 1022번 : 소용돌이 예쁘게 출력하기 (java) (0) | 2021.08.07 |