📖문제
- 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다.
- 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다.
- 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다.
- 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다.
여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.
📗입력
- 입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.
📘출력
- 출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.
📄내가 작성한 코드
T = int(input())
count = 0
for _ in range(T):
vps = input()
for i in range(len(vps)):
if vps[i] == '(':
count += 1
elif vps[i] == ')':
count -= 1
if count < 0:
break
if count == 0:
print('YES')
elif count != 0:
print('NO')
count = 0
👉코드 설명
- 정수형 T를 입력받는다
- 괄호가 한쌍인지 체크할 변수(count)를 선언한다.
- T개의 테스트를 입력받아야하므로 for문을 통해 문자열(vps)를 입력받는다.
- 문자 한개씩 총 문자열의 길이만큼 비교하기 위해 for문을 사용하였다.
- for문을 돌며 문자마다 '('는 count 1 증가 ')'는 count 1 감소하도록 하였다.
- count값이 0이면 한쌍으로 간주하여 YES, 0이 아니면 한쌍이 아닌것으로 간주하여 NO를 출력하였다.
- 반례로 ')))((('는 count값이 0이지만 VPS가 아니다. for문을 돌다가 '(' 갯수보다 ')' 갯수가 많아지는 순간이 오면 for문을 탈출하도록 하였다.
- 다음 테스트 입력시 이전 테스트의 count값이 영향이 가지않도록 count를 초기화 하였다.
❗❗Key Point
VPS가 맞는지 아닌지는 곧 괄호가 한 쌍을 이루는지를 묻는 것이다.
이는 곧 '(' 와 ')' 의 갯수가 같아야 한다는것을 의미하였다.
(단, ')'가 '('보다 갯수가 많아지는 순간이 있으면 안됨)
문제의 의미를 이해하는 것이 풀이의 핵심이었다.
- 문제의 뜻대로 count를 증감하고 0일때는 YES, 0이 아니면 NO를 출력하도록 로직을 구현한다.
- 반례처리는 ')'갯수가 '(' 갯수보다 많아지면 NO를 출력하도록 해야하는데 반복문을 빠져나감으로 구현한다.
- 다음 테스트에 영향이 가지않도록 count를 초기화 한다.
💢막혔던 부분
- 우선 문제가 원하는것을 생각해내는데 살짝 시간이 걸렸다.
- 문자열을 인덱스를 통해 접근하는 부분을 몰라서 처음에 리스트로 했다가 다시 바꿨다..
- for i in range() 사용할때 i = 1로 초기화 해도 for문에서는 0부터 시작하는것을 몰랐다.
- 파이썬은 스위치문을 안쓴다는것을 몰랐다.
- 코드에는 없지만 파이썬은 논리연산자를 and, or로 사용한다는것을 몰랐다.(&&, || 이거인줄)
- 테스트를 1개만 수행하면 정답인데, 테스트를 여러개 수행하면 틀린답이 나와서 확인해보니 count값을 테스트마다 초기화 해주지 않아서 생긴 문제였다.
- 반례가 나올때 print('NO')가 나오게 하였는데 그러면 총 print문을 3번쓰게되어 제출시 '출력초과'가 나왔다.
print문을 쓰는대신 break로 반복문을 빠져나오도록 설정하였다.
😭후기
- 파이썬의 기본문법이 정말 부족하다는것을 느꼈다.
- print문 대신 break문으로 반복문으로 빠져나가는 방법을 생각해내는데 시간이 많이 걸렸다.
- 다른사람들 풀이를 몇개 봤는데, 이문제는 스택을 활용하는 문제였다.. 스택을 사용하지 않고 풀었는데 시간이 되면 스택을 사용해서 다시 풀어봐야겠다.