목록그래프 탐색 (45)
기록방
👉 문제링크 🔸 문제 분석 🔸N개의 도시 사이 M개의 도로가 주어진다. 각 도로를 건너는 시간이 있고, 출발지와 도착지가 주어진다.도로는 출발지부터 도착지까지 단방향 비순환 그래프이다.많은 경로 중에 가장 늦게 도착하는 경로에서 지나는 도로의 수 총합을 출력한다.🔸 문제 풀이 🔸출발지부터 도착지까지 단방향 비순환 그래프이므로, 위상 정렬(Topology Sort)을 통해 최대값을 구할 수 있다.건너온 경로의 수를 카운트 해야하므로 역방향 탐색이 필요하다.1분도 쉬지 않고 달린 경로이므로 현재 시간과 도로의 소요 시간의 차이가 맞아 떨어져야 한다.경로를 중복되게 체크하지 않기 위해서 도시를 방문처리 한다.🔸 코드 🔸import java.io.*;import java.util.ArrayDeque..
👉 문제링크🔸 문제 분석 🔸N x M 직사각형 땅에 수영장을 만든다. 격자 속 숫자가 해당 땅의 높이이다.물을 채워야 하는데, 물은 상하좌우 높은 곳에서 낮은 곳으로만 흐르고 격자 밖으로는 무한정 흘러나가 버린다.채울 수 있는 물의 양의 최대값을 출력한다.🔸 문제 풀이 🔸상하좌우 인접 땅으로 흐르는 물의 이동을 구현하기 위해서 BFS를 사용한다.외각에 붙은 땅은 물이 고일 수 없으므로, 역방향 BFS를 통해 이어진 땅들을 모두 체크한다.물이 고일 수 있는 땅들에 물을 채우고 총합을 출력한다.물 높이의 최대값은 2가지 기준을 유의해서 정한다.해당 높이보다 높아지면 물이 흘러나가버리는 경우 : 최대값의 인덱스가 체크된 경우흘러나가지는 않지만, 땅이 높아서 조금 더 높이 물이 고이는 경우 : 최대값의..
👉 문제링크🔸 문제 분석 🔸R x C 격자판에서 지훈이의 위치와 불들의 위치가 주어진다.지훈이는 1분에 상하좌우 4방향으로 이동할 수 있고, 불도 1분에 4방향으로 확산된다.격자판의 가장자리로 가면 미로를 탈출 할 수 있다.지훈이가 불을 피해 미로를 탈출하기 위한 최단시간을 출력한다.만약 탈출하지 못한다면 "IMPOSSIBLE"을 출력한다.🔸 문제 풀이 🔸격자판에서 최단 거리를 구하는 단순 BFS 문제이다. 하지만 지훈이의 이동과 불의 확산 모두 고려해야 한다.큐를 이용한 BFS 구현에서 큐 사이즈만큼 반복해서 '1분'의 움직임을 제한해야 한다.지훈이의 위치는 맵에 그리지 않고 큐에만 넣고, 불은 맵에 'F'로 표시해 간다.지훈이는 불로 이동할 수 없을 뿐만 아니라, 큐에서 꺼냈을 때 현재 위치..
👉 문제링크🔸 문제 분석 🔸n x n 격자판에서 상하좌우로 움직였을 때 가장 긴 이동거리를 출력한다.이동 시 현재 위치 보다 큰 쪽으로만 이동할 수 있다.🔸 문제 풀이 🔸최장 이동 거리를 찾는 그래프 탐색 문제이고, 4방향 이동에 대한 정보를 따로 저장할 필요 없게 할 수 있도록 깊이 우선 탐색(DFS)를 사용한다.이동은 항상 격자판의 숫자가 큰 쪽으로 이동하므로, 특정 칸으로 진입하는 방향이 달라도 나가는 최적의 방법은 항상 같다. DP를 이용한다.이 원리를 이용해서 한 격자 칸에서 시작해서 최장 몇 길이까지 이동할 수 있는지 dp 배열에 저장해간다.이미 탐색했던 칸이라면, 재탐색 할 필요 없이 기존 최장값을 이용하면 된다.모든 칸에서 시작해보고 최대값을 구해 출력한다.🔸 코드 🔸impor..
👉 문제링크🔸 문제 분석 🔸N x N 지도에 2개 이상의 섬이 주어진다. 섬은 1로 상하좌우 연결된 덩어리이다.서로 다른 두 섬 사이에 다리 하나를 놓을 때, 다리의 길이의 최소값을 출력한다.🔸 문제 풀이 🔸단순한 그래프 탐색 문제이다.먼저 지도 상의 같은 섬 소속 1들을 묶어줄 필요가 있다.다리를 지을 때, 서로 다른 섬인지 알아야 하므로 섬 덩어리 별 다른 값을 넣는다.단순한 4방 탐색이므로, DFS나 BFS 상관 없이 사용하면 되는데, 여기서는 DFS로 통일해서 사용했다.섬 사이에 다리가 놓이는지 확인해야 한다.DFS로 한쪽 섬의 끝에서 다른 섬을 발견 할 때까지 탐색한다.한번 다리가 완성되면, 최소값으로 저장하고 백트래킹에 이용한다.🔸 코드 🔸import java.io.*;import..