공부하는 스누피

[JAVA] 로봇 청소기 - Simulation 본문

Algorithms/코딩테스트 문제풀이

[JAVA] 로봇 청소기 - Simulation

커피맛스누피 2020. 7. 22. 02:57

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

https://m.blog.naver.com/PostView.nhn?blogId=chltmddus23&logNo=221696297647&proxyReferer=https:%2F%2Fwww.google.com%2F

 

백준 문제 자바로 풀 때 유의사항

2352문제를 풀 때, 처음으로 자바로 답을 제출해보았다. 이때, 제출 형식에 유의할 점이 있는데 몰랐어서 ...

blog.naver.com

 

'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