본문 바로가기
Python/Baekjoon

[BOJ] 2022 SISS 1학기 스터디 - 3주차

by 단월໒꒱ 2022. 5. 4.

# 4949 : 균형잡힌 세상 (Class 2 Silver 4)

[문제]

 

 

 

 

[코드 및 결과]

 

 

import sys

while True:
    str = sys.stdin.readline().rstrip()
    stack = []
    check = 0

    if str == ".":
        break

    for token in str:
        if token == "[" or token == "(":
            stack.append(token)

        elif token == "]":
            if len(stack) != 0 and stack[-1] == "[":
                stack.pop()
            else:
                check = 1
                break

        elif token == ")":
            if len(stack) != 0 and stack[-1] == "(":
                stack.pop()
            else:
                check = 1
                break

    if len(stack) == 0 and check == 0:
        print("yes")
    else:
        print("no")

 

 

 

 

 

 

[설명]

이 문제는 괄호가 잘 열고 닫혀있는지 확인하는 문제이다.

스택을 만들어서 (, [가 나올 경우 스택에 넣고 ), ]가 나올 경우에 짝이 맞는 (, [가 스택의 최상단에 있으면 pop하도록 코드를 짰다.

check를 기본값 0으로 설정해서 짝이 안 맞는 경우 이를 1로 바꾸어, 최종적으로 스택이 비고 check 값이 0이어야 yes가 나오도록 했다.

 

처음에 코드를 제출하니 출력 초과가 떴다.

될거라 생각하고 미처 다 확인해보지 않았는데 .을 찍었을 때 프로그램이 종료되지 않고 무한 루프를 돌고 있었던 것이었다.

따라서 입력받은 문자열이 .일 때 프로그램이 종료될 수 있도록 문자열을 입력받을 때, rstrip함수를 이용하여 오른쪽 공백을 지우도록 했다. (왼쪽 공백도 지울 경우, 입력 예제에 있는  "   ."이 yes를 출력하는 게 아니라 프로그램이 종료되기 때문)

그렇게 공백 삭제 처리를 해주니 다른 케이스들도 결과값이 잘 나오고 정상적으로 종료되는 것을 확인할 수 있다.

 

 

# 9012 : 괄호 (Class 2 Silver 4)

[문제]

 

 

 

[코드 및 결과]

 

 

import sys

T = int(sys.stdin.readline())

for i in range(T):
    stack = []
    expr = sys.stdin.readline()
    check = 0

    for token in expr:
        if token == "(":
            stack.append(token)
            
        elif token == ")":
            if len(stack) != 0 and stack[-1] == "(":
                stack.pop()
            else:
                check = 1
                break

    if len(stack) == 0 and check == 0:
        print("YES")
    else:
        print("NO")

 

 

 

 

 

 

[설명]

이 문제는 괄호가 짝을 맞춰서 잘 열고 닫혀있는가를 확인하고 상태에 맞는 yes/no를 출력하도록 하면 되는 문제이다.

스택을 생성하여 입력받은 문자열을 돌면서 (가 나오면 스택에 넣어주었다.

)가 나올 경우에는 경우를 나누어 스택이 비어있지 않고 최상단에 위치한 것이 (이면 이를 pop해주었다.

이때, 문자열을 다 돌때까지 check가 0이고 스택이 다 비어있으면 최종적으로 YES를 출력하도록 했다.

아닌 경우에는 check 값에 1을 주고 바로 루프를 종료시킨 뒤 NO를 출력하도록 했다.

 

 

# 1292 : 쉽게 푸는 문제 (자유 Silver 5)

[문제]

 

 

 

[코드 및 결과]

 

 

a, b = map(int, input().split())
arr = []

for i in range(1, 46):
    for j in range(i):
        if len(arr) == b:
            break
        arr.append(i)

result = sum(arr[a-1:b])

print(result)

 

 

 

 

 

 

[설명]

1 2 2 3 3 3 4 4 4 4 ... 이런 식으로 입력되어있는 수열이 있고, 시작 번호와 끝 번호를 입력하면 시작번호부터 끝번호까지 있는 수들을 모두 더한 값을 출력하는 문제이다.

시작과 끝을 나타내는 정수가 1부터 1000까지라고 했으므로 수열을 보면 1부터 46까지의 수들이 저장되어 있음을 알 수 있다.

map 함수를 이용하여 시작번호와 끝 번호인 a, b를 입력 받고, 반복문을 통해 수들을 arr 리스트에 넣어준다.

그리고 [a-1:b]라는 인덱스 슬라이싱을 이용하여 해당하는 인덱스 사이에 있는 수들을 모두 더하여 result에 저장한 뒤 이를 출력한다.

 

 

 

 

 

 

'Python > Baekjoon' 카테고리의 다른 글

[BOJ] 2022 SISS 1학기 스터디 - 2주차  (0) 2022.04.09
[BOJ] Bronze Ⅴ, IV - Day 13  (0) 2022.01.09
[BOJ] Bronze Ⅴ- Day 12  (0) 2022.01.08
[BOJ] Bronze Ⅴ- Day 11  (0) 2022.01.08
[BOJ] Bronze Ⅴ- Day 10  (0) 2022.01.05

댓글