1. 문제설명
2차원 평면에서 거북이 로봇에게 내릴 수 있는 명령은 F(한 눈금 앞으로), B(한 눈금 뒤로), L(왼쪽으로 90도 화전, 방향만 바꿈), R(오른쪽으로 90도 회전, 방향만 바꿈)이 있다. 거북이가 지나간 영역을 모두 포함할 수 있는 가장 작은 직사각형의 넓이를 구하는 문제이다.
- 시간 제한: 1초
- 메모리 제한: 128MB
2. 접근 방식
- 방향 배열 `dx`, `dy` 를 사용한다. (북동남서 순서)
- 입력에 따른 좌표 게산과 방향 전환을 통해 거북이가 이동하는 영역의 최대/최소 좌표를 구한다.
- 입력에 따른 좌표 계산
- F, B ⇒ x, y 좌표를 현재 방향에 따라 좌표 계산
- 입력에 따른 방향 전환
- L ⇒ 방향 인덱스 : 3→2, 2→1, 1→0, 0→3 ⇒ `(g + 3) % 4`
- R ⇒ 방향 인덱스: 0→1, 1→2, 2→3, 3→0 ⇒ `(g + 1) % 4`
- 거북이가 이동한 영역을 모두 포함하는 작은 직사각형의 넓이 ⇒ 구한 최대/최소 좌표로 계산한 직사각형 넓이
3. 최종 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
// 방향 배열: 북(0), 동(1), 남(2), 서(3)
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
while(n-- > 0) {
int curDir = 0; // 시작 시 북쪽 방향
// 최소/최대 x, y 좌표
int minX = 0, maxX = 0, minY = 0, maxY = 0;
int x = 0, y = 0; // 계산할 x, y 좌표
String move = br.readLine();
for(int i=0; i<move.length(); i++) {
char turtle = move.charAt(i); // 명령 입력받기
if(turtle == 'F') { // 한 눈금 앞으로
x += dx[curDir];
y += dy[curDir];
} else if(turtle == 'B') { // 한 눈금 뒤로
x -= dx[curDir];
y -= dy[curDir];
} else if(turtle == 'L') { // 왼쪽으로 90도 회전
curDir = (curDir + 3) % 4;
} else { // 오른쪽으로 90도 회전
curDir = (curDir + 1) % 4;
}
// x, y 좌표 최소/최대값 갱신
minX = Math.min(minX, x);
maxX = Math.max(maxX, x);
minY = Math.min(minY, y);
maxY = Math.max(maxY, y);
}
int lenX = maxX - minX;
int lenY = maxY - minY;
sb.append(lenX * lenY+"\\n");
}
System.out.println(sb);
}
}
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
[백준] 1138번: 한 줄로 서기 (Java) (0) | 2024.09.18 |
---|---|
[백준] 21610번: 마법사 상어와 비바라기 (Java) (3) | 2024.09.18 |
[백준] 15685번: 드래곤 커브 (Java) (0) | 2024.09.17 |
[백준] 5212번: 지구 온난화 (Java) (0) | 2024.09.17 |
[백준] 1941번: 소문난 칠공주 (Java) (2) | 2024.09.13 |
댓글