문제(출처: 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 |