[JAVA] 백준 14215. 세 막대

이 글은 읽는데 약 3분이 걸립니다.

※개인 공부 목적의 정리글입니다.
이 글의 내용이 최선의 해답은 아닐 수 있습니다.

문제

영선이는 길이가 a, b, c인 세 막대를 가지고 있고, 각 막대의 길이를 마음대로 줄일 수 있다.

영선이는 세 막대를 이용해서 아래 조건을 만족하는 삼각형을 만들려고 한다.

  • 각 막대의 길이는 양의 정수이다
  • 세 막대를 이용해서 넓이가 양수인 삼각형을 만들 수 있어야 한다.
  • 삼각형의 둘레를 최대로 해야 한다.

a, b, c가 주어졌을 때, 만들 수 있는 가장 큰 둘레를 구하는 프로그램을 작성하시오. 

입력

첫째 줄에 a, b, c (\(1 ≤ a, b, c ≤ 100\))가 주어진다.

출력

첫째 줄에 만들 수 있는 가장 큰 삼각형의 둘레를 출력한다.

요약

삼각형의 변의 길이 조건을 알고 있어야한다.

삼각형이 되기 위해서는 가장 긴 변이 나머지 두 변의 합보다 작아야한다.
즉, 세 변 A, B, C 중 가장 긴 변을 C라 하면 \(C < A + B\) 여야 한다는 뜻이다.

문제에서 길이를 줄이는 것이 가능하다고 했으므로 어떤 변의 길이를 줄여서 조건에 맞게 만들면 된다

정답코드

public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String[] input = br.readLine().split(" ");
        
    int A = Integer.parseInt(input[0]);
    int B = Integer.parseInt(input[1]);
    int C = Integer.parseInt(input[2]);
    int[] s = {A, B, C};
    Arrays.sort(s);
        
    if(s[0]+s[1] > s[2]){
        System.out.println(A+B+C);
    }else{
        System.out.println((s[0]+s[1]) * 2 - 1);
    }
        
    br.close();
}

먼저 세 변의 길이를 입력받아서 정렬하기 위해 배열로 만든 후, Arrays.sort()메소드로 정렬한다.
이렇게 되면 인덱스 2의 값이 가장 긴 변의 길이일 것이다.

먼저 나머지 두 변의 길이의 합이 가장 긴 변의 길이보다 큰지 확인한다. 만약 참이면 길이를 조정할 필요 없이 바로 둘레를 출력한다.

아니면 둘레를 계산해야된다. 변의 길이를 반복문으로 돌리면 1씩 줄이며 계산할 수도 있겠지만, 더 간단한 방법이 있다.

C는 결국 A+B보다 작아야하되, 둘레는 최대여야하므로, C의 길이를 최소한으로 줄였을 때의 길이를 찾아야한다.
즉, C의 길이를 A+B보다 1작게 만들면 되는 것이다.

그렇게 하면 둘레는 다음과 같이 계산 되겠다

\(A + B + C=\\
A + B + (A + B-1)=\\
(A+B) \times 2-1\)

댓글