2481

알고리즘/acmicpc 2015. 9. 1. 19:39 Posted by 아는 개발자

경로가 주어지지 않아 스스로 경로를 만들고 최단 경로를 찾아내는 문제이다.


각각의 이진수들 마다 정점으로 생각하고 그 정점과 해밍 거리가 1인 정점들을 연결해야 한다. 기존의 방법들은 간선을 배열에 저장해두기도 하는데 여기서는 정점의 최대 개수가 100000이라 n*n으로는 저장이 안될 것 같아서 정점을 방문 할 때마다 매번 간선을 확인하는 것으로 했다(정점마다 가능한 최대 간선수가 30뿐이라 시간 복잡도에 영향을 주지 않을 것 같기 때문이도 했다)


여기서 이진수를 그대로 가져 갈 것인가? 아니변 변환 할 것인가로 고민을 했는데 다행히 이진수의 최대 길이가 30이므로 int 10진수 값으로 변환했다. 정점을 표현하는데 더 쉬웠다.


특정 정점에서 해밍 거리가 1인 정점이 존재하는지 안하는지를 파악해야한다. 모든 정점을 뒤진다면 O(N)시간이 걸려 모든 정점에서 수행하면 O(N*N)으로 시간초과가 걸릴 것이다. 해결하기 위해서 정점들의 값들을 sort해 binary search를 가능하도록 했다.


binary search를 하기 위해 정점들을 sort한 후에는 기존에 어느 위치에 있었는지를 저장해두어야 했는데 여기서 디버그하는데 상당히 오래걸렸다. 연습장에 예상 결과값을 만들어서 풀었으면 빨랐을 것 같은데 스스로 운에 맡기다가 계속 F10만 눌렀다.


최단 경로의 길이는 다익스트라로 구하면 되고 지나치는 정점 대한 정보는 현재 정점이 이전 정점에 어디를 가리키는지를 각각 저장해두어서 풀었다.


다익스트라, 순회정점, 이진수, 이진탐색이 종합된 문제였다.


'알고리즘 > acmicpc' 카테고리의 다른 글

2465  (0) 2015.09.08
2457  (0) 2015.09.04
2481  (0) 2015.09.01
1987  (0) 2015.08.26
10217  (0) 2015.08.26
2638  (0) 2015.08.24