import sys
input = sys.stdin.readline
class Node():
def __init__(self,s,p,n):
self.string = s
self.prev = p
self.next = n
def delete(self):
if self.prev:
self.prev.next = self.next
if self.next:
self.next.prev = self.prev
def addLeft(self,s):
new_node = Node(s,self.prev,self)
if self.prev:
self.prev.next = new_node
self.prev = new_node
init_str = input().strip()
M = int(input())
prev = None
for s in init_str:
node = Node(s, prev, None) # 새 노드 만들고
if prev:
prev.next = node # 이전 노드에 연결
prev = node # 이전 노드를 이번 노드로 만들기
# 커서를 노드 왼쪽에 두기 위해 마지막 배열 추가.
endNode = Node(None,node,None)
node.next = endNode
node = endNode
# 커서는 노드의 왼쪽에 있는 것으로 간주
for _ in range(M):
oper = input().strip()
if oper[0] == 'P':
p, alp = oper.split()
node.addLeft(alp) # alp를 커서 왼쪽(현재 노드 왼쪽)에 추가함
elif oper == 'L':
# 커서를 왼쪽으로 한 칸 옮김
if node.prev:
node = node.prev
elif oper == 'D':
# 커서를 오른쪽으로 한 칸 옮김
if node.next:
node = node.next
elif oper == 'B':
# 커서 왼쪽에 있는 문자(현재 노드의 이전 노드)를 삭제함
if node.prev:
node.prev.delete()
while node.prev != None: # == 으로 적은 실수
node = node.prev
while node.string != None:
print(node.string, end='')
node = node.next
풀긴 했는데 시간이 너무 느림
from sys import stdin
left = list(input())
right = []
for _ in range(int(input())):
command = list(stdin.readline().split())
if command[0] == 'L' and left:
right.append(left.pop())
elif command[0] == 'D' and right:
left.append(right.pop())
elif command[0] == 'B' and left:
left.pop()
elif command[0] == 'P':
left.append(command[1])
answer = left + right[::-1]
print(''.join(answer))
다른 사람 풀이 보니까 커서 왼쪽과 오른쪽을 나누고
커서를 옮기는 건
커서 왼쪽을 나타내는 배열과
커서 오른쪽을 나타내는 배열의
한 쪽에서 빼낸 후에 다른 한 쪽에 더하는 식
아니 그러면 오른쪽은 append할 때 연산 비싼거 아닌가? 했는데
오른쪽 배열은 거꾸로 뒤집어놨다고 보면 됨
pop으로만 빼내므로 연산 비싸지 않다.
import sys
def main():
get = open(0).read().split().__iter__().__next__
left = list(get())
right = []
for _ in range(int(get())):
command = get()
if command == "L":
if left:
right.append(left.pop())
elif command == "D":
if right:
left.append(right.pop())
elif command == "B":
if left:
left.pop()
else:
left.append(get())
print("".join(left), end="")
print("".join(right[::-1]))
if __name__ == "__main__":
sys.exit(main())
get = open(0).read().split().__iter__().__next__
파일: open(0)은 파일 객체를 반환하는 함수입니다. 여기서 0은 표준 입력을 의미합니다. 즉, 이 코드는 표준 입력으로부터 데이터를 읽어옵니다.
입력: read() 함수는 파일 객체로부터 전체 내용을 읽어옵니다.
분리: .split()을 사용해 공백을 기준으로 입력 데이터를 리스트로 변환,
반복자 생성: __iter__()
로 리스트의 반복자를 생성하고,
차례대로 값 반환: __next__()
를 통해 입력값을 하나씩 반환하는 함수 get을 정의합니다.
get 할 때마다 입력에서 하나씩 빼내오는 걸 정의해놓았다.
평소에 문제 풀 때나 코테 풀 때 이런거 킥으로 쓰면 좋을라나?
모르겠네
어차피 로직 못 맞추면 이런걸로 최적화해봤자 의미 없고
익숙해지면 당연히 안 쓰는 것보다야 좋겠지만 (ex. input = sys.stdin.readline 외운 것처럼)
다른 코드에서 못 본거 보니까 그리 유용하지 않은건가
일단 써봐야 하나
임베디드같이 성능 하나하나가 중요한 것도 아니고
코드 가독성 측면에서 보면 안좋긴 할듯
그냥 쓰지 말자
import sys
input = sys.stdin.readline
string = input().strip()
explosion = input().strip()
stack = []
# string 훑으면서 stack에 하나씩 넣을때마다
# explosion과 일치하는지 확인해보고, 일치하면 다 꺼내기
# explosion 길이만큼 stack과 explosion 역순회
# 일치하면 explosion 길이만큼 pop, stack 다 봤으면 break
for s in string:
stack.append(s)
idx = len(stack)-1
flag = True
for i in range(len(explosion)-1,-1,-1):
if idx < 0 or explosion[i] != stack[idx]:
flag = False
break
idx -= 1
if flag:
for _ in range(len(explosion)):
stack.pop()
if stack:
for s in stack:
print(s,end='')
else:
print('FRULA')
이것도 풀긴 했는데 시간이 약간 느림.
def main():
string = input().strip()
bomb = input().strip()
bombl = list(bomb)
b_last = bomb[-1]
bl = len(bomb)
ans = []
for l in string:
ans.append(l)
if b_last == l and bombl == ans[-bl:]:
del ans[-bl:]
ans = ''.join(ans) if ans else "FRULA"
print(ans)
main()
빠른 풀이 중 하나.
어려운 문법 안 쓰고 직관적으로 잘 짰다.
마지막 문자를 저장해두고, 같으면 바로 문자열 단위로 ==
때려버린다.
''.join() 메서드
''.join()는 문자열 리스트를 하나의 문자열로 합치는 메서드입니다. 여기서 ''는 빈 문자열을 의미하며, 리스트의 각 요소를 빈 문자열을 구분자로 합친다는 뜻입니다.
동작 방식:
리스트 ans에 있는 문자열들을 하나씩 꺼내어, 그 사이에 구분자를 넣어 하나의 문자열로 결합합니다.
예를 들어, ans = ['a', 'b', 'c']이면 ''.join(ans)은 'abc'로 변환됩니다.
여기서 빈 문자열 ''을 사용하기 때문에, 요소들 사이에 아무런 구분자도 없이 문자열이 연결됩니다. 즉, 리스트의 모든 요소가 그대로 붙어서 하나의 문자열이 됩니다