본문 바로가기
알고리즘, 문제해결/알고리즘 문제풀이

[백준 2573번] 빙산

by 카펀 2022. 1. 3.

난이도: 골드 IV

문제 링크: https://www.acmicpc.net/problem/2573

 

2573번: 빙산

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

www.acmicpc.net

 

이번 문제부터 문제화면 캡쳐는 생략하겠습니다.

 

오늘도 풀 만한 문제가 없나~ 하고 보다가 고른 탐색 겸 구현 문제입니다.

구현 문제라서 코드의 길이가 길어지고 잔실수를 조심해야 하지만...

 

제가 접근한 방법입니다.

시작에 앞서, 빙산이 두 개 이상인지 판별하는 함수, 빙산을 1년어치만큼 녹이는 함수를 작성합니다. 빙산이 두 개 이상인지 판별하는 함수의 경우, 빙산이 없는 경우는 따로 체크합니다.

입력을 받고, while문을 이용하여 다음을 반복합니다.

  1. 빙산이 2개 이상인 경우, 종료합니다.
  2. 그렇지 않은 경우, 빙산을 1년치 녹입니다.

반복문이 종료된 후, 빙산이 없는 경우가 존재했다면 빙산이 다 녹을 때까지 2개 이상으로 나누어지지 않았다는 뜻이 됩니다. 이 경우 0을 출력하고 종료합니다. 이외의 경우, 빙산이 나뉘기까지 걸린 시간 (년)을 출력합니다.

 

빙산이 두 개 이상인지 판단하는 함수는 다음과 같이 구현했습니다.

빙산이 하나 존재할 때마다 개수를 셉니다. 한 덩어리 빙산은 BFS를 통해 체크하는데, BFS가 실행된 횟수가 곧 빙산의 수가 됩니다.

 

빙산을 1년치만큼 녹이는 경우는 다음과 같습니다.

주어진 영역 (n, m)과 같은 크기의 배열을 만들고, 값을 0으로 초기화합니다. 모든 빙산에 대해, 상하좌우 중 바다의 수만큼을 배열에 기록합니다. 이후, 배열에 기록된 수만큼 빙산의 값을 내립니다. 이 때, 빙산의 값이 음수가 되는 경우에는 0으로 고정합니다.

 

 

기본적인 구현 부분에서 살짝 애를 먹고, Java로 코딩하면서 한번 더 헤맸습니다.

구현의 경우 1. 맨 처음부터 빙산이 두 개 이상으로 나뉜 경우, 2. 빙산이 끝까지 나뉘지 않는 경우 를 고려하지 못했습니다.

Java로 옮기며, C++처럼 별도의 area_input() 함수를 두지 않고 구현을 했는데, 이대로 하는 경우 NoSuchElement 에려가 떠서 하는 수 없이 입력을 main 함수로 옮겼습니다.

 

채점 결과

앞서 언급한 이유 때문에 시도 횟수가 좀 많았습니다 ㅎㅎ;

구현 문제는 잔실수가 없어야 해서 늘 고민이네요.

댓글