본문 바로가기
프로그래머스/Python

[프로그래머스] 괄호 회전하기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 7. 14.
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

  1. 빠른 연산에 용이한 deque 자료구조를 사용하기 위해 deque 모듈을 불러온다. from collections import deque
  2. 괄호를 회전한 결과를 저장할 deque을 생성한다. queue = deque()
  3. 초기 괄호의 상태를 deque 자료구조로 추가한다. queue.append(deque(s))
  4. 다음부터 괄호 길이 전까지 for _ in range(1, len(s))
  5. 문자열을 deque 자료구조로 저장한다. s = deque(s)
  6. 문자열에서 가장 앞 괄호를 제거하고 제거한 괄호를 맨 뒤에 추가한다. s.append(s.popleft())
  7. 괄호를 회전한 결과를 추가한다. queue.append(s)
  8. 괄호를 회전한 결과를 모두 저장했으면 저장한 결과를 하나씩 추출하여 올바른 괄호인지 확인한다. for i in queue
  9. 올바른 괄호를 판별하기 위해 사용할 deque을 생성한다. stack = deque()
  10. 올바른 괄호인지 나타낼 변수를 생성하고 초기화한다. state = True
  11. 괄호를 하나씩 추출하여 for j in i
  12. 만약 여는 괄호이면 if (j == '(' or j == '{' or j == '[')
  13. stack에 추가한다. stack.append(j)
  14. 반면에 닫는 괄호일 경우 else
  15. stack이 공백이 아니면 if (len(stack) > 0)
  16. stack에서 가장 마지막 원소를 삭제하고 삭제한 값이 닫는 괄호와 동일한 종류의 여는 괄호이면 if (j == ')' and stack.pop() == '(') or (j == '}' and stack.pop() == '{') or (j == ']' and stack.pop() == '[')
  17. 아직까진 올바른 괄호이다. state = True
  18. 동일한 여는 괄호가 아니면 else
  19. 올바른 괄호가 아니므로 틀림을 나타내고 종료한다. state = False  break
  20. 반면에 stack이 공백이면 else
  21. 올바른 괄호가 아니므로 틀림을 나타내고 종료한다. state = False  break
  22. 괄호 판별이 끝나고, 올바른 괄호이며 stack이 공백으로 끝나면 if (state and len(stack) == 0)
  23. 올바른 괄호 횟수에 1을 더한다. answer += 1
반응형

3. 소스코드

from collections import deque

def solution(s):
    answer = 0
    
    queue = deque()
    queue.append(deque(s))
    for _ in range(1, len(s)):
        s = deque(s)
        s.append(s.popleft())
        queue.append(s)
        
    for i in queue:
        stack = deque()
        state = True
        for j in i:
            if (j == '(' or j == '{' or j == '['):
                stack.append(j)
            else:
                if (len(stack) > 0):
                    if (j == ')' and stack.pop() == '(') or (j == '}' and stack.pop() == '{') or (j == ']' and stack.pop() == '['):
                        state = True
                    else:
                        state = False
                        break
                else:
                    state = False
                    break
        
        if (state and len(stack) == 0):
            answer += 1

    return answer
728x90
반응형