인프런 커뮤니티 질문&답변

wjdgodnd3님의 프로필 이미지
wjdgodnd3

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

12. 토마토(BFS)

안녕하세요 선생님 다른방식으로 BFS를 풀어봤는데 어떤게 더 좋은 효율인가요?

작성

·

80

·

수정됨

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

package DFS_BFS;
import java.util.*;

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

public class Main22 {
    static int n, m;
    static int[][] box;
    static int answer = 0;
    static int dx[] = {-1, 0, 1, 0};
    static int dy[] = {0, 1, 0, -1};
    static boolean flag = true;

    public static void BFS() {
        Queue<Point> Q = new LinkedList<>();

        // 처음에 익은 토마토를 큐에 추가
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (box[i][j] == 1) {
                    Q.offer(new Point(i, j));
                }
            }
        }

        while (!Q.isEmpty()) {
            int size = Q.size();
            for (int s = 0; s < size; s++) {
                Point tmp = Q.poll();
                for (int i = 0; i < 4; i++) {
                    int nx = tmp.x + dx[i];
                    int ny = tmp.y + dy[i];
                    if (nx >= 0 && nx < n && ny >= 0 && ny < m && box[nx][ny] == 0) {
                        box[nx][ny] = 1;
                        Q.offer(new Point(nx, ny));
                    }
                }
            }
            answer++; // 한 레벨 탐색이 끝나면 answer 증가
        }
        answer--; // 마지막 레벨에서 더 증가된 값을 보정
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();
        n = sc.nextInt();

        box = new int[n][m];

        // 초기 박스 상태 설정
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                box[i][j] = sc.nextInt();
                if (box[i][j] == 0) flag = false;
            }
        }

        // 이미 모두 익었으면 0 출력
        if (flag) {
            System.out.print(0);
            return;
        }

        // BFS 수행
        BFS();

        // 모든 칸이 익었는지 검사
        flag = true;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (box[i][j] == 0) {
                    flag = false;
                    break;
                }
            }
            if (!flag) break;
        }

        // 결과 출력
        System.out.print(flag ? answer : -1);
    }
}

 

선생님께서는 dis배열을 만들어서 푸셨는데 저는 생각할때 box배열에 있는 0들을 없앤다는 식으로 생각해서 이런식으로 풀었는데 어떤게 더 효율이좋나요? 이것도 맞는 풀이일까요?

답변

답변을 기다리고 있는 질문이에요
첫번째 답변을 남겨보세요!
wjdgodnd3님의 프로필 이미지
wjdgodnd3

작성한 질문수

질문하기