본문 바로가기
Algorithm/SWEA

[SW Expert Academy] 1218번 괄호 짝짓기 [파이썬 S/W 문제해결 기본]

by eoieiie 2024. 4. 7.

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제


4 종류의 괄호문자들 '()', '[]', '{}', '<>' 로 이루어진 문자열이 주어진다.
이 문자열에 사용된 괄호들의 짝이 모두 맞는지 판별하는 프로그램을 작성한다.
예를 들어 아래와 같은 문자열은 유효하다고 판단할 수 있다.


아래와 같은 문자열은 유효하지 않은 문자열이다. 붉은색으로 표시된 괄호의 짝을 찾을 수 없기 때문이다.


아래 문자열은 열고 닫는 괄호의 개수는 유효하나 짝이 맞지 않는 괄호가 사용 되었기 때문에 유효하지 않다.

 

입력


각 테스트 케이스의 첫 번째 줄에는 테스트케이스의 길이가 주어지며, 바로 다음 줄에 테스트 케이스가 주어진다.
총 10개의 테스트케이스가 주어진다.

 

정답코드


pare = {">": "<", ")": "(", "}": "{", "]": "["}

num_test_cases = 10

for tc in range(1, num_test_cases + 1):
    data = input()

    stack = []
    iscorrect = True

    for now in data:
        if now in pare.values():
            stack.append(now)
        elif stack and stack[-1] == pare[now]:
            stack.pop()
        else:
            iscorrect = False
            break

    if not stack and iscorrect:
        print('#%d %d' % (tc, 1))
    else:
        print('#%d %d' % (tc, 0))

풀이


    data = input()
    stack = [] 
    iscorrect = True

 

  • 우선 판별할 괄호들을 입력받는다. 
  • stack으로 입력을 저장할 배열을 선언하고, 
  • iscorect = True로 지정한다. istrue는 입력값을 판단하여 괄호가 제대로 닫힌 경우 True로 남아있고, 그렇지 않다면 False를 반환하기 위한 변수이다. 

다음으로는 괄호의 유효성을 검사한다. 코드는 다음과 같다:

 

    for now in data:
        if now in pare.values():
            stack.append(now)
        elif stack and stack[-1] == pare[now]:
            stack.pop()
        else:
            iscorrect = False
            break

 

  • pare는 미리 선언해두었던 딕셔너리의 밸류와, 사용자로부터 입력받은 data 안에서 차례대로 가져와 판별할 now값이 일치하는지 검사한다. 즉 now의 값이 여는 괄호 중 하나라면 
  • stack 안에다가 그 값을 넣어준다. 

  • 만약 그렇지 않다면(여는 괄호가 아니라면) 그리고 만약 stack안에 값이 존재한다면, 그리고 스택의 마지막으로 추가된 값이 현재 판별의 대상이 되는 괄호에 대응하는 키의 값이라면(pare[now]는 now라는 키에 해당하는 값을 반환한다)
  • stack.pop을 해줌으로써 stack 안에 들어있던 여는 괄호를 제거해준다. 

  • 이도 저도 아니라면 
  • iscorrect는 False로, 입력받은 내용은 괄호를 제대로 닫지 않은 것이라고 판단한다. 

  • 마지막으로 결과를 출력한다. 

느낀 점 


 

매칭되는 값을 찾는 과정을 이렇게 구현할 수도 있구나.

dic[n]은 딕셔너리 안에서 키 n에 해당하는 값을 반환한다. 

댓글