세 막대의 길이가 주어졌을 때, 막대의 길이를 줄여서 만들 수 있는 가장 둘레가 긴 삼각형의 둘레를 구하는 문제입니다. 삼각형의 결정조건을 이해하고, 이를 만족시키기 위해 가장 긴 변의 길이를 어떻게 조절해야 하는지가 문제 해결의 핵심입니다.
항목 | 내용 |
---|---|
문제 번호 | 14215번 - 세 막대 |
난이도 | 브론즈 3 |
핵심 알고리즘 | 수학, 기하학, 정렬 |
이 문제는 '삼각형의 결정조건'이라는 간단한 수학 원리 하나만 알면 쉽게 해결할 수 있습니다. 둘레를 최대로 만들어야 하므로, 막대의 길이는 최대한 줄이지 않아야 합니다.
s1, s2, s3
라고 하고, s3
가 가장 긴 변이라고 가정하면, s3 < s1 + s2
가 성립해야 합니다.s3 ≥ s1 + s2
라면, 세 변은 삼각형을 만들 수 없습니다.s1
, s2
는 그대로 두는 것이 유리합니다.s3
가 너무 길기 때문입니다.s3
의 길이만 필요한 만큼 줄여서 삼각형을 만들 수 있는 최대 길이로 만들면 됩니다.s1, s2, s3
(가장 긴 변)를 쉽게 찾습니다.s3 < s1 + s2
인지 확인합니다.s1 + s2 + s3
입니다.s3
가 너무 깁니다. s1, s2
는 그대로 두고 s3
를 줄여야 합니다.s3
의 길이는 s1 + s2
보다 작아야 하므로, 가능한 가장 긴 길이는 s1 + s2 - 1
입니다.s1 + s2 + (s1 + s2 - 1)
이 됩니다.예시: 5, 4, 10
1. 정렬: 4, 5, 10. (s1=4, s2=5, s3=10
)
2. 조건 확인: 10 < 4 + 5
(즉, 10 < 9
) -> 거짓. 삼각형을 만들 수 없습니다.
3. 가장 긴 변(10) 조절: 새로운 길이는 4 + 5 - 1 = 8
이 되어야 합니다.
4. 최대 둘레 계산: 4 + 5 + 8 = 17
.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int[] sides = new int[3];
sides[0] = Integer.parseInt(st.nextToken());
sides[1] = Integer.parseInt(st.nextToken());
sides[2] = Integer.parseInt(st.nextToken());
// 1. 세 변을 정렬
Arrays.sort(sides);
int s1 = sides[0];
int s2 = sides[1];
int s3 = sides[2];
// 2. 삼각형 조건 확인
// Case 2: 가장 긴 변이 나머지 두 변의 합보다 크거나 같은 경우
if (s3 >= s1 + s2) {
// 가장 긴 변의 길이를 (s1 + s2 - 1)로 조절
bw.write(String.valueOf(s1 + s2 + (s1 + s2 - 1)));
}
// Case 1: 이미 삼각형인 경우
else {
bw.write(String.valueOf(s1 + s2 + s3));
}
bw.flush();
bw.close();
br.close();
}
}
항목 | 설명 |
---|---|
정렬 우선 | 세 변의 길이를 비교하기 전에 Arrays.sort() 를 이용해 먼저 정렬하면, 어떤 변수가 가장 긴 변인지 쉽게 알 수 있어 코드가 매우 단순해집니다. |
자료형 범위 | 세 변의 길이가 최대 10억이므로, 세 변의 합은 int 의 최댓값(약 21억)을 넘어설 수 있습니다. 둘레를 계산하고 저장하는 변수는 long 으로 선언하는 것이 안전합니다. |
삼각형 조건의 등호 | s3 < s1 + s2 가 조건입니다. s3 == s1 + s2 인 경우도 삼각형이 될 수 없는 일직선 상태이므로, 이 경우도 s3 를 줄여야 합니다. |
입력 처리 | 세 개의 정수가 한 줄에 들어오므로 StringTokenizer 를 사용하여 a, b, c 를 읽어 들입니다. |
✔️ 이 문제는 삼각형의 결정조건 (가장 긴 변 < 나머지 두 변의 합
)을 알고 있는지 묻는 문제입니다.
✔️ 먼저 세 변의 길이를 정렬하여 가장 긴 변을 쉽게 찾습니다.
✔️ 삼각형 조건이 성립하면, 길이를 줄일 필요가 없으므로 세 변의 합이 최대 둘레입니다.
✔️ 성립하지 않으면, 가장 긴 변의 길이를 (나머지 두 변의 합) - 1
로 바꾼 후 세 변의 합을 구하면 최대 둘레가 됩니다.