2025. 2. 5. 10:55ㆍ프로그래머스/LV.2
문제 링크: 올바른 괄호
문제 설명
문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어"()()" 또는 "(())()" 는 올바른 괄호입니다.")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
문제 풀이
스택을 이용해서 풀어야 한다.
(이면 stack에 값을 넣고 )이면 값을 빼서 stack에 원소가 없으면 올바른 괄호이다.
처음에는 elif를 안쓰고 else를 사용하여 풀었는데 그럼 원소가 없을때 pop을 하여 에러가 났다.
그래서 elif로 하고 stack에 원소가 있을때 빼는 걸로 수정했다.
def solution(s): stack=[] for char in s: if char=='(': stack.append(char) elif len(stack)>0: stack.pop() if len(stack): return False return True
근데 제출하니 2번과6번에서 에러가 났다. 질문하기로 찾아보니
"(()))" => false 이런 반례가 있었다.
아까 에러가 난 부분이랑 같은 논리였다.
스택에 값이 없는데 값을 빼려고 하면 그건 올바른 괄호가 아닌거다.
그래서 else를 추가 하여 바로 false를 리턴해주는 것으로 바꾸었다.
내코드
def solution(s):
stack=[]
for char in s:
if char=='(':
stack.append(char)
elif len(stack)>0:
stack.pop()
else:
return False
if len(stack):
return False
return True
다른사람풀이
def solution(s):
a = 0
for i in s:
if i == '(':
a += 1
else:
a -= 1
if a < 0:
break
return a == 0
변수 a의 초기값은 0이고, 괄호들의 배치에 따라 '(' 는 +1, ')' 는 -1 로 환산하여 계산할 때, 만약 대응하는 '(' 가 오기도 전에 ')' 가 오면 올바르지 않은 괄호겠죠? 그리고 이런 경우라면 반드시 a가 음수가 되는 순간이 찾아옵니다.
ex) '(()))(' 에서 5번째 괄호 ')' 를 계산하고 나면 a = -1이 됩니다.
또 '(' 와 ')' 의 개수가 서로 맞지 않다면 a의 결과값은 0이 아닐 겁니다.
ex) '((()' 에서 모든 계산이 끝난 후 a = 2입니다.
그래서 우리는 계산 도중 a가 단 한번이라도 음수가 되는지, 또는 모든 계산 이후 a가 0이 아닌지를 보면 됩니다.
너무 이해가 잘 가는 설명이라 데리고 왔다. 스택을 안쓰기 때문에 시간도 더 빠를 것 같다.
def is_pair(s):
pair = 0
for x in s:
if pair < 0: break
pair = pair + 1 if x == "(" else pair - 1 if x == ")" else pair
return pair == 0
위와 같은 논리의 코드인데 더 짧게 작성해서 가지고 와봤다. 가독성을 떨어지지만 이렇게 코드를 짤 수도 있어야 된다고 생각해서 익숙해 질겸...
x가 (이면 1을 더하고 다니면 -1을 더하는데 뒷부분이 이해가 안돼서 gpt한테 물어봤다.
if x == "(":
pair = pair + 1
else:
if x == ")":
pair = pair - 1
else:
pair = pair
풀어서 풀면 이런식이라고 함. 이렇게 보니 이해가 된다. 근데 else의 else부분은 불필요한거같다.
그렇게 생각해서
def is_pair(s):
pair = 0
for x in s:
if pair < 0: break
pair = pair + 1 if x == "(" else pair - 1
return pair == 0
이렇게 했는데 런타임에러가 남..... 왜지??
이해가 안돼서 일단 물어봣다.
함수가 solution이 아니여서 오류난 거였음..뒤에 안써도 됨!!!!!
def is_pair(s):
st = list()
for c in s:
if c == '(':
st.append(c)
if c == ')':
try:
st.pop()
except IndexError:
return False
return len(st) == 0
try를 활용한 풀이.
)일때 stack에서 값을 빼는데 인덱스 에러가 나면 예외처리해서 false를 반환한다.
'프로그래머스 > LV.2' 카테고리의 다른 글
[프로그래머스][LV.2] 땅따먹기 | python3 (0) | 2025.02.06 |
---|---|
[프로그래머스][LV.2] 3 x n 타일링 | python3 (0) | 2025.02.06 |
[프로그래머스][LV.2] 멀리 뛰기 | python3 (0) | 2025.02.05 |
[프로그래머스][LV.2] 124 나라의 숫자 | python3 (0) | 2025.02.04 |
[프로그래머스][LV.2] 2 x n 타일링 | python3 (0) | 2025.02.04 |