티스토리 뷰
https://www.acmicpc.net/problem/9935
이 문제를 풀기 위해 처음 떠올린 알고리즘은 쉬웠다. 파이썬의 리스트 index 함수를 사용하여 일치하는 값이 있으면 해당 인덱스부터 폭발 문자열의 길이만큼 요소를 삭제한 후에 새로운 string을 복사하여 폭발열과 일치하는 문자열이 없을 때까지 반복했다.
# 문자열 폭발
import sys
input = sys.stdin.readline
string = input().rstrip()
bomb = input().rstrip()
while True:
if bomb in string:
idx = string.index(bomb)
string = string[:idx] + string[idx+len(bomb):]
else:
break
if string == '':
print('FRULA')
else:
print(string)
하지만 이 방법은 폭발 문자열을 발견할 때마다 새로운 string을 만들기 때문에 시간 초과가 발생하였다.
두 번째로 생각한 방식은 stack을 사용하는 것이었다. 스택에 문자를 하나씩 넣다가 폭발 문자열의 마지막 글자와 같은 글자가 있다면 리스트 슬라이싱을 통해 폭발 문자열과 동일한지 비교한 후, 같다면 폭발 문자열의 길이만큼 스택에서 pop 연산을 통해 제거해주었다. 하지만 이 또한 시간 초과가 발생하였다.
# 문자열 폭발
import sys
input = sys.stdin.readline
string = input().rstrip()
bomb = input().rstrip()
stack = []
for idx in range(0, len(string)):
stack.append(string[idx])
if string[idx] == bomb[-1]:
if ''.join(stack[::-1][:len(bomb)]) == bomb[::-1]:
for i in range(len(bomb)):
stack.pop()
if len(stack) == 0:
print('FRULA')
else:
print(''.join(stack))
발생한 원인은 리스트 인덱싱을 비효율적으로 하였기 때문이다. 역순으로 바꾼 후에 거기서 폭탄 문자열의 길이만큼 가져오기 때문에, O(N)이라는 리스트의 요소를 가지고 오는 연산을 두 번이나 수행한다. 따라서 시간 초과가 발생한 것 같다.
# 문자열 폭발
import sys
input = sys.stdin.readline
string = input().rstrip()
bomb = input().rstrip()
stack = []
for idx in range(0, len(string)):
s = string[idx]
stack.append(s)
if s == bomb[-1]:
if ''.join(stack[-len(bomb):]) == bomb:
for i in range(len(bomb)):
stack.pop()
if len(stack) == 0:
print('FRULA')
else:
print(''.join(stack))
최종적으로 제출한 답안은 위와 같다. 이전 방법보다 효율적으로 stack에 접근하고 있다.
시간초과 없이 통과할 수 있었다.
'PS > BOJ Python' 카테고리의 다른 글
10986번 - 나머지 합 (0) | 2023.07.12 |
---|---|
11723번 - 집합 (0) | 2023.06.25 |
1932번 - 정수 삼각형 (0) | 2023.06.10 |
11660번 - 구간 합 구하기 5 (0) | 2023.06.05 |
11722번 - 가장 긴 감소하는 부분 수열 (0) | 2023.06.02 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 1759
- 1764
- 조합
- heapq
- 프로그래머스
- dp
- 브루트포스
- 백준
- 1358
- 10815
- 10845
- 1715
- 러스트
- 딕셔너리
- 싸피
- 큐
- 백트래킹
- 덱
- 빌림
- 수학
- 삼성청년소프트웨어아카데미
- 17478
- 파이썬
- 스택
- 10816
- 자료구조
- 2805
- 1182
- 11051
- 10971
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함