leetcode - push dominoes (kotlin)

silver·2021년 7월 24일
0

level - medium

[문제 내용]
주어진 도미노 배열에는 왼쪽(L)으로 넘어갈지 오른쪽(R)으로 넘어갈지 표시가 되어 있다.
‘.’으로 표시된것은 아직 넘어가지 않은 도미노로 앞 도미노에서 ‘L’이 나올경우 ‘.’은 ‘L’방향으로 넘어진다.
‘R’과 ’L’사이에 ‘.’ 이 존재한다면 서로 반반 씩 왼쪽과 오른쪽으로 넘어진다.
도미노가 각각 어느방향으로 넘어갈지 계산한 배열을 반환하면 된다.

[example 1]

Input: dominoes = "RR.L"
Output: "RR.L"
Explanation: The first domino expends no additional force on the second domino.

[example 2]

Input: dominoes = ".L.R...LR..L.."
Output: "LL.RR.LLRRLL.."

[해결 방법]
R과 L사이에 있을 도미노들을 판별하기 위해
R로 넘어갈 도미노를 rightIndex 배열에 저장하고,
L로 넘어갈 도미노를 leftIndex 배열에 저장한다.

먼저 맨처음은 L과 R 어떤것을 만나든 왼쪽에 위치한 것이므로
LeftIndex에 넣어서 관리한다.
그러고 L을 만나면 leftIndex에 들어있는 값을 꺼내 해당 위치의 문자열을 L로 설정하고
R을 만나면 해당 도미노는 넘어지지 않으므로 leftIndex의 값을 비워준다.

그다음 방금 만난 값이 L인지 R인지 판별할 수 있는 변수를 설정해
각각 L이면 leftIndex에 값을 설정하고 R이면 rightIndex에 값을 설정한다.
그러고 다음에 만나는 값이 L이면 leftIndex 값을 넣어주고 R이면 rightIndex값을 넣어준다.

여기서 R을 만나고 다음 L을 만나는 경우에 대해서는 반반씩 넣어주면 된다.
아래 코드가 위의 내용을 구현한 것이다.


class Solution {
    fun pushDominoes(dominoes: String): String {
        val leftIndex = mutableListOf<Int>()
        val rightIndex = mutableListOf<Int>()
        var isLeft = true
        val dominoBuilder = StringBuilder(dominoes)
        for(i in dominoes.indices) {
            if(dominoes[i] == '.') {
                if(isLeft) {
                    leftIndex.add(i)
                } else {
                    rightIndex.add(i)
                }
                continue
            }

            if(dominoes[i] == 'L') {
                if(isLeft) {
                    for (index in leftIndex) {
                        dominoBuilder[index] = 'L'
                    }

                    leftIndex.clear()
                } else {
                    isLeft = true
                    val num = rightIndex.size/2
                    for(i in 0 until num) {
                        dominoBuilder[rightIndex[i]] = 'R'
                        dominoBuilder[rightIndex[rightIndex.size-1-i]] = 'L'
                    }

                    rightIndex.clear()
                }
            } else {
                if(!isLeft) {
                    for(index in rightIndex) {
                        dominoBuilder[index] = 'R'
                    }
                    rightIndex.clear()
                } else {
                    isLeft = false
                    leftIndex.clear()
                }
            }
        }

        if(!isLeft) {
            for(index in rightIndex) {
                dominoBuilder[index] = 'R'
            }
        }

        return dominoBuilder.toString()
    }
}

0개의 댓글