문제 설명
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.
제한사항- 문자열 s의 길이 : 100,000 이하의 자연수
- 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
입출력 예sanswer
| "()()" | true |
| "(())()" | true |
| ")()(" | false |
| "(()(" | false |
입출력 예 #1,2,3,4
문제의 예시와 같습니다.
내가 쓴 정답 코드
def solution(s):
stack = []
for i in s:
if i == ')' and not stack:
return False
elif i == '(':
stack.append(i)
else:
stack.pop()
if not stack:
return True
else:
return False
사고 흐름 과정 분석
잘못된 사고 흐름들:
1. 문자열 순회 방식의 혼동
for i in s: # i는 문자
s[i+1] # 문자를 인덱스로 쓰려 함
- 실수: for i in s와 for i in range(len(s))를 구분 못함
# 방법 1: 인덱스가 필요할 때
for i in range(len(s)):
current = s[i]
if i+1 < len(s): # 범위 체크 중요!
next_char = s[i+1]
# 방법 2: 값과 인덱스 둘 다 필요할 때
for i, char in enumerate(s):
if i+1 < len(s):
next_char = s[i+1]
# 방법 3: 값만 필요할 때 (대부분)
for char in s:
# char 사용
2. 예외 케이스부터 생각
- 처음에 if i == ')': return False 이렇게 시작
- 문제: 정상적인 플로우를 먼저 설계하지 않고 예외부터 막으려 함
- 올바른 순서: 기본 로직 → 예외 처리
3. 스택의 목적 불분명
- 스택에 뭘 넣을지, 언제 뺄지 명확하지 않았음
- 모든 문자를 다 넣고 나서 빼려고 함
다음에 개선할 점들:
1. 문제 해결 순서
❌ 지금: 코딩부터 시작 → 에러 → 수정
✅ 개선: 손으로 시뮬레이션 → 로직 정리 → 코딩
2. 간단한 테스트케이스로 확인
- "()", ")(", "(((" 같은 간단한 케이스로 손으로 따라가보기
- 각 단계에서 스택이 어떻게 변하는지 그려보기
3. 자료구조 선택 이유 명확히
- "왜 스택을 쓰지?" → "나중에 온 것부터 처리하니까"
- 목적이 불분명하면 카운터 같은 더 간단한 방법 고려
4. 기본 문법 체크리스트
- for i in 리스트 vs for i in range(len(리스트))
- 문자열 vs 숫자 연산
- 이런 기본기는 확실히 해두기
다른 사람 풀이
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
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( is_pair("(hello)()"))
print( is_pair("()()()"))728x90
LIST
'프로그래밍 > 코딩테스트' 카테고리의 다른 글
| 프로그래머스 L2: 다음 큰 숫자 (1) | 2025.08.23 |
|---|---|
| 프로그래머스L2: JadenCase 문자열 만들기 (0) | 2025.08.23 |
| 프로그래머스 L2: 최솟값 만들기 (0) | 2025.08.23 |
| 딩코딩코 코딩테스트 20. 2-6. 링크드 리스트 문제 (0) | 2025.05.27 |
| 영어 코딩테스트 대비: 영어 수학 용어 모음 (1) | 2023.06.07 |