내가 생각했을때 문제에서 원하는부분
첫째 줄에 빨대의 개수 N이 주어진다.
N은 3보다 크거나 같고, 1,000,000보다 작거나 같은 자연수이다.
둘째 줄부터 N개의 줄에 빨대의 길이가 한 줄에 하나씩 주어진다.
빨대의 길이는 1,000,000보다 작거나 같은 자연수이다.
첫째 줄에 삼각형 세 변의 길이의 합의 최댓값을 출력한다.
만약 삼각형을 만들 수 없으면 -1을 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader를 사용하여 N을 입력받는다.
N개의 빨대 길이를 Integer 배열 straws에 저장한다.
Integer 배열을 사용하는 이유는 Collections.reverseOrder()를 사용하여 내림차순 정렬하기 위함이다.
Arrays.sort(straws, Collections.reverseOrder());를 사용하여 빨대 길이를 내림차순으로 정렬한다.
maxPerimeter 변수를 초기값 -1로 설정한다.
삼각형을 만들 수 없는 경우 이 값이 그대로 출력된다.
for 루프를 사용하여 정렬된 빨대 배열의 첫 번째 원소부터 순회한다.
i + 2 인덱스까지 접근해야 하므로 루프는 N - 2까지 반복한다.
각 반복에서 straws[i], straws[i + 1], straws[i + 2] 세 개의 빨대를 선택한다.
내림차순 정렬 덕분에 straws[i]가 가장 길거나 같다.
삼각형 조건 straws[i] < straws[i + 1] + straws[i + 2]를 확인한다.
만약 조건을 만족하면, 이 세 변으로 삼각형을 만들 수 있으며, 이는 현재까지 찾은 가장 큰 둘레이다 (가장 긴 변부터 확인했기 때문에).
maxPerimeter를 계산하고 break 문으로 루프를 종료한다.
루프가 종료된 후 maxPerimeter 값을 출력한다.
만약 루프 내에서 삼각형 조건을 만족하는 경우를 찾지 못했다면 maxPerimeter는 초기값인 -1 그대로 유지되어 출력된다.
BufferedReader를 닫아 자원을 해제한다.
코드로 구현
package baekjoon.baekjoon_28;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
// 백준 1448번 문제
public class Main1021 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 빨대 길이를 저장할 배열 생성
Integer[] straws = new Integer[N];
for (int i = 0; i < N; i++) {
straws[i] = Integer.parseInt(br.readLine());
}
// 빨대 길이를 내림차순으로 정렬
Arrays.sort(straws, Collections.reverseOrder());
// 가장 긴 빨대부터 3개씩 확인하며 삼각형 조건을 만족하는지 탐색
long maxPerimeter = -1; // 삼각형을 만들 수 없는 경우 -1 출력
// i, i+1, i+2 번째 빨대를 확인. 최소 3개의 빨대가 필요하므로 N-2까지 반복
for (int i = 0; i < N - 2; i++) {
// 내림차순 정렬 상태이므로 straws[i] >= straws[i+1] >= straws[i+2] 입니다.
// 삼각형 조건: 가장 긴 변의 길이 < 나머지 두 변의 길이의 합
if (straws[i] < straws[i + 1] + straws[i + 2]) {
// 삼각형 조건 만족시, 해당 세 변의 합이 최대 둘레가 됨 (그리디)
maxPerimeter = (long)straws[i] + straws[i + 1] + straws[i + 2];
break; // 가장 큰 둘레를 찾았으므로 탐색 중단
}
}
// 결과 출력
System.out.println(maxPerimeter);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.