티스토리 뷰
728x90
문제
https://www.acmicpc.net/problem/2636
풀이 및 소스코드
이처럼 풀되,
한 면이라도 바깥공기가 닿으면 치즈는 녹는다.
또, 다 녹기 한시간 전의 치즈 갯수를 카운트 해줘야한다.
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 Main {
static int[] m;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] map = new int[n][m];
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());
}
}
int res = 0;
int last_c = 0;
while(true) {
Queue<Integer[]> q = new LinkedList<>();
//바깥공기를 표시해주기 위해서 bfs 진행
//(0,0)은 무조건 바깥공기
q.add(new Integer[]{0,0});
map[0][0] = -1;
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, 1, -1};
while(!q.isEmpty()) {
Integer[] nxy = q.poll();
int x = nxy[0];
int y = nxy[1];
for(int i=0;i<4;i++) {
int nowx = x+dx[i];
int nowy = y+dy[i];
if(nowx<0||nowy<0||nowx>=n||nowy>=m) continue;
if(map[nowx][nowy]==0) {
map[nowx][nowy] = -1;
q.add(new Integer[] {nowx,nowy});
}
}
}
// for(int i=0;i<n;i++) {
// for(int j=0;j<m;j++) {
// System.out.print(map[i][j]+" ");
// }
// System.out.println();
// }
Queue<Integer[]> cq = new LinkedList<>();
//녹일 치즈들이 들어갈 q. 마지막에 한번에 없애주기 위함
for(int x=0;x<n;x++) {
for(int y=0;y<m;y++) {
if(map[x][y]!=1) continue;
boolean c = false;
//공기와 접촉했는지 체크하는 변수
for(int i=0;i<4;i++) {
int nowx = x+dx[i];
int nowy = y+dy[i];
if(map[nowx][nowy]==-1) {
c = true;
break;
}
}
if(c) {
cq.add(new Integer[] {x,y});
}
}
}
if(cq.isEmpty()) {
//녹일 치즈가 더이상 존재하지 않으면 break
break;
}
int cnt = 0;
while(!cq.isEmpty()) {
Integer[] poll = cq.poll();
map[poll[0]][poll[1]] = 0;
//치즈 녹이기
cnt++;
}
last_c = cnt;
res++;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(map[i][j]==-1) {
map[i][j]=0;
}
}
}
//초기화
}
System.out.println(res);
System.out.println(last_c);
}
}
반응형
'Coding - Algo > Java' 카테고리의 다른 글
[백준] 1600번:말이 되고픈 원숭이 (Java 자바) (0) | 2021.09.16 |
---|---|
[SWEA] 3124:최소 스패닝 트리 (Java 자바) (0) | 2021.09.16 |
[백준] 1149번:RGB거리 (Java 자바) (0) | 2021.09.14 |
[프로그래머스] 행렬 테두리 회전하기 (Java 자바) (0) | 2021.09.14 |
[백준] 2638번:치즈 (Java 자바) (0) | 2021.09.14 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- swea 1240
- swea 타일링 자바
- swea 1240 자바
- 프로그래머스
- 프로그래머스 더 맵게
- SSAFY
- 백준 dp 문제
- poker swea
- 타일링 자바
- 파이썬
- 1240 자바
- 1699 자바
- 메뉴리뉴얼 풀이
- 더 맵게
- 삼성청년SW아카데미
- 3996 자바
- swea 4070 타일링
- ubuntu
- SWEA
- swea 타일링
- 프로그래머스 파이썬
- yoloV3
- 백준 풀이
- 백준 17144
- 프로그래머스 자바
- 파이썬 풀이
- 백준파이썬
- 우분투
- union-find
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함