알고리즘 연습

[백준_BOJ] 2573. 빙산 _ JAVA

코딩하는 너구리 2019. 12. 31. 00:38
반응형

 

문제

 

 

 

 

 

 

 

 

 

 

 

풀이

 

 

빙산이 두 덩어리 이상으로 나뉘는 데에 걸리는 시간을 구하는 문제입니다.

 

 

 

 

이 문제를 풀이할 때 사용한 주요 로직은 위와 같습니다.

 

while문을 이용해 빙산의 조각이 두 덩어리 이상으로 나뉘거나, 모두 녹아 사라질 때까지 반복합니다.

 

1. melting() : 빙산이 사라질 만큼을 계산해주어야 합니다. 계산을 위해 사용할 배열 copy를 만들어 준 뒤,

                    상, 하, 좌, 우에 위치한 0을 카운트하여 copy 배열에 저장해주었습니다.

 

 

2. calc() : 사라질 빙산이 계산되었다면, copy 배열의 정보를 이용해 빙산을 없애주었습니다.

             빙산의 양보다 사라질 양이 많다면 0으로 저장하도록 해주었습니다.

 

 

3. checkLand() : 빙산의 덩어리 수를 계산하는 함수입니다.

                 BFS를 이용하여 현재 맵에 빙산이 몇 덩어리가 존재하는지를 계산하여 cntLand 변수에 저장해주었습니다.

 

 

 

 

로직이 어려운 문제는 아닌 것 같습니다.

 

다만 사라질 빙산의 양을 copy 배열을 만들어 모두 계산한 뒤에 적용시켜야 하고

 

빙산이 모두 녹을 때까지 두 덩어리 이상으로 나뉘지 않는다면 0을 출력해주는 조건에만 주의하면 될 것 같습니다.

 

 

 

 

 

 

 

코드

 

 

 

기본 로직은 위와 같습니다.

 

빙산이 0개(존재하지 않는다)라면 바로 year를 출력하고,

빙산이 남아 있다면, 빙하를 녹이는 작업을 한 뒤에 남은 빙산의 덩어리를 체크합니다.

while문을 이용해 빙산이 모두 사라지거나, 두 덩어리 이상으로 나뉠 때의 year 값을 찾아 출력해주었습니다.

 

 

 

 

 

 

 

 

 

출처

 

 

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

 

2573번: 빙산

첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을 나타내는 M개의 정수가 한 개의 빈 칸을 사이에 두고 주어진다. 각 칸에 들어가는 값은 0 이상 10 이하이다. 배열에서 빙산이 차지하는 칸의 개수, 즉, 1 이상의 정수가 들어가는 칸의 개수는 10,000 개 이하이다. 배열의 첫 번째 행과 열, 마지

www.acmicpc.net

 

 

반응형