4193. 수영대회 결승전
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
- 조건문 잘 확인하기
- visited를 boolean으로 하고 Node 값으로 시간 전달
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class sw4193 {
static int[][] graph;
static boolean[][] visited;
static int n;
static int result;
static Queue<Node> queue;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static class Node {
int x, y, time;
public Node(int x, int y, int time) {
this.x = x;
this.y = y;
this.time = time;
}
}
private static void bfs(int startX, int startY, int endX, int endY) {
queue.offer(new Node(startX,startY,0));
visited[startX][startY]=true;
while(!queue.isEmpty()){
Node node=queue.poll();
int x= node.x;
int y= node.y;
int time= node.time;
for (int i = 0; i < 4; i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if (nx==endX && ny==endY){
result=time+1; //다음 위치가 도착점이므로 +1
return;
}
if (nx<0 || nx>=n|| ny<0 || ny>=n || visited[nx][ny]) continue;
if (graph[nx][ny]==1) continue;
else if (graph[nx][ny]==2 && time %3 !=2){
queue.offer(new Node(x,y,time+1));
}
else{
visited[nx][ny]=true;
queue.offer(new Node(nx,ny,time+1));
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
for (int tc = 1; tc <= T; tc++) {
st=new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
graph = new int[n][n];
visited = new boolean[n][n];
queue = new LinkedList<>();
for (int i = 0; i < n; i++) {
st=new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
graph[i][j] = Integer.parseInt(st.nextToken());
}
}
st=new StringTokenizer(br.readLine());
int startX = Integer.parseInt(st.nextToken());
int startY = Integer.parseInt(st.nextToken());
st=new StringTokenizer(br.readLine());
int endX = Integer.parseInt(st.nextToken());
int endY = Integer.parseInt(st.nextToken());
result = -1;
if (startX == endX && startY == endY) {
System.out.printf("#%d %d\n", tc, 0);
}
else{
bfs(startX, startY, endX, endY);
System.out.printf("#%d %d\n", tc, result);
}
}
}
}'코딩테스트 > JAVA 코테' 카테고리의 다른 글
| [Java] 10971. 외판원 순회2 (0) | 2023.03.31 |
|---|---|
| [JAVA] [DP] [DFS] 17070. 파이프 옮기기 1 (0) | 2023.03.29 |
| [JAVA][최단경로][다익스트라] 1238. 파티 (0) | 2023.03.19 |
| [JAVA] [백준] [BFS] 16236. 아기상어 (0) | 2023.03.07 |
| [SW] [D3] [DFS][조합] 9229. 한빈이와 Spot Mart (0) | 2023.03.05 |