Daily LeetCode Challenge - 649. Dota2 Senate

Min Young Kim·2023년 5월 4일
0

algorithm

목록 보기
138/198

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"
        
    }
}
profile
길을 찾는 개발자

0개의 댓글