요즘 다시 문제풀이 사이트에 흥미가 생겨 문제를 풀기 시작하였다.
한참 풀고 있노라니, 이것을 풀었던 기록을 남기는 것이 좋을 것 같아서 이것에 대한 기록을 시작한다.
(다음 포스팅부터는 잡설을 줄이고 본문에 집중!)
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 |
댓글