본문 바로가기
2023년 이전/Codility

Lesson7 - Brackets

by JeongUPark 2019. 12. 19.
반응형

자세한 문제는 여기서 확인하시면 됩니다.

 

간략하게 설명하면 String이 "{[()()]}"이렇게 짝이 맞으면 1, 짝이 맞지 않다면 0을 반환하도록 합니다. 비어 있을 경우에도 1을 반환합니다. 들어갈수 있는 문자는 "{" "[" "(" ")" "]" "}" 입니다.

 

우선 문제의 힌트는 Lesson7이 stack과 queue에 관련된 문제라는 것에서 둘중 하나를 사용하면 된다는 것을 유추할 수 있습니다. 

 

그렇게 생각한 풀이 알고리즘은

1.String이 비어있으면 1을 반환

2.String의 길이가 짝수가 아닐 경우 0을 반환 (짝수가 아니라면 괄호의 짝이 맞지 않기 때문입니다.)

3.String을 처음부터 확인하면 "{" "[" "("들 하나라면 stack에 쌓고  ")" "]" "}"라면 스텍에서 문자를 꺼네서 짝을 확인하고, 짝이 맞지 않으면 0을 반환 합니다.

4.String의 짝을 다 확인하고 stack에 문자가 남아있다면 0을 반환하도록 합니다.(짝을 다 확인했는데도 문자가 남아있다면 짝수로 { [ ( 이 문자들이 남아있다는 의미기 떄문입니다.)

 

위의 알고리즘에 맞는 code를 만들어 보면

fun solution(S: String): Int {
       if(S.isEmpty()) return 1
    if(S.length%2 != 0)  return 0

    val stack = mutableListOf<String>()
    for(i in S.indices ){
        val c_string = S[i].toString()
        if(c_string == "{" || c_string == "[" ||c_string== "("){
            stack.push(c_string)
        }else {
            if(stack.isEmpty()) return 0
            val s_pop = stack.pop()
            if(s_pop == "{"){
                if(c_string != "}")  return 0
            }else if(s_pop == "["){
                if(c_string != "]") return 0
            }else if(s_pop =="("){
                if(c_string != ")")  return 0
            }
        }
    }
    if(!stack.isEmpty()) return 0
    return 1
}
fun MutableList<String>.push(str:String){
    this.add(str)
}
fun MutableList<String>.pop() : String{
    val result = this.last()
    this.removeAt(this.size-1)
    return result
}

이렇게 됩니다.

 

사실 java.util에 stack을 제공하지만 codility에서는 java.util에 있는 stack을 쓸수 없기 때문에 직접 stack을 만들서 사용하였습니다.

반응형

'2023년 이전 > Codility' 카테고리의 다른 글

Lesson 9 - MaxProfit  (0) 2020.01.06
Lesson8 - Dominator  (0) 2020.01.06
Lesson6 - Triangle  (0) 2019.12.16
Lesson 6 - Distinct  (0) 2019.12.14
Lesson6 - MaxProductOfThree  (0) 2019.12.13