ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] BOJ 4949 : 균형잡힌 세상
    코딩테스트/백준 2024. 10. 22. 08:31

    https://www.acmicpc.net/problem/4949

    생각 정리

    • 스택을 사용하고, ')' or ']' 가 들어올 때 스택의 맨 위의 문자가 각각의 짝과 맞는지 보자.
    • 그런 다음 만약 stack이 비어있다면..

    헷갈렸던 부분

    • 문자열의 마지막에 온점이 찍힌다. 문자열의 종료 조건인데 어떻게 가능하지
    • 쉽게 말해 문자열이 있다면 온점을 신경 쓰지 않아도 된다. 그냥 없다고 생각하자.
    • 다만, 문자 '.' 입력으로 들어왔을 때, 반복문을 종료하면 된다. 

    요구사항

    • 시간제한 : 1초 문자열의 길이가 100보다 작거나 같다. 
    • 메모리 제한 128MB 넉넉
    • 문자열이 주어졌을 때 균형 잡힌 문자열인지 아닌지 판단
    • 문자열의 종료 조건은 마지막에 온점 하나가 들어온다. 

    설계

    • while True일 때 동안 사용자로 부터 입력을 받는다.
      • 만약 받은 입력이 '.' 이라면 while문을 break 한다.
    • 아닌 경우 is_balanced(line) 사용자 정의 함수를 만들어 입력 받은 (line) 걸 돌린다. 
      • True 일 경우 print('yes')
      • False 일 경우 print('no)
    • def is_balanced(s):
      • 리스트 초기화 (입력 받은 문자들 중 괄호들만 넣을 리스트)
      • for 문을 돌린다. for char in s: (여기서 문자열은 이터럴이기 때문에 for문이 가능하다.)
        • 만약 char == '(' 나 '[' 이라면
          • 리스트.append(char) 
        • 그게 아니고 char == ')' 라면
          • 리스트가 비어 있고, 스택의 마지막 인덱스의 값이 '(' 아니면
            • retun False
          • 리스트.pop()  (리스트가 비어 있지 않고, 스택의 마지막 인덱스의 값이 '[' 라면

    . . . .

    다른 부분도 위 과정처럼 처리를 해준다. 

    구현

    def is_balanced(s):
        stack = []
        for char in s:
            if char == '(' or char == '[':
                stack.append(char)
            elif char == ')':
                if not stack or stack[-1] != '(':
                    return False
                stack.pop()
            elif char == ']':
                if not stack or stack[-1] != '[':
                    return False
                stack.pop()
        return len(stack) == 0
    
    while True:
        line = input().rstrip()
        if line == '.':
            break
        if is_balanced(line):
            print("yes")
        else:
            print("no")

     

    + 2024.10.23 복습

    def is_balanced(s):
        stack = []
        for char in s:
            if char == "(" or char == "[":
                stack.append(char)
            elif char == ")":
                if not stack or stack[-1] != '(':
                    return False
                stack.pop()
            elif char == "]":
                if not stack or stack[-1] != '[':
                    return False
                stack.pop()  
        return len(stack) == 0
    
    while True:
        text = input().rstrip()
        if text == '.': break
        if is_balanced:
            print("yes")
        else:
            print("no")
    • 맞게 한 거 같았는 데 원하는 출력 결과가 나오지 않아.. 보다가 모르겠어서 gpt 한테 물어봄.
    • while 문에서 is_balanced라는 사용자 정의 함수를 만들었는 데 인자를 안넣어주었다. 
    • if문에서 0과 False 를 제외하고 다 True를 반환하기 때문에 yes가 나온 것이다. <- 뇌피셜
    • 그래서 if is_balaced(text): 라고 수정하여 원하는 출력 결과를 얻을 수 있었다. 

    '코딩테스트 > 백준' 카테고리의 다른 글

    [Python] BOJ 10799 : 쇠막대기  (0) 2024.10.24
    [Python] BOJ 3986 : 좋은 단어  (2) 2024.10.23
    [Python] BOJ 10845 큐  (0) 2024.10.21
    [Python] BOJ 17298 : 오큰수  (0) 2024.10.19
    [Python] BOJ 1158 : 요세푸스 문제  (0) 2024.10.17
Designed by Tistory.