0. 단순한 구현 문제
- 2-b 수행하기 전 2-c,d먼저 조건 체크/수행해야한다
1. 현재 위치를 청소하며 clean 수치를 1씩 증가시킨다
2. 2-c,d 조건 체크를 위해 4방향 탐색
3. 4방향 다 벽/청소가 끝났다면 현 위치의 뒤를 확인하여 벽이라면 종료한다 (2-d)
4. 벽이 아니라면, 뒤로 물러난다 (2-c)
5. 왼쪽에 빈공간이 있다면, 회전 후 1칸 진행한다 (2-a)
4. 없다면, 회전한다 (2-b)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
static int[][]left= {
{0,-1},//북쪽 기준 왼쪽
{-1,0},//동쪽 기준 왼쪽
{0,1},//남쪽기준
{1,0}//서쪽기준
};
static int[][]back= {
{1,0},//북쪽 기준 뒤쪽
{0,-1},//동쪽 기준 뒤쪽
{-1,0},//남쪽 기준 뒤쪽
{0,1}//서쪽 기준 뒤쪽
};
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = pint(st.nextToken());
int m = pint(st.nextToken());
st = new StringTokenizer(br.readLine(), " ");
int r = pint(st.nextToken());
int c = pint(st.nextToken());
int d = pint(st.nextToken());
int[][]map = new int[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < m; j++) {
map[i][j]=pint(st.nextToken());
}
}
int clean=0;
while(true) {
//1
if(map[r][c]==0) {
map[r][c]=2;
clean++;
}
//2-c
//2-d
boolean isDone=true;
for (int i = 0; i < 4; i++) {
if(map[ r+left[i][0] ][ c+left[i][1] ]==0) {
isDone=false;
}
}
if(isDone) {//4방에 0이 없으면
if(map[r+back[d][0]][c+back[d][1]]==1) {
//2-D, 뒤가 벽
break;
}
else {
//2-C, 물러남
r+=back[d][0];
c+=back[d][1];
continue;
}
}
//2-a
//왼쪽에 청소 안했으면
if(map[r+left[d][0]][c+left[d][1]]==0) {
r+=left[d][0];
c+=left[d][1];
d=(d+4-1)%4;
}
//2-b
else {
d=(d+4-1)%4;
}
}
System.out.println(clean);
}
static int pint(String s) {
return Integer.parseInt(s);
}
}
'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글
[백준] 1342 - 행운의 문자열 (0) | 2021.06.18 |
---|---|
[백준] 9081 - 단어 맞추기 (0) | 2021.06.18 |
[백준] 16234 - 인구 이동 (0) | 2021.06.15 |
[백준] 15685 - 드래곤 커브 (0) | 2021.06.15 |
[백준] 1922 - 네트워크 연결 (0) | 2021.06.11 |
[백준] 1647 - 도시 분할 계획 (0) | 2021.06.07 |
[백준] 1007 - 벡터 매칭 (0) | 2021.06.07 |