inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-D와 반례

3-D 질문입니다..

356

작성자 없음

작성한 질문수 0

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;
        }
    }
}

코딩-테스트 java

답변 2

0

큰돌

안녕하세요 corin님ㅎㅎ

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

감사합니다.

0

인프런 AI 인턴

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

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

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

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

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

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

4 - A

0

25

2

코딩살구클럽 입장이 안됩니다

0

64

2

4-F 경우의 수 질문입니다.

0

32

2

코딩살구클럽 가입이 안됩니다.

0

75

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

55

1

교안 158페이지 문의드립니다

0

44

2

코딩살구클럽 관련 건의사항

0

116

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

44

1

진행 방법 질문드립니다!

0

81

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

63

2

2주차 개념#12 트리 순회

0

32

2

백준사이트가 종료된다고 합니다.

0

316

2

백준 서비스 종료

9

951

1

sk 하이닉스 코테 대비

0

385

2

3-G 최댓값 질문

0

54

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

65

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

4-H 질문 있습니다 (코드 리뷰)

0

69

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

183

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

72

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

65

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

53

2