inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

12. 토마토(BFS)

완강 후

377

지성조

작성한 질문수 13

1

강사님 강의 너무 잘 듣고있습니다^^  하루에 4문제 정도 꾸준히 풀고 강의 듣고있습니다. 다름이 아니라 몇일 지나면 강의를 다 볼 것같은데 아직 문제를 딱 보고 뭘 물어보는 문제이고 어떻게 접근해야할지를 정확하게 모르겠어서 해당 강의 문제를 다시 풀어볼려고하는데 .. 새로운 문제를 도전하는게 좋을까요?

코테 준비 같이 해요! java

답변 2

1

김태원

안녕하세요^^

이 강의를 우선 복습하시고, 이 강의에 있는 문제가 아무 도움없이 잘 풀리시면 그때 백준이나 프로그래머스 사이트에 가서 연습하시면 좋을 것 같습니다.

0

지성조

감사합니다 강사님 열심히 해보겠습니다. 근데 예를들어 문제를 딱 보고 DP로 풀어야되는구나, DFS로 풀어야되는구나 이런 걸 느낄려면 문제를 많이 풀어보면 알아서 저절로 느끼게 되나요?

0

charco

안녕하세요 강사님!

저같은 경우에 레벨값을 담고있는 클래스를 따로 만들어

BFS 후 레벨값을 반환하는 식으로 코드를 작성했습니다.

그런데 채점 중에 계속 시간초과가 나와서 질문드립니다.

시간초과가 나는 이유가 뭘까요?

 

package Inflearn.treegraph;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class 토마토 {

    // 토마토 박스
    static int[][] box;
    // 메모이제이션
    static int[][] dp;
    static int n;
    static int m;
    static Queue<Node> queue = new LinkedList<>();

    static class Node{
        int i;
        int j;
        int level;
        public Node(int i, int j, int level){
            this.i = i;
            this.j = j;
            this.level = level;
        }
    }

    static int bfs(){
        int answer = 0;
        
        while (!queue.isEmpty()){
            Node node = queue.poll();
            int i = node.i;
            int j = node.j;

            // 토마토가 들어있고, 메모이제이션되지 않았고, i, j가 범위를 넘어서지 않으면
            if(validateLocation(i,j) && box[i][j] != -1 && dp[i][j] == 0) {
                // 토마토를 익힌다.
                if(box[i][j] == 0) box[i][j] = 1;
                // 메모이제이션
                dp[i][j] = 1;
                // 상하좌우 큐에 넣기
                queue.add(new Node(i, j-1, node.level+1));
                queue.add(new Node(i, j+1, node.level+1));
                queue.add(new Node(i-1, j, node.level+1));
                queue.add(new Node(i+1, j, node.level+1));
                // 정답 갱신
                answer = node.level;
            }
        }

        return isThereNotRiped() ? answer : -1;
    }

    static boolean validateLocation(int i, int j) {
        if(i < 0 || i > n-1 || j < 0 || j > m-1) return false;
        return true;
    }

    static boolean isThereNotRiped(){
        for(int i = 0 ; i < n ; i ++){
            for(int j = 0 ; j < m; j++){
                if(box[i][j] == 0) return false;
            }
        }
        return true;
    }

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

        for(int i = 0; i < n ; i++){
            for(int j = 0 ; j < m ; j++){
                int x = scanner.nextInt();
                if(x == 1){
                    queue.add(new Node(i, j, 0));
                }
                box[i][j] = x;
            }
        }

        System.out.println(bfs());
    }
}

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

70

2

갑자기 채점 사이트가 바뀌었어요

0

50

1

문제 리스트 페이지

0

41

1

채점 사이트 관련 질문드립니다

0

39

1

봉우리 문제 질문입니다

0

102

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

72

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

78

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

76

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

94

2

6-7 강의에서

0

53

1

6-6. 장난꾸러기 질문 있습니다.

0

50

1

강의 수강후 코딩테스트

0

124

1

answer 변수 사용 여부

0

50

1

2중 for문

1

96

2

2-11. 임시반장정하기 (Runtime Error)

0

67

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

75

1

이런 풀이는 어떨까요

0

50

1

자바 스트림 방식의 효율성 질문 드립니다.

0

62

1

알고리즘 자료 구조들..

0

68

1

StringBuilder vs BufferdWriter

0

52

1

원더랜드(프림)

0

55

1

이런 코드는 어떤가요?

0

66

1

bfs 풀이

0

61

1

병합정렬

0

58

1