Skip to content

Commit fa7b0fc

Browse files
committed
[Silver III] Title: 거북이, Time: 532 ms, Memory: 34892 KB -BaekjoonHub
1 parent 3cf2fce commit fa7b0fc

2 files changed

Lines changed: 99 additions & 0 deletions

File tree

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# [Silver III] 거북이 - 8911
2+
3+
[문제 링크](https://www.acmicpc.net/problem/8911)
4+
5+
### 성능 요약
6+
7+
메모리: 34892 KB, 시간: 532 ms
8+
9+
### 분류
10+
11+
구현, 시뮬레이션
12+
13+
### 제출 일자
14+
15+
2025년 5월 8일 16:28:49
16+
17+
### 문제 설명
18+
19+
<p><img alt="" src="https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/upload/images/turtle2(1).png" style="float:right; height:139px; width:183px">상근이는 2차원 평면 위에서 움직일 수 있는 거북이 로봇을 하나 가지고 있다. 거북이 로봇에게 내릴 수 있는 명령은 다음과 같이 네가지가 있다.</p>
20+
21+
<ol>
22+
<li>F: 한 눈금 앞으로</li>
23+
<li>B: 한 눈금 뒤로</li>
24+
<li>L: 왼쪽으로 90도 회전</li>
25+
<li>R: 오른쪽으로 90도 회전</li>
26+
</ol>
27+
28+
<p>L과 R명령을 내렸을 때, 로봇은 이동하지 않고, 방향만 바꾼다. 명령을 나열한 것을 거북이 로봇의 컨트롤 프로그램이라고 한다.</p>
29+
30+
<p>상근이는 자신의 컨트롤 프로그램으로 거북이가 이동한 영역을 계산해보려고 한다. 거북이는 항상 x축과 y축에 평행한 방향으로만 이동한다. 거북이가 지나간 영역을 모두 포함할 수 있는 가장 작은 직사각형의 넓이를 구하는 프로그램을 작성하시오. 단, 직사각형의 모든 변은 x축이나 y축에 평행이어야 한다.</p>
31+
32+
<p>아래 그림에서 거북이는 가장 처음에 (0, 0)에 있고, 북쪽을 쳐다보고 있다. 컨트롤 프로그램이 FLFRFLBRBLB인 경우에 거북이는 아래와 같이 움직인다. 회색으로 빗금친 부분이 거북이가 지나간 영역을 모두 포함할 수 있는 가장 작은 직사각형이다. 넓이는 4가 된다.</p>
33+
34+
<p style="text-align: center;"><img alt="" src="https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/upload/images/turtle.png" style="height:294px; width:304px"></p>
35+
36+
<p>거북이가 지나간 영역이 직사각형을 만들지 않는 경우도 있다. 예를 들어, FFLLFF인 경우에 거북이는 y축의 위로만 지나다닌다. 이 경우에 거북이가 지나간 영역을 모두 포함하는 직사각형은 선분이고, 선분은 한 변이 0인 직사각형으로 생각할 수 있다. 따라서, 선분의 경우에 넓이는 0이 된다.</p>
37+
38+
### 입력
39+
40+
<p>첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 컨트롤 프로그램이 주어진다. 프로그램은 항상 문제의 설명에 나와있는 네가지 명령으로만 이루어져 있고, 길이는 500을 넘지 않는다. </p>
41+
42+
### 출력
43+
44+
<p>각 테스트 케이스에 대해서, 거북이가 이동한 영역을 모두 포함하는 가장 작은 직사각형의 넓이를 출력한다.</p>
45+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
5+
public class Main {
6+
// 북 동 남 서 이동
7+
// 북 동 남 서 → 시계 방향
8+
static int[] dx = {0, 1, 0, -1};
9+
static int[] dy = {1, 0, -1, 0};
10+
11+
public static void main(String[] args) throws IOException {
12+
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
13+
14+
int n = Integer.parseInt(bufferedReader.readLine());
15+
while (n-- > 0){
16+
String command = bufferedReader.readLine();
17+
18+
//현재위치
19+
int x = 0;
20+
int y = 0;
21+
22+
//동서남북
23+
int dir = 0;
24+
int minX = 0, maxX = 0, minY = 0, maxY = 0;
25+
26+
for (char cmd : command.toCharArray()){
27+
28+
switch (cmd){
29+
case 'F' :
30+
x += dx[dir];
31+
y += dy[dir];
32+
break;
33+
case 'B' :
34+
x -= dx[dir];
35+
y -= dy[dir];
36+
break;
37+
case 'R' :
38+
dir = (dir + 1) % 4;
39+
break;
40+
case 'L' :
41+
dir = (dir + 3) % 4;
42+
break;
43+
}
44+
//새로운 좌표 적용
45+
minX = Math.min(minX, x);
46+
maxX = Math.max(maxX, x);
47+
minY = Math.min(minY, y);
48+
maxY = Math.max(maxY, y);
49+
}
50+
int area = (maxX - minX) * (maxY - minY);
51+
System.out.println(area);
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)