🌞Algorithm/🔥Baekjoon

[Baekjoon] 8911_거북이

뿌야._. 2024. 2. 16. 11:00

Silver III

문제(출처: https://www.acmicpc.net/problem/8911)

< 거북이 >

 

문제 풀이 

 

거북이가 이동하는 위치를 좌표로 저장해서 최대 x, y 값을 구해 직사각형의 넓이를 구한다.

 

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class _8911_ { // 거북이
	static class Position {
		private int x;
		private int y;
		private int dir;

		public Position(int x, int y, int dir) {
			this.x = x;
			this.y = y;
			this.dir = dir; // 0 : 상, 1: 우, 2: 하, 3: 좌
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int t = Integer.parseInt(bf.readLine());
		for (int i = 0; i < t; i++) {
			String str = bf.readLine();

			Position position = new Position(0, 0, 0);
			int maxX = 0, maxY = 0, minX = 0, minY = 0;

			for (int j = 0; j < str.length(); j++) {
				if (str.charAt(j) == 'F') {
					if (position.dir == 0) {
						position.x += 1;
					} else if (position.dir == 1) {
						position.y += 1;
					} else if (position.dir == 2) {
						position.x -= 1;
					} else {
						position.y -= 1;
					}
				} else if (str.charAt(j) == 'B') {
					if (position.dir == 0) {
						position.x -= 1;
					} else if (position.dir == 1) {
						position.y -= 1;
					} else if (position.dir == 2) {
						position.x += 1;
					} else {
						position.y += 1;
					}

				} else if (str.charAt(j) == 'L') {
					position.dir += 1;
					if (position.dir == 4) {
						position.dir = 0;
					}

				} else if (str.charAt(j) == 'R') {
					position.dir -= 1;
					if (position.dir == -1) {
						position.dir = 3;
					}
				}

				if (position.x > maxX) {
					maxX = position.x;
				}
				if (position.y > maxY) {
					maxY = position.y;
				}
				if (position.x < minX) {
					minX = position.x;
				}
				if (position.y < minY) {
					minY = position.y;
				}
			}
			bw.write((maxX + Math.abs(minX)) * (maxY + Math.abs(minY)) + "\n");
		}
		bw.flush();
	}
}
변수)
t : 테스트 케이스 수
str : 컨트롤 프로그램
position : 거북이 위치, 방향
maxX, maxY, minX, minY : 최대 최소 좌표

 

처음 거북이 위치를 (0.0), 방향은 위로 초기화한다. 컨트롤 프로그램을 보면서 다음과 같은 작업을 한다.

 

1) F 라면 

현재 위를 보고 있다면 x+1, 오른쪽을 보고 있다면 y+1, 아래를 보고 있다면 x-1, 왼쪽을 보고 있다면 y-1

2) B 라면

현재 위를 보고 있다면 x-1, 오른쪽을 보고 있다면 y-1, 아래를 보고 있다면 x+1, 왼쪽을 보고 있다면 y+1

3) L이라면 현재 방향 +1 

4) R이라면 현재 방향 -1

5) 이동한 x좌표와 y좌표를 확인하며 최대 최소 좌표를 구한다.

 

최종 구한 최대 최소 좌표를 이용하여 직사각형의 넓이를 구한다.



 

'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글

[Baekjoon] 1706_크로스워드  (0) 2024.02.20
[Baekjoon] 11437_LCA  (0) 2024.02.19
[Baekjoon] 1918_후위 표기식  (0) 2024.02.15
[Baekjoon] 6986_절사평균  (1) 2024.02.14
[Baekjoon] 2312_수 복원하기  (2) 2024.02.13