[문제 유형 분석]키순서 랜덤 배열에 앞사람 보기 찾기
문제 조건
N 명의 사람이 다른 키를 가지로 일렬로 배치 합니다.
키가 높은 사람은 앞사람이 본인 보다 작은 경우 내려 볼수 있습니다.
랜덤으로 배치된 사람이 내려다 볼수 있는 사람의 총합을 구하시요.
조건 : 내려다 보는 방향은 순서대로 (오른쪽-> 왼쪽) 한방향만 가능합니다.
예를 들어 아래 키의 순서로 N개의 배열이 제공될 때.
[0] index의 170
은 [1]150
은 내려다 볼수 있어서 1명을 내려다 볼수 있습니다.
[1] index의 150
은 [2]180
이 더 높으므로 내려다 볼수 없음.
[2] index의 180
은 [3]170
, [4]160
은 내려다 볼수 있어서 2명을 내려다 볼수 있습니다.
[3] index의 170
은 [4]160
은 내려다 볼수 있어서 1명을 내려다 볼수 있습니다.
[4] index의 160
은 [5]190
이 더 높으므로 내려다 볼수 없음.
[5] index의 190
은 마지막으로 내려다 볼 대상이 없음.
각 단계가 볼수 있는 총합은 4 입니다.
[ 170, 150 , 180, 170, 160, 190]
[ 1, 0, 2, 1, 0, 0] = 4
그림으로 그리면 높이 순서는 다음과 같다. (참고용)
170 ■■■■■■■ (1 개 앞이 보임)
150 ■■■■■ (0 개)
180 ■■■■■■■■ (2 개)
170 ■■■■■■■ (1 개)
160 ■■■■■■ (0 개)
190 ■■■■■■■■■ (0 개)
위 문제는 2중 for으로 풀면 로직은 간단히 해결 할 수 있습니다.
그러나, 시간 복잡도가 O(N^2)으로 N의 행렬이 높아질때 성능이 저하되는 문제를 가지고 있습니다.
O(N) 의 시간 복잡도로 해결하는 방법을 찾는 것을 묻는 문제 입니다.
stack 자료형을 이용 합니다. (입력 값보다 높은 항목만 유지하는 정책)
접근 방법
- [0] index의
170
stack에 입력| | | | | | | | | 170 | ---------
- [1] index의
150
stack에 입력 시 stack에 마지막 값(peek)170
값이 큰값으로, stack의 item을 모두 count ( 1개170
)| | | | | | | 150 | | 170 | ---------
- [2] index의
180
stack에 입력 시 stack에 마지막 값(peek)150
값이 작은 값은 모두 pop하고 큰값 존재할 경우에는 stack의 item을 모두 count ( 0개)| | | | | | | | | 180 | ---------
- [3] index의
170
stack에 입력 시 stack에 마지막 값(peek)180
값이 큰값으로, stack의 item을 모두 count ( 1개180
)| | | | | | | 170 | | 180 | ---------
- [4] index의
160
stack에 입력 시 stack에 마지막 값(peek)170
값이 큰값으로, stack의 item을 모두 count ( 2개170, 180
)| | | | | 160 | | 170 | | 180 | ---------
- [5] index의
190
stack에 입력 시 stack에 마지막 값(peek)160
값이 작은 값으로 모두 pop시킴, stack의 item을 모두 count ( 0개 )| | | | | | | | | 190 | ---------
약간의 아이디어가 필요한 문제 입니다.
특히, 본 문제의 변형 형태로 나오는 문제가 많으며 stack
자료형의 FILO
특성을 생각하면 될 것 같습니다.