PS

백준 8982. 수족관 1

tose33 2022. 7. 19. 13:47

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

 

8982번: 수족관 1

입력의 첫 줄은 수족관의 경계에 있는 꼭짓점의 개수 N(1 ≤ N ≤ 5,000)이 주어진다. N은 짝수이다. 수족관의 경계는 항상 꼭짓점 (0, 0)부터 시작한다. 그리고 마지막 꼭짓점은 (A, 0)의 형태로 끝난

www.acmicpc.net

 

문제 해결 방법을 떠올리기 까지 좀 걸린 문제였다. 

처음에는 주어지는 꼭짓점들로 어떻게 배열을 구성할지 고민했다.

하지만 이 문제는 그렇게 하지 않고, 주어지는 꼭지점들로 각 열들의 깊이만 구성하면 된다.

 

예를들어 주어지는 input이 다음과 같다면 

14
0 0  
0 5
1 5
1 3
2 3
2 4
3 4
3 2
5 2
5 4
6 4
6 3
8 3
8 0
2
1 3 2 3
3 2 5 2

첫째 줄에 꼭지점의 수 14가 주어진다.

그리고 두번째 줄은 (0,0)이고 세번째 줄부터 보면 되는데,

세번째 줄 부터는 두 줄 씩 짝지어 보면 된다.

 

예를들어 3번 줄은 (0,5)고 4번 줄은 (1,5)인데 이는 첫 번째 열의 깊이가 5라는 의미다.

또 다른 예로는 9번째줄은 (3,2)고, 10번째 줄은 (5,2)인데 이는 4,5번 열의 깊이가 2라는 의미다.

 

이렇게 열 별로 깊이를 depth[]에 저장하면, 각 열의 깊이를 뜻하는 depth[]는 다음과 같아진다.

5 3 4 2 2 4 3 3

 

그리고 구멍에 관한 정보는 다음과 같이 주어지는데 

2
1 3 2 3
3 2 5 2

첫 번째 구멍은 (행,열)로 따지면 (3,1)과 (3,2) 수평선분의 가운데에 있다는 의미인데, 어처피 수평끼리는 깊이가 같기 때문에 다 필요 없고 첫 번째로 주어지는 값 1 만이 중요하다. 

1은 곧 우리가 구한 depth[]의 depth[1] 위치에 구멍이 존재한다는 의미다.

 

 

이제 구멍을 하나씩 열면서 물을 빼보면 된다.

depth[]에서 구멍의 위치 기준 왼쪽, 오른쪽으로 이동하면서 구멍의 깊이 보다 현재 깊이가 깊으면 (현재 구멍의 깊이 - 구멍의 깊이)가 남은 물의 높이가 된다.  이때 여러 구멍들을 탐색할것이기 때문에 해당 열의 물의 높이와, 새로 구한 물의 높이 중 작은 값을 택해야 한다. 

 

현재 깊이가 구멍의 깊이 보다 같거나 작다면, 해당 위치 이후로는 물이 빠지지 않는 것을 의미한다. 

따라서 해당 열의 물의 높이는 0이 되고, 그 이후로는 구멍의 깊이가 아닌 현재 위치의 깊이와 비교해야 한다.