티스토리 뷰

반응형

https://www.acmicpc.net/problem/2146

 

2146번: 다리 만들기

여러 섬으로 이루어진 나라가 있다. 이 나라의 대통령은 섬을 잇는 다리를 만들겠다는 공약으로 인기몰이를 해 당선될 수 있었다. 하지만 막상 대통령에 취임하자, 다리를 놓는다는 것이 아깝다

www.acmicpc.net

 

난이도 : 골드 3

 

매우 간단한 방법으로 풀었기 때문에 시간 복잡도 등은 최적화되지 않은 풀이입니다.

같은 섬은 DFS로 같은 번호로 묶었습니다. 그 후 모든 섬의 좌표에서 BFS로 다리를 만들었습니다.

이 경우 스택을 통해 모든 좌표를 저장했으며 큐, 리스트, 배열 등 아무 자료 구조를 사용해도 무방합니다.


전역 변수 

int n = 입력받은 맵의 크기

int map[][], island[][] = 입력받은 맵, 같은 섬끼리 묶은 배열
boolean visit[][] = 섬끼리 묶을 때 방문 체크
Stack<Point> start = 모든 섬의 모든 좌표
int dx[], dy[] = 이동을 위한 좌표
int answer = 가장 짧은 길이(답)

메소드

void main 

입력을 받으며 스택에 모든 1의 좌표를 저장합니다. 그 후 1번 섬부터 DFS를 통해 다 같은 번호로 묶습니다.

섬을 모두 묶었다면 스택에 있는 좌표를 하나씩 꺼내 다리를 만듭니다.

(tie, bridge 호출)

 

void tie

같은 섬을 묶습니다. DFS로 방문 좌표에서 상, 하, 좌, 우로 이동하며 1이면 같은 섬이므로 파라미터로 받은 번호로 묶습니다. island에 섬의 번호를 저장합니다.

(tie 호출)

 

void bridge

스택에 있던 좌표를 기준으로 다리를 세웁니다. 이 과정은 BFS로 진행됩니다.

현재 좌표에서 상, 하, 좌, 우로 이동하며 현재 섬과 다른 번호의 섬을 만날 때까지 진행됩니다.

다른 섬에 도착했다면 answer를 갱신하여 최솟값을 찾습니다.

(check 호출)

 

boolean check

현재 좌표가 유효한 좌표인지 확인합니다.

 

class Point

x, y 좌표와 다리의 길이 count를 저장하는 클래스입니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함