[문제 링크] 👇
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이 방법
💡 스택 이용
스택이 비어있으면 스택에 값을 넣는다.
스택의 맨 마지막 요소가 현재 문자와 같으면 꺼낸다.
위 조건이 다 맞지 않으면 스택에 현재 문자를 넣는다.
Solution
def solution(s):
stack = []
for i in s:
if not stack: # 스택이 비어있으면
stack.append(i)
continue
if stack[-1] == i: # 스택 맨 뒤 요소와 같으면
stack.pop()
continue
stack.append(i) # 위 조건이 모두 맞지 않으면
return 0 if stack else 1
👩💻 회고
시간 초과 난 코드
def solution(s):
s = list(s)
i = 1
while True:
if s[i - 1] == s[i]:
s[i - 1], s[i] = '', ''
i = 0 # 초기화
s = list(''.join(s))
if i >= len(s) - 1:
break
i += 1
return 1 if len(s) == 0 else 0
시간 초과가 발생한 이유
s = list(''.join(s)) 구문에서 문자열 재구성을 반복적으로 수행하기 때문이다. 이 과정은 매번 전체 리스트를 문자열로 합친 후 다시 리스트로 변환하므로, O(n) 복잡도가 반복되어 시간 복잡도가 O(n²) 수준으로 증가하게 된다.
solution 코드와 주요 차이점
- 리스트 재구성의 유무
- 개선 전 코드(solution(s)) : 문자열을 합치고 리스트로 변환하는 과정을 반복하여 s = list(''.join(s))로 계속 전체 문자열을 조작한다.
- 개선 후 코드(스택 사용) : 스택을 사용하여 한 번씩만 확인하고, 붙어있는 문자가 나오면 pop으로 제거하므로 전체 문자열을 반복해 재구성하지 않는다.
- 시간 복잡도
- 스택을 이용한 코드 : O(n)으로, 문자열을 단 한 번씩만 확인하면서 붙어 있는 쌍을 제거해 나간다.
- 리스트 재구성 반복 코드 : O(n²)으로, 문자열을 재구성하는 과정이 반복될 때마다 더 많은 시간이 소요된다.
스택 구조를 이용하는 방식이 문자열을 재구성하는 방식보다 훨씬 빠르게 작동하므로, 스택을 사용한 코드가 훨씬 효율적이다.
'프로그래머스 코딩테스트 > Level 2' 카테고리의 다른 글
[Programmers] L2. 점프와 순간 이동 (Python) (0) | 2024.11.11 |
---|---|
[Programmers] L2. 카펫 (완전탐색/Python) (0) | 2024.11.11 |
[Programmers] L2. 피보나치 수 (Python) (0) | 2024.11.10 |
[Programmers] L2. 이진 변환 반복하기 (Python) (0) | 2024.11.09 |
[Programmers] L2. JadenCase 문자열 만들기 (Python) (0) | 2024.11.08 |