[백준 5430] AC (Python)

hhkim·2022년 8월 31일
0

algorithm - python

목록 보기
8/10
post-thumbnail

바킹독 덱 강의 연습 문제

처음에 풀고 나서 시간 초과가 나서 찾아봤더니 reverse()의 비용이 높아서 그런 거였다. R을 만날 때마다 reverse()를 실행하는 것이 아니라 그 개수를 세서 홀수인 경우에 한 번만 실행하도록 한다. D 연산도 R의 개수가 짝수인지 홀수인지에 따라 popleft()pop()을 실행한다.

🦾 배운 점

배열 인덱스를 a[i:j]와 같이 명시하면 i번째부터 j -1번째 원소까지 포함하는 새로운 배열을 반환한다.

from collections import deque

t = int(input())			# 테스트 케이스 수
for i in range(t) :			# 테스트 케이스 수만큼 반복
	p = input()				# 수행할 함수 예) RDD
	n = int(input())		# 배열의 길이
	tmp = input()			# 배열에 들어있는 정수 예) [1,2,3,4]
	d = deque(tmp[1:-1].split(','))	# tmp를 덱에 담기
	error = False			# error 플래그
	cnt_r = 0				# R 연산의 개수를 셀 변수
	for func in p :			# p에 들어있는 각 함수에 대해 반복
		if func == 'R' :	# 함수가 R이면
			cnt_r += 1		# cnt_r을 1 증가
		elif func == 'D' :	# 함수가 D면
			if len(d) == 0 or (len(d) == 1 and d[0] == '') :	# 들어있는 원소가 없으면
				error = True	# error 플래그는 True
				break			# 반복문 빠져나오기
			if cnt_r % 2 == 0 :	# R 연산의 개수가 짝수면
				d.popleft()		# 뒤집기가 일어나지 않은 것이므로 앞의 원소 제거
			else :				# R 연산의 개수가 홀수면
				d.pop()			# 뒤집기가 일어난 것이므로 뒤의 원소 제거
	if error :			# error 플래그가 True면
		print('error')	# error 출력
	else :				# error 플래그가 False면
		if cnt_r % 2 == 1 :	# R 연산의 개수가 짝수면
			d.reverse()		# reverse 실행
		print('[' + ','.join(d) + ']')	# 덱의 원소 전체 출력

0개의 댓글