본문 바로가기
공부/Algorithms w.Java

백준 2573; Java

by thegreatjy 2022. 1. 13.
728x90

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

 

2573번: 빙산

첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을

www.acmicpc.net

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

public class Main {
	static int N, M;
	static int[][] ice;
	static boolean[][] visited;
	static int[][] decrease;
	//사방위 
	static int[] row= {-1, 0, 1, 0};
	static int[] col= {0, 1, 0, -1};
	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine());
		N=Integer.parseInt(st.nextToken());
		M=Integer.parseInt(st.nextToken());
		
		ice=new int[N][M];//얼음 높이 
		decrease=new int[N][M];//decrease[i][j]==(i,j)주변 0의 개수 
		visited=new boolean[N][M];
		
		for(int i=0;i<N;i++) {
			st=new StringTokenizer(br.readLine());
			for(int j=0;j<M;j++) {
				ice[i][j]=Integer.parseInt(st.nextToken());
			}
		}
		
		int mass=0;//덩어리 개수 
		int year=0;
		while(true) {
			//1년의 decrease 구해줌 
			for(int i=0;i<N;i++) {
				for(int j=0;j<M;j++) {
					if(ice[i][j]!=0 && !visited[i][j]) {
						func(i, j);
						mass++;
					}
				}
			}
			
			if(mass>=2) {
				//year++;
				break;
			}
			if(mass==0) {
				year=0;
				break;
			}
			
            //얼음 높이 갱신 
			//방문, 주변 0의 개수(decrease) 초기화
			for(int i=0;i<N;i++) {
				for(int j=0;j<M;j++) {
					ice[i][j]=ice[i][j]-decrease[i][j];
					if(ice[i][j]<0)	ice[i][j]=0;
					visited[i][j]=false;
					decrease[i][j]=0;
				}
			}	
			year++;
			mass=0;
		}
		System.out.println(year);
	}
	
	//한 덩어리 
	public static void func(int r, int c) {
		int nr, nc, qr, qc;
		Queue<node> q=new LinkedList<>();
		q.offer(new node(r, c));
		visited[r][c]=true;
		node nd;
		while(!q.isEmpty()) {
			nd=q.poll();
			qr=nd.x; 
			qc=nd.y;

			for(int a=0;a<4;a++) {
				nr=qr+row[a];
				nc=qc+col[a];
				if(nr>=0&&nr<N&&nc>=0&&nc<M) {
					if(ice[nr][nc]==0) {
						decrease[qr][qc]++;
					}
					if(ice[nr][nc]!=0 && !visited[nr][nc]) {
						q.offer(new node(nr, nc));
						visited[nr][nc]=true;
					}
				}
			}
		}
	}
}

class node {
int x;
int y;

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

 

풀었다! 내가 이김v. 이 빙산아! 우하하

 

1. year 계산 어려웠음.

2. func 함수 안에서 방문을 어디 위치에서 해줘야 할지 헤맸음 <<메모리 오류 떴음 ㅜㅜ 

큐에 넣어주고 방문 표시를 꼭 해줘야지 메모리 오류가 나지 않는다.

3. 한 해가 지나고 visited, decrease 배열을 초기화해줄 때, new int[][] 혹은 new boolean[][]으로 했을 때 미친 메모리 크기를 확인할 수 있었다. 깜짝 놀랐네..

내용 3 참고

 

728x90

'공부 > Algorithms w.Java' 카테고리의 다른 글

백준 7576; Java  (0) 2022.01.16
백준 2206; Java  (0) 2022.01.15
프로그래머스 등굣길; Java  (0) 2022.01.11
백준 11967; Java  (1) 2022.01.11
백준 1987; java  (0) 2021.12.28