[JAVA] 로봇 청소기 - Simulation
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
생각과정
- 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
[JAVA] 자바_Math.abs ( 절대값 )
Math.abs() - static int abs(int a) - static double abs(double a) - static float abs(float a) - static long abs(long a) - abs() 함수는 인자값에 대한 절대값을 반환하는 함수이다. public cla..
mine-it-record.tistory.com
백준 문제 자바로 풀 때 유의사항
2352문제를 풀 때, 처음으로 자바로 답을 제출해보았다. 이때, 제출 형식에 유의할 점이 있는데 몰랐어서 ...
blog.naver.com