반응형
Dominator #1에서는 map을 이용해서 풀었다.
Dominator #2에서는 정렬을 이용해서 풀었다.
이번에는 stack을 이용해서 풀어본다.
1. 아이디어
대표값이 가장 많이 등장하는 값이므로, 서로 다른 값들을 지우면, 결국 대표값만 남게 될 것이다.
stack을 이용하면, 서로 다른 값들을 간단하게 지울 수 있다.
예시)
| A[0] | A[1] | A[2] | A[3] | A[4] | A[5] | A[6] | A[7] |
| 3 | 4 | 3 | 2 | 3 | -1 | 3 | 3 |
stack으로 담으면 다음과 같이 된다.
stack에는 대표값 최종적으로 남게 된다.
| 3 | |||||||
| 3 | 3 | 3 | 3 | 3 | |||
| push | remove | push | remove | push | remove | push | push |
2. 문제풀이 전략
- stack이 비어 있으면, 값을 넣는다
- stack에 값이 있으면, 현재 값과 같은지 비교한다
- 같으면 현재 값을 stack에 push
- 다르면 stack 값 삭제
- stack에 최종 남아 있는 값을 대표값으로 설정
- 대표값이 배열에 몇 번 등장하는지 확인 (배열 전체탐색)
3. 코드 (C++)
#include <stack>
int solution(vector<int> &A) {
if(A.empty()) return -1;
//stack을 이용한 서로 다른 값 삭제
stack<int> candidate = {};
for(size_t i = 0; i < A.size(); i++)
{
if(candidate.empty())
{
candidate.push(A[i]);
}
else
{
if(A[i] != candidate.top())
{
candidate.pop();
}
else
{
candidate.push(A[i]);
}
}
}
int dominator = candidate.top(); //대표값
//대표값 등장 횟수 세기(전체탐색)
int cnt = 0;
for(size_t i = 0; i < A.size(); i++)
{
if(A[i] == dominator) cnt++;
}
//대표값이 등장 횟수 조건을 충족하는지 확인
if(cnt <= A.size() / 2) return -1;
auto it = find(A.begin(), A.end(), dominator);
int idx = distance(A.begin(), it);
return idx;
}
4. 결과

반응형
'Algorithm Problem > Codility' 카테고리의 다른 글
| Lesson 8. Leader - EquiLeader #1 (0) | 2024.12.13 |
|---|---|
| Lesson 8. Leader - Dominator #3-2 (코드 개선) (1) | 2024.12.13 |
| Lesson 8. Leader - Dominator #2 (0) | 2024.12.13 |
| Lesson 8. Leader - Dominator #1 (0) | 2024.12.12 |
| Lesson 7. Stacks and Queues - StoneWall (0) | 2024.12.08 |