🔗 문제 링크
9205번: 맥주 마시면서 걸어가기
송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.
www.acmicpc.net
📝 풀이 과정
집에서 페스티벌까지 가는데 바로 페스티벌까지 갈 수도 있고, 1군데의 편의점을 들릴 수도 있지만 100군데의 편의점 모두를 들릴 수도 있기 때문에 모두 탐색을 해야한다고 생각했다.
n이 100이하이고, n3을 해도 100만이기 때문에 플로이드 와샬 알고리즘을 통해 문제를 해결해보기로 했다.
for (int i = 0; i <= n + 1; i++){
for (int j = 0; j <= n + 1; j++) {
int[] p1 = point.get(i), p2 = point.get(j);
dist[i][j] = Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1]);
if (dist[i][j] <= 50 * 20)
d[i][j] = true;
}
}
먼저, List를 통해 각 정점의 좌표 값을 입력 받았다. 집의 위치를 0, 페스트벌의 위치를 n + 1로 두었고, 각 정점에서 다른 정점까지의 위치를 Math.abs()
를 통해 계산하였다.
맥주를 한 번에 가질수 있는 최대 개수가 20개이고, 50m마다 1병의 맥주를 마시기 때문에, 거리가 50 * 20 이하라면 d[i][j]
(i에서 j를 갈 수 있는지에 대한 여부)를 true로 설정하였다.
for (int k = 0; k <= n + 1; k++)
for (int i = 0; i <= n + 1; i++)
for (int j = 0; j <= n + 1; j++)
if (d[i][k] & d[k][j])
d[i][j] = true;
다음으로 플로이드 와샬을 통해 만약 i -> k
로 가는 것이 가능하고, k -> j
로 가는 것이 가능하다면 i -> j
로 가는것이 가능하기 때문에 d[i][j]
를 true로 설정하였다.
따라서, d[0][n + 1]
이 true라면 집에서 페스티발까지 맥주가 떨어지지 않고 도달할 수 있기 때문에 "happy"를 출력한다!
💻 코드
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 1; tc <= T; tc++) {
int n = sc.nextInt();
int[][] dist = new int[n + 2][n + 2];
boolean[][] d = new boolean[n + 2][n + 2];
List<int[]> point = new ArrayList<>();
for (int i = 0; i <= n + 1; i++)
point.add(new int[]{sc.nextInt(), sc.nextInt()});
for (int i = 0; i <= n + 1; i++)
for (int j = 0; j <= n + 1; j++) {
int[] p1 = point.get(i), p2 = point.get(j);
dist[i][j] = Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1]);
if (dist[i][j] <= 50 * 20)
d[i][j] = true;
}
for (int k = 0; k <= n + 1; k++)
for (int i = 0; i <= n + 1; i++)
for (int j = 0; j <= n + 1; j++)
if (d[i][k] & d[k][j])
d[i][j] = true;
System.out.println(d[0][n + 1] ? "happy" : "sad");
}
}
}
📊 제출 결과

'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준] 9461번: 파도반 수열 - JAVA (0) | 2020.12.13 |
---|---|
[백준] 9375번: 패션왕 신해빈 - JAVA (0) | 2020.12.13 |
[백준] 9095번: 1, 2, 3 더하기 - JAVA (0) | 2020.12.13 |
[백준] 9019번: DSLR - JAVA (0) | 2020.12.13 |
[백준] 7662번: 이중 우선순위 큐 - JAVA (2) | 2020.12.13 |