이제부터 매일 한 문제씩 코딩테스트 대비하여 풀고 풀이을 올리려고 한다.😁
오늘 문제는 스터디원이 고른 "4949번 균형잡힌 세상" 이다.
문제 정보부터 보자
세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.
정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.
문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다.
입력의 종료조건으로 맨 마지막에 점 하나(".")가 들어온다.
각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.
So when I die (the [first] I will see in (heaven) is a score list).
[ first in ] ( first out ).
Half Moon tonight (At least it is better than no Moon at all].
A rope may form )( a trail in a maze.
Help( I[m being held prisoner in a fortune cookie factory)].
([ (([( [ ] ) ( ) (( ))] )) ]).
.
.
yes
yes
no
no
no
yes
yes
이번 문제에서는 stack 자료구조를 사용해 문제를 해결했다
전반적인 로직은 다음과 같다.
(
, [
가 들어오면 stack에 넣는다.)
, ]
가 들어오면 stack에서 pop을 한 값과 매치가 되는지 비교한다.)
라면 pop()
한 값이 (
인지 비교한다.]
라면 pop()
한 값이 [
인지 비교한다.flag
1로 바꾼다.flag
를 1로 바꾼다.while True:
ch = input() //한 줄 씩 입력을 받는다
if ch == '.': //'.'만 들어오면 종료한다
break
stack = []
flag = 0
for c in ch:
if c == '(':
stack.append(c)
elif c == '[':
stack.append(c)
elif c == ')':
if len(stack) == 0 or '(' != stack.pop():
flag = 1
break
elif c == ']':
if len(stack) == 0 or '[' != stack.pop():
flag = 1
break
if flag == 0 and len(stack) == 0:
print('yes')
else:
print('no')
제출 후 다른 사람의 코드를 살펴보다가 실행시간이 3분의 1인 코드를 보게 되었다.
분석을 해보니 크게 다른 것은 없었지만input()
이 아닌sys.stdin
을 사용한 것이 원인인 것 같아 검색을 해보았다.
참고 링크 : 입력속도 비교
위 링크를 참고해보면 천만개의 숫자를 한줄씩 입력받을 때의 속도를 보면 다음과 같다고 한다.
입력 방법 | 속도 |
input() | 12.5초 |
sys.stdin.readline() | 4.5초 |
따라서 sys.stdin
으로 바꾸어 보았다.
import sys
for ch in sys.stdin://한 줄 씩 입력을 받는다
if ch[0] == '.': //'.'만 들어오면 종료한다
break
stack = []
flag = 0
for c in ch:
if c == '(':
stack.append(c)
elif c == '[':
stack.append(c)
elif c == ')':
if len(stack) == 0 or '(' != stack.pop():
flag = 1
break
elif c == ']':
if len(stack) == 0 or '[' != stack.pop():
flag = 1
break
if flag == 0 and len(stack) == 0:
print('yes')
else:
print('no')
그랬더니 시간이 거의 3분의 1로 줄어들게 되었다.