ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeSignal] reverseInParentheses
    [Developer]/ProblemSolving 2019.08.16 23:37

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

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

     

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

     

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

    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
    [CodeSignal] reverseInParentheses  (0) 2019.08.16

    댓글 0

Designed by Tistory.