공부하는 스누피
[JAVA] 로봇 청소기 - Simulation 본문
https://www.acmicpc.net/problem/14503
생각과정
- for문을 구현할 때, r은 i 인덱스로, c는 j인덱스로 생각한다.
- 현재 위치가 (i, j)라면 북쪽은 (i-1, j), 동쪽은 (i, j+1), 남쪽은 (i+1, j), 서쪽은 (i, j-1)이라고 본다.
- 청소한 부분은 벽, 빈칸과 구분되어야 하니까 2로 정한다.
- 청소하고 왼쪽으로 돌다가 앞에 빈칸있으면 움직인다. 빈칸(0)이 없으면 후진한다. 후진할 때 벽이 있으면 종료한다.
- 왼쪽으로 돌때 바뀐 방향은 (원래 방향+3)%4이다. 1씩 감소하면서 최솟값이 0, 최댓값이 3이어야 하기 때문이다.
구현
package baekjoon;
import java.util.Scanner;
public class b14503 {
public int b14503(int n, int m, int r, int c, int d, int[][]map) {
int count = 0;
int head = d;
int headR = 0;
int headC = 0;
int flag = 0;
while(true) {
flag = 0;
if(map[r][c] == 0) {
map[r][c] = 2;
count ++;
}
for(int i=0;i<4;i++) {
head = turn(head);
if(head == 0) {
headR = r - 1;
headC = c;
}
else if(head == 1) {
headR = r;
headC = c + 1;
}
else if(head == 2) {
headR = r + 1;
headC = c;
}
else if(head == 3) {
headR = r;
headC = c - 1;
}
if(headR<n && headC<m && headR >=0 && headC >= 0) {
if(map[headR][headC] == 0) {
r = headR;
c = headC;
break;
}
}
if(i==3) {
flag = 1;
break;
}
}
if(flag == 1) {
//후진 가능 확인
if(head == 0) {
headR = r + 1;
headC = c;
}
else if(head == 1) {
headR = r;
headC = c - 1;
}
else if(head == 2) {
headR = r - 1;
headC = c;
}
else if(head == 3) {
headR = r;
headC = c + 1;
}
if(headR<n && headC<m && headR >=0 && headC >= 0) {
if(map[headR][headC] == 1) {
break;
}
else{
r = headR;
c = headC;
}
}else {
break;
}
}
}
return count;
}
public int turn(int d) {
return Math.abs((d+3)%4);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int n, m, r, c, d;
Scanner s = new Scanner(System.in);
n = s.nextInt();
m = s.nextInt();
r = s.nextInt();
c = s.nextInt();
d = s.nextInt();
int [][] map = new int[n][m];
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
map[i][j] = s.nextInt();
}
}
b14503 b = new b14503();
System.out.println(b.b14503(n, m, r, c, d, map));
}
}
Result
Math.abs()
절대값 구하는 메소드. 인자로 int, float, double 등 숫자형 값을 넣으면 같은 자료형의 절대값이 리턴된다.
백준 JAVA 풀때 유의사항
- 클래스 이름은 Main으로 해야 한다.
- package가 선언되어 있다면 지워야 한다.
- 안하면 컴파일 에러, Runtime Error가 순서대로 뜬다...
참고
https://mine-it-record.tistory.com/139
'Algorithms > 코딩테스트 문제풀이' 카테고리의 다른 글
[JAVA] 14502 연구실 - DFS (0) | 2020.07.24 |
---|---|
[JAVA] 연산자 끼워넣기 - DFS (0) | 2020.07.23 |
[JAVA] 비밀지도 - StringBuffer (0) | 2020.07.21 |
[JAVA] 캐시 - LinkedList (0) | 2020.07.17 |
[JAVA] 프렌즈4블록 - String (0) | 2020.07.16 |
Comments