문제 : boj11880
문제에서 제시된 직육면체에서 A에서 B로 가는 최단 거리를 어떻게 구할 수 있을까? 직육면체를 전개해서 살펴보면 어렵지 않게 피타고라스의 정리만 가지고 최단거리의 길이를 구해낼 수 있다.
다만 이 문제에서는 '서로 반대편에 위치한 A, B점까지의 최단 거리' 라고 했으므로 A, B점은 임의로 변경해도 된다고 볼 수 있다(정확힌 틀려보고 알았다 ㅠㅠ). 그렇다면 그냥 3개의 변의 길이가 주어졌을 때, 위의 x^2+(y+z)^2이 최단이 되는 값을 찾으면 된다(x,y,z에 각각 a,b,c를 넣었을 때).
즉, 이하의 3가지 중 최단 거리를 찾으면 된다. a,b,c 3가지 중 2가지를 택하므로 3C2 = 3가지 경우를 모두 살펴봐서 최단거리를 구하면 된다.
다만 이 경우 직관적으로 x에 a,b,c 중 가장 긴 길이를 넣어야만 최단 거리가 될 것임을 알 수 있으므로 모든 경우를 보지 않고, 각 테스트케이스마다 a,b,c 중 최대값을 찾고 해당값의 제곱 + 나머지 두 값의 합의 제곱을 출력해줘도 된다. 시간 복잡도 차이는 크지 않다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int tc = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while (tc-->0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int sum = 0;
int max = 0;
for (int i = 0; i < 3; i++) {
int cur = Integer.parseInt(st.nextToken());
sum += cur;
max = Math.max(max, cur);
}
sb.append(1l*max*max+1l*(sum-max)*(sum-max)).append('\n');
}
System.out.println(sb);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 25083 - 새싹 (boj java) (0) | 2022.05.13 |
---|---|
[자바] 백준 5591 - 最大の和 (boj java) (0) | 2022.05.12 |
[자바] 백준 1110 - 더하기 사이클 (boj java) (0) | 2022.05.11 |
[자바] 백준 2936 - 채식주의자 (boj java) (0) | 2022.05.10 |
[자바] 백준 8892 - 팰린드롬 (boj java) (0) | 2022.05.09 |
댓글