[백준 문제 풀이] 5073번 삼각형과 세 변

Junu Kim·2025년 12월 14일
post-thumbnail

[5073] 삼각형과 세 변

난이도: ★☆☆☆☆ • solved on: 2025-12-14


문제 요약

  • 문제 유형: 구현, 조건 분기
  • 요구사항: 세 변의 길이가 주어질 때, 삼각형이 될 수 있는지 판단하고 Equilateral / Isosceles / Scalene / Invalid 중 하나를 출력해야 한다. 0 0 0이 입력되면 종료해야 한다.

사용 개념

  1. 자료구조

    • int[] : 세 변을 배열로 관리
  2. 알고리즘/기법

    • 정렬(sort) 또는 최댓값/최솟값 찾기
    • 조건 분기(if-else)
  3. 핵심 키워드

    • 삼각형 성립 조건(triangle inequality): a + b > c (정렬 후)

풀이 아이디어 및 코드

방법 1 : 문자열 배열 스왑으로 3개 값 정렬 후 분기

  1. 문제 분해
  • 입력을 한 줄씩 읽고 0 0 0이면 종료
  • 3개의 값을 비교/스왑해서 오름차순 비슷하게 정리
  • 삼각형 성립 여부 판단 → 종류 출력
  1. 핵심 로직 흐름

    while not (0 0 0):
        swap 비교로 3개를 정렬에 가깝게 만들기
        min, middle, max로 분리
        if (min + middle <= max) -> Invalid
        else if (모두 같음) -> Equilateral
        else if (둘만 같음) -> Isosceles
        else -> Scalene
  2. 예외 처리

    • 종료 조건 0 0 0
import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] lines =  sc.nextLine().split(" ");

        while(!(lines[0].equals("0")&&lines[1].equals("0")&&lines[2].equals("0"))) {

            if(Integer.valueOf(lines[0]).compareTo(Integer.valueOf(lines[1])) > 0) {
                String tmp = lines[0];
                lines[0] = lines[1];
                lines[1] = tmp;
            }
            if(Integer.valueOf(lines[1]).compareTo(Integer.valueOf(lines[2])) > 0) {
                String tmp = lines[1];
                lines[1] = lines[2];
                lines[2] = tmp;
            }
            if(Integer.valueOf(lines[0]).compareTo(Integer.valueOf(lines[2])) > 0) {
                String tmp = lines[0];
                lines[0] = lines[2];
                lines[2] = tmp;
            }

            int min = Integer.valueOf(lines[0]);
            int middle = Integer.valueOf(lines[1]);
            int max = Integer.valueOf(lines[2]);

            if(min + middle <= max || max < middle - min) {
                System.out.println("Invalid");
            } else {
                if(min==middle&&max==middle) {
                    System.out.println("Equilateral");
                } else if(min==middle||max==middle||min==max){
                    System.out.println("Isosceles");
                } else {
                    System.out.println("Scalene");
                }
            }

            lines = sc.nextLine().split(" ");
        }
    }
}

방법 2 : 입력을 int[]로 처리하기

  1. 정렬을 직접 구현하지 않고 라이브러리로 처리
  • int[] sides = {a,b,c}; Arrays.sort(sides);
  • 정렬 후 sides[0] + sides[1] > sides[2]만 보면 됨.
  1. 입력 안정성/속도 개선

    • Scanner 대신 BufferedReader + StringTokenizer
    • 한 줄씩 읽다가 0 0 0이면 break
  2. 불필요한 조건 제거

    • 정렬을 하면 max < middle - min 같은 조건은 의미가 없어집니다. (이미 min ≤ middle ≤ max)
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            String line = br.readLine();
            if (line == null) break;

            StringTokenizer st = new StringTokenizer(line);
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());

            if (a == 0 && b == 0 && c == 0) break;

            int[] sides = {a, b, c};
            Arrays.sort(sides); // sides[0] <= sides[1] <= sides[2]

            int x = sides[0], y = sides[1], z = sides[2];

            if (x + y <= z) {
                System.out.println("Invalid");
            } else if (x == y && y == z) {
                System.out.println("Equilateral");
            } else if (x == y || y == z) {
                System.out.println("Isosceles");
            } else {
                System.out.println("Scalene");
            }
        }
    }
}

시간·공간 복잡도

  • 방법 1

    • 시간 복잡도: O(1) (3개 비교/스왑 + 분기)
    • 공간 복잡도: O(1)
  • 방법 2

    • 시간 복잡도: O(1) (길이 3 정렬은 상수)
    • 공간 복잡도: O(1)

어려웠던 점

  • 처음 받은 3개 값에서 최대/최소를 어떻게 안정적으로 잡을지 (정렬을 어떻게 할지) 고민이 많았다.

배운 점 및 팁

  • 값이 3개처럼 아주 작아도, “정렬이 필요하다”면 표준 정렬(Arrays.sort) 을 쓰는 편이 실수 여지가 줄어든다.
  • 정렬 후에는 삼각형 판정이 a + b > c 한 줄로 정리되어 조건이 깔끔해진다.
  • 입력 줄 반복 처리 문제에서는 BufferedReader가 예외 상황(EOF 등)에도 더 안정적이다.

참고 및 링크


추가 연습 문제

profile
생각이 현실이 될 수 있도록 노력하는 중입니다.

0개의 댓글