백준 14215번: 세 막대

레곤토르닉·2025년 8월 19일
0

BaekJoon

목록 보기
53/64
post-thumbnail

백준 14215번: 세 막대

세 막대의 길이가 주어졌을 때, 막대의 길이를 줄여서 만들 수 있는 가장 둘레가 긴 삼각형의 둘레를 구하는 문제입니다. 삼각형의 결정조건을 이해하고, 이를 만족시키기 위해 가장 긴 변의 길이를 어떻게 조절해야 하는지가 문제 해결의 핵심입니다.


✅ 문제 개요

항목내용
문제 번호14215번 - 세 막대
난이도브론즈 3
핵심 알고리즘수학, 기하학, 정렬

✅ 문제 설명 요약

  • 입력: 첫째 줄에 세 막대의 길이 a, b, c가 공백으로 구분되어 주어집니다. (1 ≤ a, b, c ≤ 1,000,000,000)
  • 출력: 주어진 세 막대로 만들 수 있는 삼각형의 둘레의 최댓값을 출력합니다.
  • 규칙:
    • 삼각형을 만들기 위해 막대의 길이를 줄일 수는 있지만, 늘릴 수는 없습니다.
    • 가장 둘레가 긴 삼각형을 만들어야 합니다.

✅ 풀이 전략

이 문제는 '삼각형의 결정조건'이라는 간단한 수학 원리 하나만 알면 쉽게 해결할 수 있습니다. 둘레를 최대로 만들어야 하므로, 막대의 길이는 최대한 줄이지 않아야 합니다.

1️⃣ 핵심 원리: 삼각형의 결정조건

  • 삼각형이 만들어지려면, "가장 긴 변의 길이는 나머지 두 변의 길이의 합보다 반드시 작아야 한다"는 조건을 만족해야 합니다.
  • 세 변의 길이를 s1, s2, s3라고 하고, s3가 가장 긴 변이라고 가정하면, s3 < s1 + s2가 성립해야 합니다.
  • 만약 s3 ≥ s1 + s2라면, 세 변은 삼각형을 만들 수 없습니다.

2️⃣ 전략 수립: 가장 긴 변 조절하기

  • 둘레를 최대로 유지하려면 가장 짧은 두 변 s1, s2는 그대로 두는 것이 유리합니다.
  • 삼각형이 만들어지지 않는 유일한 이유는 가장 긴 변 s3가 너무 길기 때문입니다.
  • 따라서, 우리는 s3의 길이만 필요한 만큼 줄여서 삼각형을 만들 수 있는 최대 길이로 만들면 됩니다.

3️⃣ 경우 나누기 (Case Analysis)

  1. 세 변 정렬: 먼저 세 변의 길이를 오름차순으로 정렬하여 s1, s2, s3 (가장 긴 변)를 쉽게 찾습니다.
  2. 조건 확인: s3 < s1 + s2인지 확인합니다.
    • Case 1: 조건 만족 (이미 삼각형일 경우)
      • 주어진 막대 그대로 삼각형을 만들 수 있습니다.
      • 길이를 줄일 필요가 없으므로, 최대 둘레는 s1 + s2 + s3입니다.
    • Case 2: 조건 불만족 (삼각형이 아닐 경우)
      • 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.


✅ Java 코드 예제

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로 바꾼 후 세 변의 합을 구하면 최대 둘레가 됩니다.

profile
기록은 나의 무기, 원칙은 나의 방패

0개의 댓글