본문 바로가기
알고리즘 문제/백준

[백준] 8911번: 거북이 (Java)

by Lpromotion 2024. 9. 18.

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);
    }
}
반응형

댓글