# 백준 1448. 삼각형 만들기

문제 링크

난이도 정답률(_%)
Silver 3 45.445%

# 설계

  • 총 빨대의 개수 N 1,000,000
  • 처음엔 완탐을 생각했는데 빨대의 개수가 너무 많아서 불가능하다고 판단했다.
  • 그러다 정렬해서 뒤부터 찾으면 어떨까라고 생각했고, 삼각형의 조건(가장 긴변 < 나머지 변의 합)을 생각해보니 순서대로 3개가 삼각형에 성립하지 않았다면 그 이하의 변의 조합에서는 성립할 수 없기 때문에 나머지 2개 변의 조합은 탐색할 필요가 없다는 것을 알았다.

예를 들어 빨대가 5개가 있을 때, index (5, 4, 3)이 삼각형 조건에 성립하지 않았다면 index (5, 4, 2)는 성립할 수 없다. 정렬된 상태이기 때문에 index 2가 index 3보다는 값이 작거나 같을 수 밖에 없기 때문이다.

# 시간 복잡도

  • 정렬: O(NlogN)
  • 탐색: O(N)
  • O(NlogN) + O(N)..?

# 공간 복잡도

  • 빨대의 개수 만큼 int형 배열 O(N)

# 풀이

  • 빨대들의 길이를 정렬한다.
  • 뒤부터 순서대로 i, i-1, i-2를 뽑아서 삼각형이 되면 그 총 합을 출력, 끝까지 찾지 못하면 -1을 출력한다.

# 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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));

        int strawNumber = Integer.parseInt(br.readLine());
        int[] straws = new int[strawNumber];

        for (int i = 0; i < strawNumber; i++) {
            straws[i] = Integer.parseInt(br.readLine());
        }

        bw.write(String.valueOf(findMaxTriangle(strawNumber, straws)));

        bw.flush();
        bw.close();
    }

    public static int findMaxTriangle(int strawNumber, int[] straws) {
        Arrays.sort(straws);

        for (int i = strawNumber - 1; i > 1; i--) {
            if (canTriangle(straws[i], straws[i - 1], straws[i - 2])) {
                return straws[i] + straws[i - 1] + straws[i - 2];
            }
        }

        return -1;
    }

    public static boolean canTriangle(int a, int b, int c) {
        if (a < b + c) {
            return true;
        }

        return false;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Last Updated: 1/3/2021, 2:26:34 PM