Tany
백문이불어일Tany
Tany
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • JAVA TPC (1)
    • JAVA (10)
    • CS (3)
    • SPRING (5)
    • DFS BFS (12)
    • SQL (7)
    • 알고리즘 정리 (76)
    • Git, Github (3)
    • 학습 계획 (36)
    • 코드스쿼드 학습일지 (19)
    • Servlet (5)
    • VPC (2)
    • AWS (4)
    • JPA (5)
    • 취미생활 (2)
    • 프로젝트 기록 (7)
      • Issue Tracker 삽질 기록 (5)
      • 당근마켓 API 서버 기록 (2)
      • 나만의 블로그 제작 기록 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자료구조
  • 프로그래머스
  • 이분탐색
  • JPA
  • sql
  • JSP
  • java
  • 문자열
  • 정렬
  • Stack
  • MVC
  • AWS
  • 면접을 위한 CS 전공지식 노트
  • EC2
  • BFS
  • 알고리즘
  • GIT
  • 자바
  • 해시
  • hash
  • 이코테
  • 완전탐색
  • 주간 학습 계획
  • 재귀
  • 파이썬
  • dfs
  • 인프런
  • 백준
  • github
  • MySQL

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Tany

백문이불어일Tany

자바(Java) 알고리즘 문제풀이 토마토 [인프런 / BFS]
DFS BFS

자바(Java) 알고리즘 문제풀이 토마토 [인프런 / BFS]

2022. 9. 5. 18:29

출처) 인프런

강의의 문제를 가져왔기 때문에 밝힙니다 ! 
임의로 추가, 수정, 삭제한 내용들이 있으니 정확한 이해를 위해서는 강의를 구매하시는 것을 추천드립니다 😅
출처 : 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 (인프런 강의) 

 

 


 

 

풀이 코드

BFS 활용문제로, 토마토가 다 익는데 최소 몇일이 걸리는지 구하는 문제이다.

익은 토마토 기준으로 퍼져나가면서 주위의 토마토가 익는데, 최초에 익은 토마토가 한 개가 아니기 때문에 BFS 함수 호출  전, 미리 큐에

익은 토마토의 좌표를 넣어줘야 한다. 이 때문에 큐를 static 변수로 선언.

그러고 방향 벡터에서 상,하,좌,우 로 익지 않은 토마토를 발견하면 이동하면서 익은 토마토로 변경하고 익는데 걸리는 날짜를 좌표로 표현한 dis[][] 배열의 똑같은 좌표에도 이전 값에서 1을 더해준 값을 넣어준다. 그리고 다시 큐에 이동한 좌표를 넣어주고 반복하면 끝.

 

다시 이중 반복문으로 map[][] 에 0인 값이 있다면 모든 토마토가 익지 못했으므로 -1 를 출력하고 바로 return 하도록 했고 그게 아니라면

Math.max() 함수를 사용해 count 에 dis 배열의 가장 큰 값을 담아주고 출력해주도록 했다.

package backjoonsliver.bfs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

class Point2 {
    int x;
    int y;

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

public class 토마토 {
    static int n;
    static int m;
    static int count;
    static int answer;
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, -1, 0, 1};
    static int[][] map;
    static int[][] dis;
    static Queue<Point2> q = new LinkedList<>();

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

        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());
        map = new int[n][m];
        dis = new int[n][m];

        // 1. 최초 맵 생성
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // 2. 익은 토마토 찾아서 Queue 에 미리 삽입
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (map[i][j] == 1) {
                    q.offer(new Point2(i, j));
                }

            }
        }

        BFS();

        for (int i=0; i<n; i++) {
            for (int j = 0; j < m; j++) {
                if (map[i][j] == 0) {
                    System.out.println(-1);
                    return;
                } else {
                    count = Math.max(count, dis[i][j]);
                }
            }
        }
        System.out.println(count);
    }

    private static void BFS() {
        while (!q.isEmpty()) {
            Point2 tmp = q.poll();

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

                if (nx >= 0 && nx < n && ny >= 0 && ny < m && map[nx][ny] == 0) {
                    map[nx][ny] = 1; // 체크 표시 (익은걸로 표시)
                    dis[nx][ny] = dis[tmp.x][tmp.y] + 1;
                    q.offer(new Point2(nx, ny));
                }
            }
        }
    }
}

'DFS BFS' 카테고리의 다른 글

자바(Java) 알고리즘 문제풀이 음료수 얼려먹기 [이코테 / DFS]  (0) 2022.10.09
자바(Java) 알고리즘 문제풀이 섬의 갯수 [백준 / DFS]  (0) 2022.09.06
자바(Java) 알고리즘 문제풀이 A->B [백준 / DFS]  (0) 2022.09.05
자바(Java) 알고리즘 문제풀이 음식물 피하기 [백준 / DFS]  (0) 2022.09.05
자바(Java) 알고리즘 문제풀이 전쟁 - 전투 [백준 / DFS]  (0) 2022.09.02
    'DFS BFS' 카테고리의 다른 글
    • 자바(Java) 알고리즘 문제풀이 음료수 얼려먹기 [이코테 / DFS]
    • 자바(Java) 알고리즘 문제풀이 섬의 갯수 [백준 / DFS]
    • 자바(Java) 알고리즘 문제풀이 A->B [백준 / DFS]
    • 자바(Java) 알고리즘 문제풀이 음식물 피하기 [백준 / DFS]
    Tany
    Tany
    내가 보려고 만드는 백엔드 기록장 Github https://github.com/juni8453

    티스토리툴바