<문제 링크>
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에
www.acmicpc.net
<정답 코드>
sol1) stack 배열에 열린 괄호는 추가, 닫힌 괄호는 열린 괄호 있으면 pop으로 제거
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
while True:
stack = []
line = input()
if line == '.': # 종료조건
break
for i in line:
if i == '(' or i == '[': # 열린 괄호면 stack에 추가
stack.append(i)
elif i == ')': # 닫힌 괄호면 열린괄호 존재 유무에 따라 처리
if len(stack) > 0 and stack[-1] == '(':
stack.pop()
else:
stack.append(i)
break
elif i == ']': # 닫힌 괄호면 열린괄호 존재 유무에 따라 처리
if len(stack) > 0 and stack[-1] == '[':
stack.pop()
else:
stack.append(i)
break
if len(stack) == 0: # 모든 괄호 쌍이 맞아 stack이 비어있으면 yes
print('yes')
else:
print('no') # 모든 괄호 쌍이 맞지 않아 stack이 비어있지 않으면 no
|
cs |
sol2) 열린괄호와 닫힌괄호 갯수 세서 판단 후, 괄호 문자만으로 된 배열 만들어 괄호쌍 찾아 제거
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import sys
input = sys.stdin.readline
while True:
line = input().rstrip()
if line == '.':
break
# 열린 괄호와 닫힌 괄호 숫자 일치하지 않으면 no 출력
if line.count('(') != line.count(')') or line.count('[') != line.count(']'):
print('no')
continue
# 괄호 문자만 포함하는 문자열 b 생성
b = ''
for i in line:
if i in '()[]': # line의 요소 i가 괄호면 b에 추가
b += i
# 연속된 괄호쌍 () 또는 [] 찾아 replace로 제거
while '()' in b or '[]' in b:
if '()' in b:
b = b.replace('()', '')
if '[]' in b:
b = b.replace('[]', '')
if b == '':
print('yes')
else:
print('no')
|
cs |
출력 초과
입력을 input()이 아니라 sys.stdin.readline()으로 받을 경우 출력 초과 오류 발생
sys.stdin.readline()으로 입력받은 문자열은 개행 문자('\n')를 포함하고 있어
마침표로 실행되는 종료 조건( if line == '.' ) 제대로 수행되지 않음
readline()을 사용할 경우 rstrip()을 통해 문자열 뒤 공백(개행문자 포함)을 제거해야 입력값이 마침표인지 정확히 판별 가능
sol 1 vs sol 2
sol 2의 replace 연산은 내부적으로 새로운 문자열을 생성하기 때문에
=> 매우 긴 입력 문자열의 경우, sol 1이 성능상 유리할 수 있음
그러나 문제에서 입력 문자열은 최대 100글자로 명시되어 있으므로
=> 채점 결과 sol 2가 sol 1보다 약 5배 빠른 연산속도 보임
문제 상황과 데이터 형태에 따라 적합한 방식 사용해야함
'프로그래밍 > Python' 카테고리의 다른 글
백준_python 2108번 통계학(시간초과, collections.Counter 모듈) (0) | 2024.04.08 |
---|---|
백준_python 1929번 소수 구하기(시간 초과, 에라토스테네스의 체) (1) | 2024.04.05 |
백준_python 2839번 설탕 배달 (1) | 2024.04.03 |
백준_python 10989번 수 정렬하기 3 (메모리 초과, 시간 초과) (0) | 2024.04.02 |
프로그래머스_python lv0. n의 배수 고르기 (0) | 2023.04.06 |