티스토리 뷰
https://www.acmicpc.net/problem/2146
난이도 : 골드 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를 저장하는 클래스입니다.
'문제풀이 > 백준 && 프로그래머스' 카테고리의 다른 글
[백준 20055] 컨베이어 벨트 위의 로봇 (자바) (0) | 2020.10.21 |
---|---|
[백준 17081] RPG Extreme (자바) (2) | 2020.10.19 |
[백준 1766] 문제집 (자바) (0) | 2020.10.16 |
[백준 1194] 달이 차오른다, 가자. (자바) (0) | 2020.10.14 |
[백준 12094] 2048 (Hard) (자바) (0) | 2020.10.12 |