본문 바로가기
Algorithm/백준

[Java][백준] 8911번 거북이

by jisu-jeong0 2023. 12. 1.
 

8911번: 거북이

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 컨트롤 프로그램이 주어진다. 프로그램은 항상 문제의 설명에 나와있는 네가지 명령으로만 이루어져

www.acmicpc.net


 

아이디어

1. 거북이가 현재 바라보고 있는 방향을 체크한다.

2. 방향 체크 이후 명령(이동 or 방향 전환)을 수행한다.

3. 직사각형이므로 x축 거리와 y축 거리를 확인해야 한다. x의 최솟값과 최댓값, y의 최솟값과 최댓값을 구해서 각각의 거리를 구하고 (x축 거리) * (y축 거리) 결과를 출력한다.

4. x나 y 둘 중에 하나라도 0이라면(선분이라면) 0을 출력한다.

 

 

코드 구현

import java.io.*;

class BJ_8911 {
    public static void main(String[] args) throws IOException {        // 거북이

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bufferedReader.readLine());

        for (int i = 0; i < n; i++) {
            String command = bufferedReader.readLine();
            int minX = 0, minY = 0, maxX = 0, maxY = 0;
            int x = 0, y = 0;
            int direction = 3;   // 0: 동, 1: 서, 2: 남, 3: 북

            for (char c : command.toCharArray()) {
                if ( c == 'F' ) {
                    if (direction == 0) x++;
                    else if (direction == 1) x--;
                    else if (direction == 2) y--;
                    else y++;
                } else if (c == 'B') {
                    if (direction == 0) x--;
                    else if (direction == 1) x++;
                    else if (direction == 2) y++;
                    else y--;
                } else if (c == 'L') {
                    if (direction == 0) direction = 3;
                    else if (direction == 1) direction = 2;
                    else if (direction == 2) direction = 0;
                    else direction = 1;
                } else if (c == 'R') {
                    if (direction == 0) direction = 2;
                    else if (direction == 1) direction = 3;
                    else if (direction == 2) direction = 1;
                    else direction = 0;
                }
                minX = Math.min(minX, x);
                minY = Math.min(minY, y);
                maxX = Math.max(maxX, x);
                maxY = Math.max(maxY, y);

        }
        int area = (maxX - minX) * (maxY - minY);
        System.out.println(area);
    }
    }
    }
   

 

  • 처음 시작시 거북이가 북쪽을 바라보고 있으므로 시작 direction은 3이다. (편의상 동서남북 순서로 지정했다)
  • 입력받은 문자열을 문자 배열로 바꿔서 한 글자씩 반복문을 수행한다.
  • FBLR 각각의 문자에 따라 현재 방향을 확인해준 뒤, 이동 및 방향 전환을 수행해준다.
  • 반복문 수행 과정에서 최소, 최대 XY값을 구해준 뒤, 마지막에 넓이를 구해서 출력한다.

 

 

처음에는 방향 확인 과정이 비효율적인 것처럼 보여서 다르게 작성하고 싶었는데 어떻게 수정해야 할 지 몰라서 이대로 풀어봤다.. 다음엔 더 좋은 방법으로 풀 수 있길 바란다!