• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

3-D 질문입니다..

23.07.14 16:57 작성 조회수 273

0

2일째 고민을 해보았는데..

2%까지만 맞고 틀리다고 합니당..ㅠㅠ

포기하고 싶지 않은 마음에 도움을 요청합니다!!

제가 짠 코드는 이렇습니다!

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

// 불이 하나가 아닌 여러개일 수 있다.
public class Main {

    public static int R;
    public static int C;

    public static String[][] map;

    public static int[][] visitedFire;
    public static int[][] visitedHuman;

    public static int[] dx;
    public static int[] dy;

    public static Node fireLocation;
    public static Node humanLocation;

    public static Queue<Node> fireQueue;

    public static void main(String[] args) throws IOException {

        // 초기화
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());

        map = new String[R][C];

        // 0으로 초기화
        visitedFire = new int[R][C];
        visitedHuman = new int[R][C];

        dx = new int[]{0,1,0,-1};
        dy = new int[]{-1,0,1,0};

        fireQueue = new LinkedList<>();

        // 맵 입력
        for (int i = 0; i < R; i++) {
            String S = br.readLine();
            for (int j = 0; j < C; j++) { // 불 좌표, 지훈이 좌표 찾기
                map[i][j] = String.valueOf(S.charAt(j));
                if(map[i][j].equals("J")){
                    humanLocation = new Node(j,i);
                    map[i][j] = "."; // .으로 변경
                }else if(map[i][j].equals("F")){ // 불이 여러개, 불이 아무것도 없을 수 있다. -> 반레
                    fireLocation = new Node(j,i);
                    fireQueue.add(fireLocation);
                    visitedFire[i][j] = 1;
                }
            }
        }

        // (1) 불이 이동할 수 있는 최단경로
        fireBfs();

        // (2) 사람이 이동할 수 있는 최단경로 + 길 비교해야함
        humanBfs(humanLocation.y, humanLocation.x);
        // 가능한 길 찾아서


        int result = Integer.MAX_VALUE;

        // (3) 가장 짧은 최단거리 찾기 (가장자리 찾기)
        for (int i = 0; i < visitedHuman.length; i++) {
            for (int j = 0; j < visitedHuman[i].length; j++) {
                if((0<i && i<R-1) && 0 < j && j < C-1)continue; // 가장자리가 아닌 경우 pass
                if(visitedHuman[i][j] > 0) {
                    result = Math.min(result, visitedHuman[i][j]);
                }
            }
        }

        if(result == Integer.MAX_VALUE){
            System.out.println("IMPOSSIBLE");
        }else{
            System.out.println(result);
        }
    }

    public static void humanBfs(int y, int x){ // tkfk

        visitedHuman[y][x] = 1;

        Node node = new Node(x,y);
        Queue<Node> queue = new LinkedList<>();
        queue.add(node);

        while(queue.size()>0){
            Node cur = queue.poll();

            for (int i = 0; i < 4; i++) {
                int nx = cur.x + dx[i];
                int ny = cur.y + dy[i];

                if(nx < 0 || nx >= C || ny < 0 || ny >= R) continue;
                if(visitedHuman[ny][nx] == 0 && (map[ny][nx].equals("."))){
                    if(visitedHuman[ny][nx] < visitedFire[ny][nx] || visitedFire[ny][nx] == 0){
                        visitedHuman[ny][nx] = visitedHuman[cur.y][cur.x] + 1;

                        Node next = new Node(nx,ny);
                        queue.add(next);
                    }
                }
            }
        }
    }

    public static void fireBfs(){

        while(fireQueue.size()>0){
            Node cur = fireQueue.poll();

            for (int i = 0; i < 4; i++) { // 4방향 탐지
                int nx = cur.x + dx[i];
                int ny = cur.y + dy[i];

                if(nx < 0 || nx >= C || ny < 0 || ny >= R) continue;
                if(visitedFire[ny][nx] == 0 && (map[ny][nx].equals("."))){
                    visitedFire[ny][nx] = visitedFire[cur.y][cur.x] + 1; // 이동함을 표현
                    Node next = new Node(nx,ny);
                    fireQueue.add(next);
                }
            }
        }
    }


    public static class Node {
        int x;
        int y;

        Node(int x, int y){
            this.x = x;
            this.y = y;
        }
    }
}

답변 2

·

답변을 작성해보세요.

0

안녕하세요 corin님ㅎㅎ

죄송하지만 C++이외의 언어는 답변 드리지 않고 있습니다.

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.16

안녕하세요, 인프런 AI 인턴이에요. 3-D 질문에 대해 답변해드릴게요.

우선, 코드를 보니 클래스 내에 main 메소드가 선언되어 있는데, main 메소드를 어디서 호출하는지 확인해야 합니다. 프로그램을 실행시킬 때 main 메소드에서 시작할지, 혹은 다른 클래스에서 main 메소드를 호출할지에 대해 고민해보세요.

그리고, 코드를 실행하기 위해 입력을 받아야 하는 부분이 있는데, 이 부분은 어디에 있는지 확인해야 합니다. 현재 코드에서는 BufferedReader를 통해 입력을 받는 부분이 주석 처리되어 있어서 입력을 받지 못하는 상태입니다. 필요한 입력 값을 받을 수 있도록 주석을 해제하여 입력 처리를 추가해주세요.

그리고 코드에서 사용하는 변수와 배열들은 어디서 선언되고 어떻게 사용되는지 파악해야 합니다. 예를 들어, Node 클래스와 Queue 변수인 fireQueue는 어떤 용도로 사용되는지 확인해보세요. 또한, visitedFire와 visitedHuman은 무슨 역할을 하는지 이해하고 있어야 합니다.

추가로, 코드 내에서는 불에 대한 위치와 사람의 위치를 저장하는 fireLocation과 humanLocation이라는 변수가 어디서 초기화되고 어떻게 사용되는지 찾아보세요.

이렇게 코드를 분석하고 필요한 부분을 적절하게 수정하면 원하는 결과를 얻을 수 있을 것입니다. 잘 되지 않는 부분이 있다면 자세한 내용을 알려주시면 도움을 드릴게요. 화이팅하세요!