결국은 상문제가 5개임에도 불구하고 혼자 풀어보겠다고 하다가 다 못풀어버렸다... 알고리즘의 핵심인 bfs dfs 주여서 활용 문제가 많았다.
while
문 시작으로 돌아올 때 마다 하나씩 꺼내면 된다. 이 때 재귀 호출했던 순서랑 반대로 넣어야 똑같이 나온다. (재귀 때는 먼저 호출했던게 스택에 넣으면 후입선출로 나중에 나오기 때문에)cost에
저장하면 최단거리가 아니라 움직인 모든 횟수가 저장된다) 큐에 넣을 때 튜플이나 리스트로 묶어서 같이 넣자.visited
에서 pop할 필요는 없다. 어쨌든 이미 가보고 틀린 길인걸 아는 것이기 때문에.deque
를 쓰는데 일반 리스트보다 O(1)로 압도적으로 빠르다. 자세한 사용법은 여기 from collections import deque
deq = deque()
[int(x) for x in stdin.readline().rstrip()]
visited
를 방문한 것대로 집어넣고 if (x,y) in visited
하면 O(n)의 시간이 걸리기 때문에 시간초과가 난다. 2차원 배열에 True
/False
로 저장해서 해당 배열값을 조회하면 바로 알 수 있게 해야 한다.visited = [[False]*m]*n
로 만들면 visited[x][y] = True
했을 때 한 열이 통채로 다 True
로 바뀌어버린다. n개의 열이 [[False]*m]
이라는 동일한 리스트 객체를 가리키도록 생성되기 때문이다. 올바르게 생성하려면 visited = [[False]*m for _ in range(n)]
라고 해야 한다.if
문을 검사해서 True
가 나왔다"는 말이다. 즉 방문 표시는 큐에서 꺼냈을 때가 아니라 큐에 넣을 때 해야 한다. - 백준의 질문 게시판을 참고했는데 100퍼센트 완전하게 이해가 간건 아니지만 앞으로 이렇게 해야겠다.visited
로 되면 break
걸리게 했었는데 이렇게하면 틀린다. break가 아니라 continue를 걸어야 한다. 또한 덱에 넣을 때 방문 처리를 하기 때문에 방문처리에는 모두 방문했다고 됐어도 덱에는 아직 안 뺀게 남아있을 수 있다. (반례 4 4 2 1/1 2/1 3/2 4/3 4
)n
까지 가는데 걸린 시간을 노드랑 같이 묶어서 큐에 넣어놓고 뺄 때마다 더하려고 했는데 그러면 진입차수가 0이 되기 전의 시간들은 모두 사라지게 된다. (진입차수가 0이 아니면 큐에서 빼서 걸린 시간을 더한 새로운 시간을 다시 큐에 넣지 않기 때문에) 그래서 최대시간 배열을 따로 만들어놓고 [현재까지의 시간+next에 가는데 걸리는 시간]이 지금까지의 그 노드의 최대 시간보다 크면 갱신해주기로 했다.while
문 돌 때마다 x-1
, x+1
, x*2
일 때 스택에 넣고 방문처리하는 같은 일을 반복하면 따로 if
문 세번 쓸 필요 없이 for el in (x+1, x-1, 2*x)
로 처리할 수 있다. 고급 스킬.s
가 0일 수도 있는걸 체크하지 못했더니 0일때 while
문이 무한루프를 돈다. 마찬가지로 타겟자리에 뭐든 들어가면 브레이크 걸리게 해놨지만 시간이 지나면 내가 생각했던 값은 아니어도 어쨌든 그 자리에 뭐든 들어가긴 할거니까 잘못된 값이 출력되는 거였다.(ridx-i_s)
가 뭔지 한참 궁금했는데 inorder 그래프에서의 루프인덱스에서 inorder 그래프의 시작점을 빼면 inorder 그래프에서 왼쪽 자식의 수가 나오는 거였다! 천재.... 그러면 p_s
에 이걸 더하면 postorder 그래프에서 왼쪽자식으로 넘길 배열의 끝 인덱스가 된다.