BOJ | Sliver | 4949번 균형잡힌 세상
문제
https://www.acmicpc.net/problem/4949
코드
while True:
_str = input()
stack = []
ans = 'yes'
if _str == '.':
break
for s in _str:
if s == '(' or s == '[':
stack.append(s)
elif s == ')':
if len(stack) == 0:
ans = 'no'
break
else:
if stack.pop(-1) != '(':
ans = 'no'
break
elif s == ']':
if len(stack) == 0:
ans = 'no'
break
else:
if stack.pop(-1) != '[':
ans = 'no'
break
else:
continue
if len(stack) != 0:
ans = 'no'
print(ans)
풀이
이 문제는 스택(Stack)을 이용하고, 종료 조건을 잘 확인하면 문제를 해결할 수 있다. 즉, 문자열을 살펴보다가 열린 괄호((
or [
)가 나오면 스택에 추가하고, 닫힌 괄호()
or ]
)가 나오면 스택에서 열린 괄호를 하나씩 제거해주면 된다. 제거할 때에는 현재 스택에 남아있는 괄호가 있는지 확인하고, 가장 최근에 스택에 저장된 열린 괄호와 현재 확인하는 닫힌 괄호의 짝이 맞는지를 확인하면 된다.
- 스택의 개념을 사용하여 문제 해결
- 문자열을 살펴보다가 열린 괄호(
(
or[
)가 나오면 스택에 추가 - 문자열을 살펴보다가 닫힌 괄호(
)
or]
)가 나오면 스택에서 열린 괄호 제거- 현재 스택에 남아있는 괄호가 있는지 확인 (
len(stack) == 0
) - 가장 마지막에 스택에 저장된 열린 괄호와 현재 확인 중인 닫힌 괄호의 짝이 맞는지 확인
- 현재 스택에 남아있는 괄호가 있는지 확인 (
유사 문제
BOJ | Sliver | 9012번 괄호
문제
https://www.acmicpc.net/problem/9012
코드
import sys
test_case = int(sys.stdin.readline().rstrip())
for _ in range(test_case):
_str = sys.stdin.readline().rstrip()
stack = []
ans = "YES"
for s in _str:
if s == "(":
stack.append(s)
elif s == ")":
if len(stack) == 0:
ans = "NO"
break
else:
if stack.pop(-1) != "(":
ans = "NO"
break
else:
continue
if len(stack) != 0:
ans = "NO"
print(ans)
파이썬에서 사용자로부터 입력 받기
파이썬에서 사용자로부터 입력을 받을 때에는 input()
함수 혹은 sys.stdin.readline()
함수를 사용한다. 백준 문제를 풀 때에는 많은 사람들이 input()
함수보다는 sys.stdin.readline()
함수를 많이 사용한다. 이 두 함수는 문자열을 입력 받을 때, 내부에서 문자열을 처리하는 과정이 다르기 때문에 위 문제와 같이 무한 루프의 종료 조건이 있을 때 주의가 필요하다.
현재 이 글에서 이 두 함수의 차이를 자세하게 설명할 수는 없지만, 위 문제와 같이 무한 루프의 종료 조건이 있을 때 주의할 점에 대해 설명하고자 한다.
먼저 input()
함수의 경우, 입력 받은 값이 숫자든 Boolean이든 문자든 모두 문자열로 처리된다. 그리고 자동으로 개행 문자가 제거된다. sys.stdin.readline()
함수의 경우, 마찬가지로 입력 받은 값은 모두 문자열로 처리된다. 하지만 input()
함수와 달리 개행 문자가 제거되지 않는다는 특징이 있다. 이 두 함수에서 발생하는 개행 문자의 처리에 대한 차이 때문에 무한 루프의 종료 조건을 처리할 때 주의가 필요해진다.
위에서 필자가 적어둔 코드와 같이 input()
함수를 사용하면 개행 문자가 제거되기 때문에 if _str == '.'
조건에 의해 온점(.
)만을 입력받으면 무한 루프가 종료되며 프로그램이 종료된다.
while True:
input_value = input()
if input_value == '.':
break
하지만 sys.stdin.readline()
함수로 입력을 받으면 개행 문자가 제거되지 않기 때문에 온점을 입력받아도 if _str == '.'
조건에 걸리지 않아 무한 루프가 종료되지 않는다.
import sys
while True:
input_value = sys.stdin.readline()
if input_value == '.':
break
따라서 sys.stdin.readline()
함수를 사용하기 위해서는 개행 문자를 제거하는 .rstrip()
을 추가해서 코드를 작성해야 오류 없이 정상적으로 무한 루프를 종료시킬 수 있다.
import sys
while True:
input_value = sys.stdin.readline().rstrip()
if input_value == '.':
break
요약
input()
함수와sys.stdin.readline()
함수는 사용자로부터 값을 입력받는데, 이때 개행 문자를 처리하는 방법에 차이가 있다.sys.stdin.readline()
함수를input()
함수와 똑같이 사용하기 위해서는.rstrip()
을 사용하여 개행 문자를 제거해야 한다.
'Problem Solving > BOJ' 카테고리의 다른 글
BOJ | 파이썬 | Sliver | 1966번 프린터 큐 (with. max 함수의 key 파라미터 사용) (0) | 2024.05.06 |
---|---|
BOJ | 파이썬 | Sliver | 18110번 solved.ac (with. round 함수 사용으로 인한 문제) (0) | 2024.05.06 |
BOJ | 파이썬 | Sliver | 2164번 카드2 (feat. 2161번 카드1) (0) | 2024.04.08 |
BOJ | 파이썬 | Sliver | 10815번 숫자 카드 (0) | 2024.04.05 |
BOJ | 파이썬 | Sliver | 1920번 수 찾기 (with. 이진 탐색 알고리즘) (0) | 2024.04.05 |