210526 [백준] 합구하기(11441) / 키로거(5397) / 팰린드롬 만들기(1254)
합구하기(11441)
import sys
N=int(input())
list_a=list(map(int,sys.stdin.readline().split()))
M=int(input())
accums=[list_a[0]]
for i in range(1,N):
accums.append(accums[i-1]+list_a[i])
for _ in range(M):
a,b=map(int,sys.stdin.readline().split())
print(accums[b-1]-accums[a-2]) if a>1 else print(accums[b-1])
#어제 마지막 문제와 동일. 이번엔 내장함수를 쓰지 않고 직접 누적합 리스트를 구현해보았다.
키로거(5397)
import sys
from collections import deque
T=int(input())
for _ in range(T):
key=sys.stdin.readline().strip()
left,right=[],deque()
for k in key:
if k=='<' and left:
right.appendleft(left.pop())
elif k=='>' and right:
left.append(right.popleft())
elif k=='-' and left:
left.pop()
elif k!='<' and k!='>' and k!='-':
left.append(k)
print(''.join(left)+''.join(right))
시도1) 리스트에 insert(index,)로 했더니 시간초과
시도2) 시도1에서 리스트->deque로 변경함으로써 맨 앞에 insert/delete 해야할 땐 appendleft/popleft를 씀.
그 외는 동일. =>성공은 했지만 속도가 남들보다 4~5배 차이남
시도3,다른 사람 풀이 참고) 알파벳 담을 곳을 한개가 아닌 두개로 둔다. index는 필요없다.
<가 입력되므로써 커서 오른쪽에 있게 된 알파멧은 right에, >가 입력되면 right에 있던 애를 다시 왼쪽으로 넣는다
=> 경우의 수가 줄어듦으로써 코드가 간결해짐, 편의를 위해 right는 리스트 대신 deque를 씀
찐막) for문 대신 join을 이용해서 리스트를 한 문자열로 이어서 출력하니 속도가 확 줄었다.
right도 deque대신 list를 쓰면 속도가 좀 덜 나갔었음.
# .reverse()는 .sort()처럼 제자리 연산이고, reversed(리스트)는 sorted(리스트)처럼 새로운 리스트를 반환한다.
1254 팰린드롬 만들기
N=input()
for i in range(len(N)):
if N[i:][::-1]==N[i:]:
print(len(N)+i)
break
#처음 내가 만든 코드는 N[i:][::-1]==N[i:] 대신에 N[::-1][:len(N)-i]==N[i:]를 썼다가 다른 사람 풀이를 보고 좀 더 직관적으로, 간결하게 코드 수정 하였다.
#또한 나는 break대신 exit를 쓰고 for문 밖에는 print(2*len(N)-1)를 써서 펠린드롬 부분 문자열이 없는 경우를 따로 처리 해줬었는데 이 경우는 애초부터 존재하지 않는게, 문자 하나는 무조건 팰린드롬이기 때문이다. 따라서 if문은 무조건 성립하므로 굳이 따로 처리해줄 필요가 없는 것이다.