코딩테스트/백준

[백준]1347번 미로 만들기 - Java

GAEBAL 2022. 6. 5. 15:41
728x90

문제

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

 

1347번: 미로 만들기

홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍

www.acmicpc.net

 

 

풀이

지금까지 풀었던 문제들은 미로라면 미로, 지도라면 지도가 주어지고 그 미로나 지도 위에서 찾고자하는 무언가를 찾는 방식이였는데 이 문제는 이동한 칸이 먼저 나오고 미로의 모양을 출력해야 되는 문제라 신박했다.

 

포인트는

제한사항에서 홍준이가 적은 내용의 길이가 0보다 크고 50보다 작다고 적혀있어서 미리 미로의 최대 크기를 정해놓고 접근해야 함
지도의 시작점과 끝점을 이동할 때마다 최신화 시켜줘야 함

 

자세한건 주석으로!

 

 

코드

// 1347번 미로 만들기
// https://www.acmicpc.net/problem/1347

package BAEKJOON;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Num1347_미로만들기 {
    static int N;
    // 남서북동 - 홍준이가 처음에 남쪽을 보고 있기 때문(사실 밑에서 고쳐도 돼서 상관은 없긴함)
    static int[] dr = {1, 0, -1, 0};
    static int[] dc = {0, -1, 0, 1};

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

        // 홍준이가 적은 내용의 길이가 0보다 크고 50보다 작기 때문에 최대 map의 크기를 100으로 잡음
        char[][] map = new char[101][101];
        for (int i = 0; i < 101; i++) {
            for (int j = 0; j < 101; j++) {
                map[i][j] = '#'; // 미리 벽으로 다 만들어 놓음
            }
        }

        int startX, startY, minY, minX, maxY, maxX;
        // 홍준이가 적은 내용의 길이가 0보다 크고 50보다 작기 때문에 시작을 (50, 50)에서 함
        startX = startY = minY = minX = maxX = maxY = 50;

        int d = 0; // 맨 처음 시작 방향(홍준이가 바라보고 있는 남쪽)

        map[startY][startX] = '.';

        for (int i = 0; i < str.length(); i++) {
            char temp = str.charAt(i);
            if (temp == 'F') { // 앞으로 전진이면
                // 앞으로 전진하고
                startY += dr[d];
                startX += dc[d];
                map[startY][startX] = '.'; // 그 위치를 이동할 수 있는 칸이라고 표시

                // 지도의 시작점과 끝점을 최신화
                maxY = Math.max(maxY, startY);
                maxX = Math.max(maxX, startX);
                minY = Math.min(minY, startY);
                minX = Math.min(minX, startX);
            } else if (temp == 'R') { // 오른쪽이면 방향 전환
                d = (d + 1) % 4;
            } else if (temp == 'L') { // 왼쪽이면 방향 전환
                d = (d + 3) % 4;
            }
        }

        // 필요한 부분만 출력
        for (int i = minY; i <= maxY; i++) {
            for (int j = minX; j <= maxX; j++) {
                System.out.print(map[i][j]);
            }
            System.out.println();
        }
    }
}
728x90