시간 & 메모리 제한
문제
입력 & 출력
예제
구현을 통한 문제풀이
package com.Back;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Back_14503 {
static int R,C,x,y,dir;
static int [][] map;
static boolean [][] visited;
static int ans =0;
//북 동 남 서
static int[] dx= {-1,0,1,0};
static int[] dy= {0,1,0,-1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
map = new int[R][C];
visited = new boolean[R][C];
st = new StringTokenizer(br.readLine());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
dir = Integer.parseInt(st.nextToken());
// 맵 입력
for (int i = 0; i < R; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < C; j++) {
map[i][j]=Integer.parseInt(st.nextToken());
}
}
clean(x,y,dir);
System.out.println(ans);
}
private static void clean(int x,int y,int dir) {
boolean sign = false;
if(!visited[x][y]) {
ans++;
visited[x][y]=true;
}
for (int k = 0; k < 4; k++) {
int xx = x + dx[(dir+3)%4];
int yy = y + dy[(dir+3)%4];
if(map[xx][yy]==0 && !visited[xx][yy]) {
clean(xx,yy,(dir+3)%4);
sign=true;
break;
}
dir = (dir+3)%4;
}
if(sign==false) {
int xx = x+dx[(dir+2)%4];
int yy = y+dy[(dir+2)%4];
if(map[xx][yy]==0) {
clean(xx,yy,dir);
}
}
}
}
- 이 문제의 경우 방향에 대한 이해를 하면 구현할 수 있는 문제라고 생각합니다.
- 각 위치에서 왼쪽으로 바라보고 안되면 반시계 방향으로 돌려보는 과정을 반복하고 있습니다.
- 또한 만약에 갈수가 없다면 다시 뒤로 가는 것도 고려를 해야하는 부분입니다.
- 두 번째 예시의 경우 이동에 대한 부분을 그린 그림입니다.
'Algorithm > 백준 알고리즘' 카테고리의 다른 글
백준_1520 내리막길(자바) / DFS + DP (0) | 2021.04.19 |
---|---|
백준_15961 회전 초밥(자바) / 슬라이딩 윈도우 (0) | 2021.04.17 |
백준_17144 미세먼지 안녕! (자바) / BFS + 구현 (0) | 2021.04.16 |
백준_2564 경비원(자바) / 구현 (1) | 2021.04.16 |
백준_14500 테트로미노(자바) / DFS + 예외/브루트포스 (0) | 2021.04.15 |