본문 바로가기
[Developer]/ProblemSolving

[CodeSignal] reverseInParentheses

by 해피빈이 2019. 8. 16.

요즘 다시 문제풀이 사이트에 흥미가 생겨 문제를 풀기 시작하였다.

한참 풀고 있노라니, 이것을 풀었던 기록을 남기는 것이 좋을 것 같아서 이것에 대한 기록을 시작한다.

 

(다음 포스팅부터는 잡설을 줄이고 본문에 집중!)

 

앞으로의 포맷을 정하진 않았지만 일단 완료 기록을 시작

CodeSignal은 https://codesignal.com 사이트에 대한 문제풀이다.

그 중 Arcade 메뉴에서 Intro에 대한 부분이다.

 

푸는 언어는 Kotlin으로 진행하였다. 언어를 익히는 것에 대한 방법은 다양하겠지만, 이런 문제풀이 사이트를 통해 자꾸 쓰다보면 느는 것 같다. 언어를 익혀도 딱히 쓸곳이 없어서 쓰지 않다보면, 지식적으로는 늘어날 수 있으나, 익숙하지가 않다. 그래서 자꾸 인터넷을 통해 참고자료를 반드시 참고하게 되는데, 그것을 방지하려면 몸으로 체득하는 수 밖에 없는 것 같다. 자바와 같은 익숙함을 갖기 위해 Kotlin으로 접근하였다.

 

문제

Write a function that reverses characters in (possibly nested) parentheses in the input string.

Input strings will always be well-formed with matching ()s.

문자열이 주어지고, 그 주어진 문자열에서 브라켓으로 감싼 문자열을 뒤집으라는 문제이다.

주어지는 문자열의 브라켓은 형식에 문제없이 잘 입력된다는 전제조건이 있다.

또한, 중첩으로 브라켓이 존재할 수 있으며, 그 경우 내부에 있는 브라켓을 뒤집으면서 풀고, 그 바깥의 것을 그 다음 다시 뒤집어야 한다. 이 때, 순서에 의해, 내부에서 뒤집은 것은 다시 뒤집히게 된다.

 

주어진 테스트

1

Input: inputString: "(bar)"

Expected Output: "rab"

2

Input: inputString: "foo(bar)baz"

Expected Output: "foorabbaz"

3

Input: inputString: "foo(bar)baz(blim)"

Expected Output: "foorabbazmilb"

4

Input: inputString: "foo(bar(baz))blim"

Expected Output: "foobazrabblim"

5

Input: inputString: ""

Expected Output: Empty

6

Input: inputString: "()"

Expected Output: Empty

7  Input: inputString: "(abc)d(efg)"

Expected Output: "cbadgfe"

 

나의 해답

fun reverseInParentheses(inputString: String): String {
    var bracketOpened = false // bracket 열린 것 체크
    var processed: Boolean // reverse 작업 처리를 한 적이 있는지 여부 체크
    var processStr: String // 작업 대상 문자열
    var resultStr = inputString // 결과 문자열
    var bracketCnt = 0 // bracket 열린 이후 나타난 문자열 수 count

    do {
        processStr = resultStr; resultStr = "" // 작업용 문자열에 복사해 넣고, 결과 문자열은 초기화한다
        processed = false
        for ((idx, ch) in processStr.withIndex()) {
            if (ch == '(') {
                if (bracketOpened) {
                    resultStr = processStr.substring(0, idx) // 만약 새롭게 opened bracket 발견시 기존 bracket은 모두 그대로 둔다
                }

                bracketOpened = true
                bracketCnt = 0
                continue
            }

            if ((ch == ')') and bracketOpened) {
                processed = true
                var reverseTargetStr = processStr.substring(idx - bracketCnt, idx)
                reverseTargetStr = reverseTargetStr.reversed()
                resultStr += reverseTargetStr
                bracketOpened = false
                continue
            }
            if(bracketOpened) {
                bracketCnt++
            } else {
                resultStr += ch
            }
        }
    } while(processed)

    return resultStr
}

 

모든 문제에 대해 이와 같이 기록할 수는 없겠지만, 가능하면 이렇게 남기는것이 나름 리마인드도 되고, 나의 풀이에 대한 공유도 될 것 같아서 여건이 된다면 남겨보려 한다.

 

어디까지나 참고용 자료이며, 더 좋은 해법은 당연히 더 많이 존재할 것이기 때문에, 이러한 방법도 있다는 것을 참고하는 용도로 사용하면 좋을 것 같다.

반응형

'[Developer] > ProblemSolving' 카테고리의 다른 글

[CodeSignal] Add Border  (0) 2019.08.17
[CodeSignal] alternatingSums  (0) 2019.08.17

댓글