Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- react
- 버튼 활성화
- React Native
- ReactNative
- bfs dfs
- FlatList
- Navigation
- 자료구조
- springboot
- 비트마스킹
- 상속 관계 매핑
- React Natvive
- 창의충전소
- 원복
- 구현
- 완전탐색
- 해외 대외활동
- 백준 1992
- Project Bee
- 폴더구조
- service 테스트
- 경우의 수
- 노마드코더
- 이영직
- 오블완
- BFS
- 휴대폰 기기
- 티스토리챌린지
- web view
- multipart upload
Archives
- Today
- Total
유미의 기록들
[백준 2주차 - 2178] 미로탐색 (Java) 본문
728x90
반응형
📌문제
📝 풀이과정
최단거리 문제이므로 BFS로 푸는 것이 좋다
1. 시작 좌표값인 (0,0)을 BFS로 넘긴다
2. (y,x)좌표를 탐색했으므로 visited[y][x]=1으로 방문처리를 한다
2. 이동 할 수 있는 좌표값을 저장할 Queue를 선언하고 (x,y)를 저장한다
3. Queue 가 비어있지 않을때 까지 반복한다
3-1. Queue에서 처음 입력값을 꺼내 nowY와 nowX를 저장한다
3-2. (nowY,nowX)를 기준으로 상,하,좌,우로 인접한 노드를 탐색해서 이동가능하고 방문하지 않은 노드가 있다면 Queue에 저장한다
3-3. 인접한 노드(ny,nx)를 (nowY,nowX)보다 1 큰 값을 visited배열에 저장한다 (최단거리를 나타내는 배열이다)
⚠️입력할 때 다른 입력 케이스와 달라 시간을 많이 소비했다. 입력에 공백이 들어가지 않기 때문에 String으로 받고 한글자 씩 입력받도록 구현하였다
💻 코드
import java.util.*;
import java.io.*;
public class Main{
static int [][]map;
static int n,m;
static int [][]visited;
static int[] dy={-1,0,1,0};
static int[] dx={0,1,0,-1};
public static class Pair{
int x,y;
Pair(int y,int x){
this.y=y;
this.x=x;
}
}
public static void bfs(int y,int x){
Queue<Pair> queue=new LinkedList<>();
visited[y][x]=1;
queue.add(new Pair(y,x));
while(queue.size()!=0){
Pair p=queue.poll();
int nowX=p.x;
int nowY=p.y;
for(int i=0;i<4;i++){//좌표 이동하면서
int ny=nowY+dy[i];
int nx=nowX+dx[i];
//좌표 벗어나거나 방문했거나 map이 0이면 continue
if(ny<0 || ny>=n || nx<0 || nx>=m) continue;
if(visited[ny][nx]!=0 || map[ny][nx]==0) continue;
visited[ny][nx]=visited[nowY][nowX]+1;
queue.add(new Pair(ny,nx));
}
}
}
public static void main(String[]args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String input=br.readLine();
StringTokenizer st=new StringTokenizer(input);
n=Integer.parseInt(st.nextToken());
m=Integer.parseInt(st.nextToken());
map=new int[n+1][m+1];
visited=new int[n+1][m+1];
for(int i=0;i<n;i++){
String s=br.readLine();
for(int j=0;j<m;j++){
map[i][j]=s.charAt(j)-'0';
}
}
bfs(0,0);
System.out.println(visited[n-1][m-1]);
}
}
728x90
반응형
'코딩테스트 기록 > 알고리즘 문제' 카테고리의 다른 글
[백준 3주차 - 16637] 괄호 추가하기 (Java) (0) | 2024.04.09 |
---|---|
[백준 3주차 - 12869] 뮤탈리스크 (Java) (0) | 2024.04.08 |
[백준 3주차 - 16234] 인구이동 (Java) (0) | 2024.04.02 |
[백준 2주차 - 1992] 쿼드트리 (Java) (0) | 2024.02.24 |
[백준 1주차 - 4375] 1 (Java) (0) | 2024.02.19 |
Comments