문제
https://www.acmicpc.net/problem/9019
걸린 시간
01 : 23 : 19 실패
풀이
PyPy3
from collections import deque
import sys
input = sys.stdin.readline
dslr = ['D', 'S', 'L', 'R']
class DSLR():
def digit(self, A):
return '0'*(4-len(str(A)))+str(A)
def D(self, A):
result = A*2
if result > 9999:
result %= 10000
return result
else:
return result
def S(self, A):
result = A-1
if result < 0:
return 9999
else:
return result
def L(self, A):
return (A%1000*10)+(A//1000)
def R(self, A):
return (A%10*1000)+(A//10)
def bfs(A):
q = deque()
q.append([A, ''])
visited[A] = True
cal = DSLR()
while q:
v, p = q.popleft()
if v == B:
break
command = [cal.D(v), cal.S(v), cal.L(v), cal.R(v)]
for i in range(0, 4):
if not visited[command[i]]:
visited[command[i]] = True
path = p+dslr[i]
q.append([command[i], path])
return p
if __name__ == "__main__":
T = int(input())
result = []
for _ in range(0, T):
A, B = map(int, input().split())
visited = [False]*10000
result.append(bfs(A))
for i in result:
print(i)
처음 제출했을때 Python3 은 물론이고 PyPy3 로도 시간초과가 나는 문제였다.
백준 질문게시판과 다른 블로거의 풀이에서 원인을 찾을 수 있었다.
- 정수 보다 문자열을 복사하는데 드는 부담이 더 크다.
- 메모이제이션에 사용되는 1만 크기의 리스트를 반복문을 사용하여 초기화.
위 두 가지만 고쳐도 통과는 하지만 여기서 L, R 연산을 조금 더 수정하면 실행시간을 절반 정도로 줄일 수 있다.
- 정수를 4자리 문자열로 바꾸어 deque 에 추가, rotate 메서드 사용 후 join 연산 (이전 풀이)
- 정수를 4자리 문자열로 바꾸어 인덱싱 (이전 풀이)
- 몫과 나머지를 이용한 수식연산
PyPy3 로도 겨우겨우 통과하는데 Python3 으로 제출해 더 빠른 속도로 통과한 풀이가 하나 등록되어 있다. 코드가 비공개라 볼 순 없지만 어떻게 작성했는지 알고싶다.
참고
'Baekjoon' 카테고리의 다른 글
Baekjoon 5525번 IOIOI (3) | 2020.08.15 |
---|---|
Baekjoon 9205번 맥주 마시면서 걸어가기 (0) | 2020.08.14 |
Baekjoon 16236번 아기 상어 (0) | 2020.08.13 |
Baekjoon 15686번 치킨 배달 (0) | 2020.08.13 |
Baekjoon 14500번 테트로미노 (0) | 2020.08.12 |
댓글