bbangssi91   5년 전

먼저 문제 접근방법부터 말씀드리도록 하겠습니다.

LinkedList<LinkedList<Info>> territoryList;  로 선언하여

대륙의 개수는 territoryList이고, 그 안에 포함된 대륙의 좌표는 listInfo 라는 이름의 list로 넣어주었습니다.

1) divideContinent() 메소드에서 BFS를 사용하여 처음 육지인 곳부터 확장을 시작합니다.

-> 확장을 최대한 한 다음에 1번 대륙에 해당하는 모든 좌표를 territoryList의 0번 인덱스에 넣어줍니다.

-> 마찬가지로 for문 루프를 계속 돌면서 2번 대륙 -> 1번 인덱스 / 3번 대륙 -> 2번 인덱스 / ~~~ 반복 

2) 그다음 makePair() 메소드에서 1 ~ N개의 대륙을 2개의 조합 경우의 수를 찾기 위해 DFS로 구현하였습니다.

3) 다음 calcDist() 메소드에서 거리를 계산하고 최소 값을 갱신합니다.

예를들면 총 대륙의 개수는 3개이고 1번 2번 대륙을 골랐을 때,

1번 대륙 (0, 0) (0, 1) (0,2) (0,3)

2번 대륙 (4, 4) (5, 4) (4, 3)

의 상태로 거리를 계산하면 최소 값은 4가 되어 return을 합니다.


시간초과를 줄이려면 어떤 부분을 수정해야될지 도움주시면 감사하겠습니다ㅜㅜ

djm03178   5년 전

첫째로, 링크드 리스트에서 임의의 i번째 원소를 얻어오는 것은 i에 비례하는 시간이 걸립니다. 링크드 리스트의 구조에 대해 알아보세요. i번째 원소를 곧바로 얻어오려면 LinkedList 대신에 ArrayList를 써야 합니다.

둘째로, calcDist 메서드에서 choose의 길이만큼을 보면서 골라진 2개를 다시 체크하고 있는데, 이러면 최악의 경우 다음과 같이 됩니다. 100x100 크기의 맵에 체스판 모양으로 섬이 5000개 있다면, 5000개 중 2개를 뽑는 경우의 수 약 2500만 개마다 5000개의 섬을 체크해서 골라진 2개의 섬을 뽑아내야 하므로 약 1250억 번의 체크가 수행됩니다. 이렇게 하지 말고, 고른 섬 2개의 번호를 직접 calcDist에 보낼 수 있게 해보세요.

bbangssi91   5년 전

와.. 정말 감사합니다 덕분에 문제해결했습니다.

저는 choose의 길이만큼 한번만 for문을 돌려서 O(N)이니 크게 문제없겠다라고 생각했었는데

2개 뽑는 경우의 수만큼을 생각못했었네요 감사합니다 많이 배워갑니다!!

댓글을 작성하려면 로그인해야 합니다.