Problem From.
https://leetcode.com/problems/dota2-senate/
오늘 문제는 R과 D 로 이루어진 string 이 주어질때, 각각의 R 과 D는 그 다음에 나오는 자신과 같지 않은 낱말을 삭제시킬 수 있고, 그 과정을 처음부터 끝까지 계속 반복하다가 마지막에 R 만 남아있으면 Radiant, D 만 남아있으면 Dire 를 반환하는 문제였다.
이 문제는 greedy 알고리즘을 통해서 풀 수 있었는데, R 은 무조건 자기 다음에 나오는 D 를 삭제한다고 가정하고, 지금까지 나온 R 의 개수와 D 의 개수, 그리고 지워졌는지 여부를 볼 수 있는 vote Boolean 배열을 선언해두고 배열을 탐색한다.
지금까지 나온 R 의 개수가 더 많다면 vote 배열을 true 로 바꿔주고 R count 를 올려주고 아니면 그냥 R count 를 올려주는 식으로 D 에도 똑같이 적용해준다.
그렇게 계속 돌면 Rcount 나 Dcount 가 결국 string 의 길이와 똑같아지는 구간이 오는데, 이때 Rcount 가 string 의 길이와 같다면 Radiant 아니라면 Dire 를 반환해주면 되었다.
class Solution {
fun predictPartyVictory(senate: String): String {
val vote = BooleanArray(senate.length) { false }
var rCount = 0
var dCount = 0
while(rCount < senate.length && dCount < senate.length) {
for(i in 0 until senate.length) {
if(vote[i]) continue
if(rCount == senate.length || dCount == senate.length) break
if(senate[i] == 'R') {
if(rCount < dCount) vote[i] = true
rCount += 1
}else {
if(dCount < rCount) vote[i] = true
dCount += 1
}
}
}
return if(rCount == senate.length) "Radiant" else "Dire"
}
}