백준 삼각형과 세 변 문제 풀이이다.
삼각형의 세 변의 길이가 주어질 때, 세 변의 관계에 맞는 정의를 출력하는 문제이다.
총 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")