Go로 코딩하는 아스파라거스: O(1) 공간에서 왕을 찾을 수 있을까?
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
Go 언어를 사용하는 개발자, 알고리즘 문제 해결에 관심 있는 사람들
핵심 요약
- Boyer–Moore 다수 투표 알고리즘을 사용하여 O(1) 공간 복잡도로 다수 후보를 찾을 수 있음
king
변수와count
변수 두 개만 사용하여 투표 배열을 순회하며 후보를 추적- 알고리즘은 모든 투표가 다수 후보가 아닌 경우에도 정확한 결과를 제공
섹션별 세부 요약
1. 문제 설명
- 왕 선출 문제에서 과일이 전체 투표의 다수를 차지하는 경우, O(1) 공간 복잡도로 왕을 찾을 수 있는가?
- 예시:
[1,2,2]
→2
,[3,2,3,4,3,4,3,3]
→3
2. 알고리즘 개요
- 두 변수 사용:
king
: 현재 후보count
: 현재 후보에 대한 신뢰도(투표 수)- 투표 배열을 순회하며:
count == 0
→vote
를 새로운 후보로 설정vote == king
→count
증가vote != king
→count
감소
3. 알고리즘의 작동 원리
- Boyer–Moore 다수 투표 알고리즘 사용
count
가 0이 될 때마다 새로운 후보를 설정- 투표가 다수 후보가 아닌 경우에도 알고리즘은 정확한 결과를 제공
4. 예제 코드
func findFruitKing(votes []int) int {
var king int
count := 0
for _, vote := range votes {
if count == 0 {
king = vote
count++
continue
}
if king == vote {
count++
} else {
count--
}
}
return king
}
5. 알고리즘의 이론적 근거
count
가 0이 되면 새로운 후보를 설정count
가 증가하면 현재 후보에 대한 신뢰도가 높아짐count
가 감소하면 현재 후보와 다른 후보가 존재함을 나타냄- 알고리즘은 모든 투표가 다수 후보가 아닌 경우에도 정확한 결과를 제공
결론
- Boyer–Moore 다수 투표 알고리즘은 O(1) 공간 복잡도로 다수 후보를 찾는 데 유용
king
과count
변수만 사용하여 투표 배열을 순회하며 후보를 추적 가능- 이 알고리즘은 모든 투표가 다수 후보가 아닌 경우에도 정확한 결과를 제공하며, 고객 중심의 투표 시스템에 활용 가능