본문 바로가기
Algorithm

[프로그래머스] 괄호 회전하기

by giop15 2022. 1. 7.
반응형

https://programmers.co.kr/learn/courses/30/lessons/76502

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항

  • s의 길이는 1 이상 1,000 이하입니다.

입출력 예

s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

입출력 예 설명

입출력 예 #1

  • 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?

0 "[](){}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}[]()" O
5 "}[](){" X
  • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?

0 "}]()[{" X
1 "]()[{}" X
2 "()[{}]" O
3 ")[{}](" X
4 "[{}]()" O
5 "{}]()[" X
  • 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

입출력 예 #3

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

입출력 예 #4

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

※ 공지 - 2021년 4월 16일 테스트케이스가 추가되었습니다.

 

문제풀이

1. 입력받은 문자열을 새로 가공할 문자열(s), 결과 반환 값(answer)을 선언한다.

2. s를 돌면서 왼쪽으로 회전시키고, 올바른 문자열인지 확인하는 correctCheck함수를 호출하여 받아온 리턴 값을 answer에 더한다.

3. correctCheck함수에서는 문자열 s를 배열화 시킨 sArr, 괄호를 임시 저장하는 temp, temp에 값이 들어갔었는지 check하는 isChanged 변수를 선언한다.

   반복문을 통해 각 문자에 대해서 조건에 맞게 설정을 해준다. 각 괄호의 시작 부분이면, isChange를 true로 값을 만들어주고 temp에 추가한다.

   그리고 각 괄호의 끝 부분을 만나면, 일단 temp의 길이가 0인지 아닌지 판별하고 0이면 break로 반복문을 빠져나가게 한다. temp의 길이가 0이 아니면 isChanged를 true로 만들고 이전 문자열이 각 괄호의 시작부분이면 각 괄호의 시작부분 temp에서 삭제한다.

  반복문을 빠져나오면 올바른 문자열을 판별하는데, temp의 길이가 0이고 isChange가 true이면 올바른 문자열로 판별하고 1을 반환한다.

  temp의 길이가 0이 아니고, temp의 길이가 0이여도 isChange가 false이면 올바른 문자열로 판별하지 않아 0을 반환한다.

import Foundation

func solution(_ s:String) -> Int {
    
    var s = s
    var answer = 0
    
    for i in 0..<s.count {
        if i != 0 {
            let item = s.removeFirst()
            s.append(item)
        }
        
        answer += correctCheck(s)
    }
    
    return answer
}

func correctCheck(_ s: String) -> Int {
    let sArr = s.map { String($0) }
    var temp = [String]()
    var isChanged = false
    
    for i in sArr {
        switch i {
        case "[":
            isChanged = true
            temp.append(i)
        case "]":
            if  temp.count == 0 {
                break
            } else {
                isChanged = true
            }
            
            if temp.last!.elementsEqual("[") {
                temp.removeLast()
            }
        case "(":
            isChanged = true
            temp.append(i)
        case ")":
            if  temp.count == 0 {
                break
            } else {
                isChanged = true
            }
            
            if temp.last!.elementsEqual("(") {
                temp.removeLast()
            }
        case "{":
            isChanged = true
            temp.append(i)
        case "}":
            
            if  temp.count == 0 {
                break
            } else {
                isChanged = true
            }
            
            if temp.last!.elementsEqual("{") {
                temp.removeLast()
            }
        default:
            break
        }
    }
    
    if temp.count != 0 {
        return 0
    } else {
        if isChanged {
            return 1
        } else {
            return 0
        }
    }
}
반응형