문제 풀이/백준

[백준] 1347번. 미로 만들기(JAVA)

27200 2025. 2. 2. 14:31

문제

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


풀이(40분)

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int l = Integer.parseInt(br.readLine());

        Character[][] arr = new Character[100][100]; // 최초 배열 초기화
                                                     // null 값 사용을 위한 Character 배열

        int row = 49; // 초기 시작 위치
        int col = 49; // ''
        int maxRow = row; // 배열을 자르기 위한 정보
        int maxCol = col; // ''
        int minRow = row; // ''
        int minCol = col; // ;;
        int[][] direction = {{-1, 0}, {0,1}, {1,0},{0, -1}}; // 북 동 남 서
        int nowDirection = 2; // 현재의 방향으로 초기 남쪽을 가르킴
        arr[row][col] = '.'; // 시작점 체크
        String map = br.readLine();
        for(int i = 0; i < l; i++){
            char point = map.charAt(i);
            nowDirection = directionChange(nowDirection, point); // 방향 결정
            if (point == 'F') { // 이동하는 것이라면
                row += direction[nowDirection][0]; // 좌표 변경
                col += direction[nowDirection][1]; // ''
                maxRow = Math.max(row, maxRow); // 배열을 자르기 위한 정보 수정
                minRow = Math.min(row, minRow); // ''
                maxCol = Math.max(col, maxCol); // ''
                minCol = Math.min(col, minCol); // ''
                arr[row][col] = '.'; // 좌표 체크
            }
        }

        StringBuilder sb = new StringBuilder();
        for(int i = minRow; i <= maxRow; i++){ // 배열을 잘라 사용
            for(int j = minCol; j <= maxCol; j++){ // ;;
                if(arr[i][j] != null){ // null 값이라면 #으로 표시
                    sb.append(arr[i][j]);
                }else{
                    sb.append('#');
                }
            }
            sb.append("\n");
        }
        
        System.out.println(sb);
    }

    public static int directionChange(int direction, char point){ // 방향을 결정해주는 메서드
        switch(point){
            case 'L': // 왼쪽으로 회전하는 경우
                if(direction == 0){
                    return 3;
                }
                return direction - 1;
            case 'R': // 오른쪽으로 회전하는 경우
                if(direction == 3){
                    return 0;
                }
                return direction + 1;
        }
        return direction;
    }

}

 

문제를 시작할 때 방향 전환 등에 대해서는 이미 많은 경험을 통해 어렵지 않다고 생각했다.

하지만, 출력을 어떻게 해주어야 하는 것인지가 고민되었다.

-> 문제 조건을 정확히 파악하는 것을 우선으로 하자.

 

고민이 될 때는 머릿속으로만 하는 것이 아닌 문제를 여러 번 꼼꼼하게 읽고자 했었고, 풀이를 어렵지 않게 찾아낼 수 있었다.

-> 구현 실력을 길러야겠다. 생각보다 오래걸렸다.

 

풀이는 단순하다. 문제 조건 자체가 이동하는 정보의 길이가 50을 넘지 않는다고 하였다.

-> 어떤 방향으로 가더라도 100으로 정해둔다면 문제가 없다.

 

초기 위치와 방향을 설정해 주고, 방향을 전환하는 함수를 따로 만들어준다.

최종적으로 F 가 나오는 경우에만 이동을 하며, 이때 결과를 출력하기 위한 최솟값과 최댓값의 바운더리를 정하는 것까지 하였다.

 

결과적으로 정해진 바운더리 안에서 배열을 순회하며 값을 출력하면 된다!