코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

7576번 : 토마토

2022. 8. 23. 15:02

https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

 

문제

 

 

코드

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

public class Main {
    static int[][] g;
    static int m;
    static int n;
    static int dx[] = {-1, 1, 0, 0};
    static int dy[] = {0, 0, -1, 1};
    static Queue<int []> q = new LinkedList();

    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(), " ");
        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());

        g = new int[n][m];
        for(int i=0;i<n;i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for(int j=0;j<m;j++) {
                g[i][j] = Integer.parseInt(st.nextToken());
                if(g[i][j] == 1) {
                    q.add(new int[]{i, j});
                }
            }
        }

        bw.write(bfs() + ""); bw.flush();
    }

    public static int bfs() {

        while(!q.isEmpty()) {
            int[] node = q.poll();
            int i = node[0];
            int j = node[1];

            for(int k=0;k<4;k++) {
                int x = i + dx[k];
                int y = j + dy[k];
                if(x<0 || y<0 || x>=n || y>=m) continue;
                if(g[x][y]==0) {
                    g[x][y] = g[i][j] + 1; //익은 날짜 저장
                    q.add(new int[]{x, y});
                }
            }
        }

        int result = -1;
        for(int i=0;i<n;i++) {
            for(int j=0;j<m;j++) {
                if(g[i][j] == 0) return -1; //토마토가 모두 익지 못 하는 상황
                if(g[i][j]>result) result = g[i][j]; //촤대 날짜 구하기
            }
        }
        //익은 날짜 - 1 해줘야함
        return result-1;
    }
}

 

 

해결방법

문제를 잘못 이해해서 "익은 토마토 중 어떤 토마토부터 익어야 최소 일수를 구할 수 있는가 그때의 최소 일수를 구하라"로 알고 코드를 구현하였는데 생각해보니 이런 문제가 아니었다. 익은 토마토들은 하루가 지날 때마다 같이 익기 때문이다.

그래서 어떻게 풀지 다시 생각하였는데 도저히 생각이 안 났다. 입력받은 토마토 중 익은 토마토가 2개 이상일 때 이를 어떻게 같이 bfs로 처리할지 감이 안 왔기 때문이다. 결론은 다른 사람의 풀이를 참고하여 풀었다. 참고

 

 이 분은 입력받은 토마토 중 익은 토마토들을 큐에 모두 넣어서 bfs를 진행하였다. 이러면 익은 토마토가 여러 개여도 같이 익어갈 수 있다. 어떻게 이런 생각을 하였는지 존경스러웠다. 익은 날짜는 해당 토마토의 위치에 이전 토마토의 값 + 1을 하여 구현하셨다. 이후 최대 날짜만 구해 -1 하면 해결된다.

-1 하는 이유는 조금만 생각해보면 바로 이해될 것이다.

 

입력받은 토마토 칸

0 0 0 0 0 0                          1 -1 0 0 0 0  
0 0 0 0 0 0                          0 -1 0 0 0 0
0 0 0 0 0 0                          0 0 0 0 -1 0
0 0 0 0 0 1                          0 0 0 0 -1 1

bfs 진행 후 토마토 칸
9 8 7 6 5 4                          1 -1 7 6 5 4 
8 7 6 5 4 3                          2 -1 6 5 4 3 
7 6 5 4 3 2                          3 4 5 6 -1 2 
6 5 4 3 2 1                          4 5 6 7 -1 1 

 

출력

8                                         6

 

 

솔직히 이번 문제는 제대로 이해했으면 시도도 안 해봤을 문제였을 것 같다. 이 점에선 잘못 이해해서 좋은 부분(?)도 있는 것 같다.

'알고리즘 > 백준' 카테고리의 다른 글

7562번 : 나이트의 이동  (0) 2022.08.25
4963번 : 섬의 개수  (0) 2022.08.23
11724번 : 연결 요소의 개수  (0) 2022.08.21
2776번 : 암기왕  (0) 2022.08.21
2357번 : 최솟값과 최댓값  (0) 2022.08.18
    '알고리즘/백준' 카테고리의 다른 글
    • 7562번 : 나이트의 이동
    • 4963번 : 섬의 개수
    • 11724번 : 연결 요소의 개수
    • 2776번 : 암기왕
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바