[백준] 4949. 균형잡힌 세상

채연·2023년 1월 7일
0

baekjoon

목록 보기
1/26

4949. 균형잡힌 세상

문제 링크


📖 문제 설명

  • 왼쪽 괄호가 있으면 오른쪽 괄호가 있어야 한다.
  • 위의 조건에 따라 균형이 맞춰져 있는지 판단하는 프로그램이다.

⌨️ 입력

  • 하나 또는 여러 줄에 걸쳐서 문자열이 주어진다.
  • 각 문자열은 영문, 알파벳, 공백, 소괄호, 대괄호 등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다.
  • 각 줄은 마침표로 끝난다.

🖥️ 출력

각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력

🦯 접근

  1. 첫 번째 접근
    1-1. dictionary를 이용하여 "("를 key 값으로 두면 ")"를 value, "["를 key 값으로 두면 "]"를 value로 놔둔다.
    1-2. for문을 이용하여 단어들을 반복시킨다.
    1-3. ( 혹은 [ 가 나온다면 stack에 넣고, 현재 변수(current)를 이것으로 설정한다.]
    1-4. 또 반복문을 돌아가면서 현재 변수의 반대 값(value)이 나오면 stack에서 pop을 시켜준다. 그리고, 현재 변수(current)는 stack에 들어있는 마지막 값으로 설정
    1-5. 만약, stack의 값이 0이면 "yes", 아니면 "no"를 출력한다.

🚨 오류들

  1. 현재 변수(current)가 없는데 값에 접근하면 오류가 난다.
    -> len을 설정해줌
  2. (]) 일 때는, stack의 개수가 0이 되므로 마지막 조건을 충족해버려 "yes"가 나오는 오류가 있었다.
    -> 다음 코드에서는 이 조건문을 추가해주어 잡아준다.
  3. 이 외에도 다른 오류가 터져서 그냥 dictionary를 사용하지 않고 다른 방법을 생각해보았다.

🦯 접근

  1. 두 번째 접근
    2-1. 첫 번째와 접근은 비슷하다, 몇 가지 조건만 추가하였다.
    2-2. 그 전 오류에서 2번 문제는 (가 존재하지 않을 때 )가 존재한다면 무조건 틀린 문장이므로 stack에다가 이상한 문구를 집어넣고 반복문을 빠져나가게 설정을 해둔다.

    elif(word == ")" and "(" not in stack_list):
    	stack_list.append("f")
    	break

    2-3. 다음은 stack이 비어있지 않고, 단어가 마치는 단어일 때 인덱스 [-1]을 이용하여 마지막 스택이 열리는 단어이면 스택에서 pop 해준다는 조건을 건다.

    elif(word == ")" and "(" not in stack_list):
    	stack_list.append("f")
    	break

    2-4. 그리고 스택의 길이가 0이면 "yes" 출력, 아니면 "no" 출력

🚨 오류들

  1. 한 문장만 입력 받는 것이 아닌, 여러 문장을 입력 받도록 되어 있었다.
words += input()
	if words.endswith("."):
    	break

-> 한 문장인 줄 알고 이런 식으로 코드를 짰었는데, 변경해야함!


📘 최종 코드

while True :
    a = input()
    stack_list = []

    if a == "." :
        break

    for i in a :
        if i == '[' or i == '(' :
            stack_list.append(i)
        elif i == ']' :
            if len(stack_list) != 0 and stack_list[-1] == '[' :
                stack_list.pop() # 맞으면 지워서 stack을 비워줌 0 = yes
            else : 
                stack_list.append(']')
                break
        elif i == ')' :
            if len(stack_list) != 0 and stack_list[-1] == '(' :
                stack_list.pop()
            else :
                stack_list.append(')')
                break
    if len(stack_list) == 0 :
        print('yes')
    else :
        print('no')

🔎 알게 된 내용

  1. startswith() : 시작 문자열이 지정된 문자랑 같은지 판별(bool)
  2. endswith() : 끝 문자열이 지정된 문자랑 같은지 판별(bool)
word.startswith(".")
word.endswith(".")
  1. find(찾을문자, 찾기 시작할 위치)
s = "가나다라"
s.find("라")
# 3
profile
Hello Velog

0개의 댓글