모노톤 스택에 대해서 알아봅니다.
오름, 내림 차순을 유지한 스택을 만듭니다.
단조로운 스택
아이디어
- 발상은 top에 있는 숫자와 새롭게 들어오는 숫자를 비교하고, 경우에 따라 pop 하며 진행합니다
- 중복없는 오름차순 인경우, 들어가려는 수가 top 보다 작거나 같은 경우 pop을 반복하면 구현 가능.
- 중복없는 내림차순 인경우, 들어가려는 수가 top 보다 크거나 같은 경우 pop을 반복하면 구현 가능
- https://www.acmicpc.net/problem/11003 이문제를 O(NlogN)이 아닌, O(N)으로 푸는 아이디어를 생각하다가 알고리즘 명칭을 정확히 알게 되었다.
- 이전에 무의식적으로 사용하고 있던 테크닉이긴 한다.
위치 인덱스도 같이 저장해보자.
stack에 넣는것을
{위치 인덱스, 숫자}
로 한다면?
1 |
|
- 다음과 같은 숫자가 들어간다고 해보자.
- 이중 N번 째 들어가는 숫자보다 왼쪽에 있으면서, 작은 첫번째 숫자를 찾는다고 해보자.
- N번쨰 숫자보다 왼쪽에 있는 작은 것을 구하니
오름차순
으로 유지해야한다.
[ {0,1} ]
- 첫번째 숫자는 비교할게 없으므로 그냥 들어간다.
[ {0,1}, {1,3} ]
, 아직 {1,3} 는 들어간게 아니다.- 3은 top
{0,1}
에서 숫자인 1 보다 크다. 그러므로 별 이상없이 push가 가능하다. - 그리고 1은 찾고 있는 정보인, 3보다
왼쪽에 있으면서 작은 첫번째 숫자를 찾는다고 해보자.
라는 조건에 만족한다. - 즉 3보다 왼쪽에 있으면서 작은 첫번째 숫자의 위치는, top의 인덱스인 0 이 된다.
- 3은 top
[ {0,1}, {1,3}, {2,2} ]
, 아직 {2,2} 는 들어간게 아니다.- 2가 들어갈 경우, top인 3 보다 작으므로 오름차순을 깨게 된다.
- top을 pop한다.
[ {0,1}, {2,2} ]
, 아직 {2,2} 는 들어간게 아니다.- 이제 2는 top인 1 보다 크므로, push가 가능하다.
- 그리고 찾고 있는 2보다
왼쪽에 있으면서, 작은 첫번째 숫자를 찾는다고 해보자.
라는 조건에 만족한다. - 즉 2보다 왼쪽에 있으면서 작은 첫번째 숫자의 위치는, top의 인덱스인 0 이 된다.
[ {0,1}, {2,2}, {3,5} ]
- 5는 2보다 크므로 push가 가능하다.
- 즉 5보다 왼쪽에 있으면서 작은 첫번째 숫자의 위치는, top의 인덱스인 2 가 된다.
여러가지 응용이 가능하다.
- 스택안에, 어떤 정보를 어떻게 보관 하느냐에 따라서 다양한 정보를 얻을 수 있다.
- 핵심은 알고리즘 이름처럼 스택을 단조롭게 만드는 것이다.
- 오름, 내림 차순으로 유지한다.
- 이때 오름, 내림 차순으로 유지하는데 쓰이는 정보외에 다른 정보도 담는다면 다양하게 활용할 수 있게 된다.
참고
- 류호석님 머릿속
- https://justicehui.github.io/medium-algorithm/2019/01/01/monotoneStack/
- 백준의 히스토그램, 오큰수 등등의 문제에서 사용해 풀 수 있다.