백준 | 삼각형과 세 변

justhaza.log·2024년 8월 1일

알고리즘: BOJ

목록 보기
67/125

백준 삼각형과 세 변 문제 풀이이다.


삼각형의 세 변의 길이가 주어질 때, 세 변의 관계에 맞는 정의를 출력하는 문제이다.


총 5가지 경우가 있는데, 아래와 같은 순서로 분기 처리했다.

먼저 프로그램 종료 조건인, 세 변의 길이가 모두 0으로 주어지는 경우를 처리했다.

그리고 삼각형이 만들어질 수 없는 경우(가장 긴 변의 길이가 나머지 두 변의 길이의 합과 같거나 큰 경우)를 처리했다.

이제 삼각형이 만들어질 수 있는 경우만 남았는데, 아래의 순서로 처리했다.

[1] 세 변의 길이가 모두 같은 경우(Equilateral)
[2] 두 변의 길이만 같은 경우(Isosceles)
[3] 세 변의 길이가 모두 다른 경우(Scalene)


코드(정답)는 다음과 같다.

import sys


while True:
    sides = list(map(int, sys.stdin.readline().split()))
    sides.sort()

    # 종료 조건
    if sides.count(0) == 3:
        break

    # 삼각형의 조건을 만족하지 못하는 경우
    if sides[0] + sides[1] <= sides[2]:
        print("Invalid")
    # 세 변의 길이가 모두 같은 경우
    elif sides[0] == sides[1] and sides[1] == sides[2]:
        print("Equilateral")
    # 두 변의 길이만 같은 경우
    elif sides[0] == sides[1] or sides[1] == sides[2]:
        print("Isosceles")
    # 세 변의 길이가 모두 다른 경우
    else:
        print("Scalene")


파이썬은 체인드 비교(chain comparison)가 지원되기 돼서 이를 활용하면 더 직관적인 풀이가 가능하다.

체인드 비교를 쓰면 'sides[0] == sides[1] and sides[1] == sides[2]'와 같은 조건을 'sides[0] == sides[1] == sides[2]'로 쓸 수 있다.

이는 왼쪽부터 오른쪽으로 순차 평가되며, 각각의 비교가 모두 참이 되어야 전체가 참이 된다.

참고로 등호(=)뿐만 아니라 다양한 연산자(<, >, <=, >=)도 사용 가능하다.


체인드 비교를 사용한 코드는 다음과 같다.

import sys


while True:
    sides = list(map(int, sys.stdin.readline().split()))
    sides.sort()

    # 종료 조건
    # count(), sum()의 시간 복잡도는 O(n)으로 동일
    if sum(sides) == 0:
        break

    # 삼각형의 조건을 만족하지 못하는 경우
    if sides[0] + sides[1] <= sides[2]:
        print("Invalid")
    # 세 변의 길이가 모두 같은 경우
    elif sides[0] == sides[1] == sides[2]:
        print("Equilateral")
    # 두 변의 길이만 같은 경우
    elif sides[0] == sides[1] or sides[1] == sides[2]:
        print("Isosceles")
    # 세 변의 길이가 모두 다른 경우
    else:
        print("Scalene")
profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글