요구사항
- 시간 제한 2초
- 메모리 제한 128MB
- 비어 있다면 FRULA를, 아니라면 폭발 후 문자열을 출력하라
설계 1
- 입력 받은 문자열(line) 과 비교할 문자열(target) 을 받는다.
- line 에서 target 기준으로 왼쪽과 오른쪽으로 나누어 저장한다.
- line을 업데이트 한다. line = left + right
- 요구사항에 맞게 출력한다.
구현 1
import sys
input = lambda: sys.stdin.readline().rstrip()
line = input()
target = input()
# 결과 문자열
while target in line: # 더 이상 target이 없을 때까지 반복
index = line.find(target) # target의 시작 위치
left_stack = line[:index] # target의 왼쪽 부분
right_stack = line[index + len(target):] # target의 오른쪽 부분
line = left_stack + right_stack # target 제거
# 최종 결과 출력
if line == '':
print("FRULA")
else:
print(line)
- 원한 출력결과는 나왔지만, 시간 초과가 난다.
- 아마 계속 line을 순회하고 거기서 또 index를 찾아서 그런 거 같다.
설계 2
- line의 알파벳을 하나씩 스택에 넣자
- 그리고 만약 stack 에 쌓인 target의 길이를 봤는 데 target과 같다면 stack에서 빼준다.
구현 2
import sys
input = lambda: sys.stdin.readline().rstrip()
line = input()
bomb = input()
bomb_len = len(bomb)
stack = []
for i in line:
stack.append(i)
if ''.join(stack[-bomb_len:]) == bomb:
del stack[-bomb_len:]
result = ''.join(stack)
if result:
print(result)
else:
print("FRULA")
- if ''.join ~ 이 부분을 설명해주겠다.
- 만약 현재 stack이 [ 'a', 'b', 'c', '4' ] 이라고 하자. 그리고 bomb 은 c4이다.
- [-bomb_len]는 현재 2로 슬라이싱 해야된다. [-2:] -> ['c', '4'] 가 된다.
- 요것은 ''.join 으로 붙여 "c4" 가 된다. == bomb 과 같은 지 체크한다.
기타 헷갈렸던 부분 다시 정리
a = "pratice"
print(a[-3:])
print(a[3:])
print(a[:3])
print(a[:-3])
# 출력 결과
ice
tice
pra
prat
- 대원칙 하나만 기억하자.
- [출발 : 도착 : 점프]
- 첫 번째의 경우
- 출발: -3 -2 -1. 0은 없음 따라서 ice가 됩니다.
- 두 번째의 경우
- 세 번째의 경우
- 출발: 0번 째 인덱스, 도착: 인덱스 2 이까지
- 네 번째의 경우
- 출발: 0번째 인덱스, 도착: 뒤에서 3번 째 앞까지