일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- SECS/GEM
- MYSQL
- CS
- SWEA
- programmers
- 회원가입
- regression
- 비트겟
- Spring JPA
- 스포티파이
- 프로그래머스
- C++
- SECS-II
- 회귀
- 파이썬
- Computer Science
- SECS
- spotify
- SW Expert Academy
- python
- Spotify Api
- 자바
- spring boot
- java
- 백준
- c
- Baekjoon
- Gem
- modern c++
- Spring
- Today
- Total
비버놀로지
[BAEKJOON 백준] 2636 치즈 본문
문제
아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓여 있지 않으며 치즈에는 하나 이상의 구멍이 있을 수 있다.
이 치즈를 공기 중에 놓으면 녹게 되는데 공기와 접촉된 칸은 한 시간이 지나면 녹아 없어진다. 치즈의 구멍 속에는 공기가 없지만 구멍을 둘러싼 치즈가 녹아서 구멍이 열리면 구멍 속으로 공기가 들어가게 된다. <그림 1>의 경우, 치즈의 구멍을 둘러싼 치즈는 녹지 않고 ‘c’로 표시된 부분만 한 시간 후에 녹아 없어져서 <그림 2>와 같이 된다.
다시 한 시간 후에는 <그림 2>에서 ‘c’로 표시된 부분이 녹아 없어져서 <그림 3>과 같이 된다.
<그림 3>은 원래 치즈의 두 시간 후 모양을 나타내고 있으며, 남은 조각들은 한 시간이 더 지나면 모두 녹아 없어진다. 그러므로 처음 치즈가 모두 녹아 없어지는 데는 세 시간이 걸린다. <그림 3>과 같이 치즈가 녹는 과정에서 여러 조각으로 나누어 질 수도 있다.
입력으로 사각형 모양의 판의 크기와 한 조각의 치즈가 판 위에 주어졌을 때, 공기 중에서 치즈가 모두 녹아 없어지는 데 걸리는 시간과 모두 녹기 한 시간 전에 남아있는 치즈조각이 놓여 있는 칸의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에는 사각형 모양 판의 세로와 가로의 길이가 양의 정수로 주어진다. 세로와 가로의 길이는 최대 100이다. 판의 각 가로줄의 모양이 윗 줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. 치즈가 없는 칸은 0, 치즈가 있는 칸은 1로 주어지며 각 숫자 사이에는 빈칸이 하나씩 있다.
출력
첫째 줄에는 치즈가 모두 녹아서 없어지는 데 걸리는 시간을 출력하고, 둘째 줄에는 모두 녹기 한 시간 전에 남아있는 치즈조각이 놓여 있는 칸의 개수를 출력한다.
먼저 시작 위치인 0,0을 넣어서 바깥부분을 모두 2로 만들어 준다.
그 이유는 내부에 있는 빈공간과 외부를 구분하기 위해서 바꿔준다.
그렇게 외부를 바꾸고 나서, 1시간뒤 치즈의 변화를 표현해야하는데, 외부랑 접촉한 부분을 바꿔야 해서, 주변에 2가 하나라도 있을경우 2로 바꾸어 준다.
그렇게 1이 전부 사라질 때의 치즈 수를 저장하고, 그 때의 시간과 치즈의 크기를 출력해 준다.
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
private static class Point {
int x;
int y;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
private static int dx[] = { -1, 1, 0, 0 };
private static int dy[] = { 0, 0, -1, 1 };
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int arr[][] = new int[N][M];
boolean visit[][]=new boolean[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
arr[i][j] = sc.nextInt();
}
}
int result = 0;
LinkedList<Point> que = new LinkedList<Point>();
que.add(new Point(0, 0));
visit[0][0]=true;
int count=0;
while (true) {
while (!que.isEmpty()) {
Point temp = que.poll();
for (int k = 0; k < 4; k++) {
int x = temp.x + dx[k];
int y = temp.y + dy[k];
if (x >= 0 && x < N && y >= 0 && y < M &&!visit[x][y]&& (arr[x][y] == 0 || arr[x][y] >= 2)) {
arr[x][y] = 2;
que.add(new Point(x,y));
visit[x][y]=true;
}
}
if(que.isEmpty()) {
break;
}
}
result=0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] == 1) {
for (int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (x >= 0 && x < N && y >= 0 && y < M && arr[x][y] == 2) {
arr[i][j] = 3;
result++;
break;
}
}
}
}
}
int cnt=0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(arr[i][j]==1) {
cnt++;
}
visit[i][j]=false;
}
}
count++;
if(cnt==0) {
break;
}
que.add(new Point(0, 0));
visit[0][0]=true;
}
sc.close();
System.out.println(count);
System.out.println(result);
}
}
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 2667 단지번호붙이기 (0) | 2021.02.01 |
---|---|
[BAEKJOON 백준] 2644 촌수계산 (0) | 2021.01.31 |
[BAEKJOON 백준] 2635 수 이어가기 (0) | 2021.01.31 |
[BAEKJOON 백준] 2606 바이러스 (0) | 2021.01.24 |
[BAEKJOON 백준] 2605 줄 세우기 (0) | 2021.01.24 |