문제
https://www.acmicpc.net/problem/10101
삼각형의 세 각을 입력받아, 아래와 같이 조건에 따라 정해진 문자열을 출력하라.
- 세 각의 크기가 모두 60인 경우 : Equilateral
- 세 각의 합이 180이고 두 각이 같은 경우 : Isosceles
- 세 각의 합이 180이고 같은 각이 없는 경우 : Scalene
- 세 각의 합이 180이 아닌 경우 : Error
풀이
조건문만 다룰 줄 안다면 해결할 수 있는 간단한 문제다. 이 글에서는 조건문을 이용한 방법 외에도 다른 방법으로 해결한 코드도 함께 정리한다.
1. 조건문 이용
세 개의 숫자에서 같은 값이 있는지를 따져볼 때에는, 정렬한 숫자 목록의 중간값에 해당하는 값(가운데에 위치한 숫자)이 몇 개인지 확인하면 판단할 수 있다.
import sys
li = [int(sys.stdin.readline()) for _ in range(3)]
li.sort()
if sum(li) != 180:
print("Error")
else:
if li.count(li[1]) == 3:
print("Equilateral")
elif li.count(li[1]) == 2:
print("Isosceles")
else:
print("Scalene")
또한 숫자 세 개의 합이 180이면서 숫자 세 개가 모두 같은 값인 경우의 수는 유일하다. 따라서 Equilateral의 경우에는 각이 60인지 별도로 확인하지 않을 수 있다.
2. 배열 인덱스 이용
출력할 문자열을 선택할 때 조건문이 아니라, 배열의 인덱스를 활용한 방법이다. 조건을 일일이 나열하지 않아 좀 더 간결한 방식이다.
출력할 문자열을 선택하는 방법은 조건문을 사용할 때와 같이 정렬한 숫자의 가운데 숫자의 개수 활용한다.
import sys
li = [int(sys.stdin.readline()) for _ in range(3)]
li.sort()
if sum(li) != 180:
print("Error")
else:
print(["", "Scalene", "Isosceles", "Equilateral"][li.count(li[1])])
3. Inline if-else 표현식 사용
하나의 print 문으로 모든 경우에 대해 출력할 수 있도록 if-else문을 print문 내의 Inline if-else 표현식으로 변경할 수 있다.
import sys
li = [int(sys.stdin.readline()) for _ in range(3)]
li.sort()
print("Error" if sum(li) != 180 else ["", "Scalene", "Isosceles", "Equilateral"][li.count(li[1])])