데블 아니고 데블리

운동,햄버거, 개발 좋아요

🐷💻📝

알고리즘

[백준_8911] 거북이

데블아니고데블리 2024. 4. 11. 23:40

 

https://www.acmicpc.net/problem/8911

 

8911번: 거북이

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

www.acmicpc.net

구현문제 기본이라서 가지고 왔다. 

방향을 설정해 이동시키는 로직이다.

 

[문제 요약]

실버 3단계 문제입니다.

 

0,0 위치에서 위(북쪽)을 바라보는 거북이 로봇이 있다. 제공되는 문자에 따라 

- F: 한 눈금 앞으로

- B: 한 눈금 뒤로

- L: 왼쪽으로 90도 회전

- R: 오른쪽으로 90도 회전

하며 움직이고, 움직인 좌표를 모두 포함하는 가장 작은 직사각형의 넓이를 구하면 된다

 

[입력 이해]

테스트 케이스의 수 : 3
case 1 : FFLF
case 2 : FFRRFF
case 3 : FFFBBBRFFFBBB

 

우선 case 1 번 경우를 풀어보겠다 !

먼저 문제에서 북쪽(위쪽)을 바라보고 있는 거북이가 0,0에서 출발한다고 주어진다.

FFLF의 경우 다음과 같이 이동할 수 있다.

마지막으로 지나간 자리를 모두 구해 출력해주면 된다.

 

이런식으로 방향전환이 이루어질때, 앞/ 뒤로 가야할 때의 로직이 필요하다.

 

전체 코드는 다음과 같다. 주석을 상세하게 달아놓아 주석을 참고하면 좋을 것 같다

package src.com.company.week3.day2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
 * 오늘의 교훈 : 문제를 잘 읽자, 거북이가 오른쪽, 왼쪽으로도 이동하는 줄 알고 한참 고생했다
 * 오른쪽 왼쪽은 돌려주기만 하자
 * 풀이 :
 *   1) F : 앞으로 가야 하니까 dx[0],dy[0], 거북이 이동 x, y 좌표도 움직여준다
 *   2) B : 뒤로 가야 하니까 앞으로 가야 하는것에 마이너스 붙여준다 (- dx[0], -dy[0]) 거북이 이동 x, y 좌표도 움직여준다
 *   1) L : 왼쪽으로 돌려주기 : 방향만 돌려준다 나는 index 라는 변수를 사용하고 있어 갱신 안되게 나머지값을 가져다가 씀
 *   1) R : 오른쪽으로 돌려주기 : 위랑 같다
 * */

public class BJ_8911_거북이 {
    static int[] dx = {0, 1, 0, -1};
    static int[] dy = {1, 0, -1, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            int x = 0, y = 0;

            int minX = 0, minY = 0, maxX = 0, maxY = 0;
            // 북쪽
            int index = 0;

            String directions = br.readLine();
            for (char dir : directions.toCharArray()) {
                switch (dir) {
                    case 'F':
                        x += dx[index];
                        y += dy[index];
//                        x += dx[0];
//                        y += dy[0];
                        break;
                    case 'R':
//                        index = (index + 1);
                        index = (index + 1) % 4;
                        break;
                    case 'B':
//                        x += dx[2];
//                        y += dy[2];
                        x -= dx[index];
                        y -= dy[index];
                        break;
                    case 'L':
                        // 'L' 케이스에서는 방향만 변경하고 위치는 변경하지 않음
                        //index = (index + 3); : index 라는 변수 값이 바뀌어버려서 답이 안나옴
                        index = (index + 3) % 4;
                        break;
                }
                // 최소, 최대 x, y 좌표 업데이트
                minX = Math.min(minX, x);
                minY = Math.min(minY, y);
                maxX = Math.max(maxX, x);
                maxY = Math.max(maxY, y);
            }

            // 곱해주기
            int area = Math.abs(maxX - minX) * Math.abs(maxY - minY);
            System.out.println(area);
        }
    }
}

'알고리즘' 카테고리의 다른 글

[백준_2293] 동전 1  (0) 2024.04.16
[기타] 자바로 조합 구현하기(with 공주 옷입히기)  (0) 2024.04.11
[백준_27160] 할리갈리  (0) 2024.03.28
[백준_1152] 단어의 개수  (0) 2024.03.28