백준 10101번 풀이

문제

삼각형의 각 세 개를 통해 이게 뭔 삼각형인지 판단하는 문제.

풀이

일단 삼각형을 분류하는 방식은 변의 길이와 각에 따라 다른데 변의 길이에 따라서는 정삼각형, 이등변삼각형, 그냥 삼각형이 있고 각도에 따라서는 예각삼각형, 둔각삼각형, 직각삼각형이 있다. 백준 패턴상 각으로 분류하는거 나중에 나오니까 일단 변에 따른 분류만 설명하자면 정삼각형은 세 변이 모두 같은 삼각형, 이등변삼각형은 세 변 중 두 변만 같은 삼각형이다.

import sys

A = int(sys.stdin.readline())
B = int(sys.stdin.readline())
C = int(sys.stdin.readline())

입력 정직하게 세 개 들어온다.

import sys

A = int(sys.stdin.readline())
B = int(sys.stdin.readline())
C = int(sys.stdin.readline())

angle_sum = A + B + C
angle_list = []

angle_list.append(A)
angle_list.append(B)
angle_list.append(C)
print(angle_list)

if angle_sum != 180:
    print('Error')
elif len(set(angle_list)) == 1:
    print('Equilateral')
elif len(set(angle_list)) == 2:
    print('Isosceles')
else: 
    print('Scalene')

처음에는 에러 먼저 하고 나머지 했는데 이거 틀렸음… set은 왜 나왔냐고? 밑에서 설명해드림.

import sys

A = int(sys.stdin.readline())
B = int(sys.stdin.readline())
C = int(sys.stdin.readline())

angle_sum = A + B + C
angle_list = []

angle_list.append(A)
angle_list.append(B)
angle_list.append(C)

if len(set(angle_list)) == 1:
    print('Equilateral')
elif (angle_sum == 180) and (len(set(angle_list)) == 2):
    print('Isosceles')
elif (angle_sum == 180) and (len(set(angle_list)) == 3):
    print('Scalene')
else: 
    print('Error')

이거 맞았다.

그럼 이제 대체 set()이 왜 갑툭튀했는지에 대해 먼저 말씀을 드려야 할 것 같은데… 파이썬의 set은 집합 자료형이다. 얘는 리스트나 튜플이랑 달리 중복을 허락하지 않는데, 그래서 리스트에 중복된 요소가 있을 때 이걸 set으로 바꾸게 되면 중복된걸 다 쳐버린다. 즉, 정삼각형은 세 꼭지점의 각이 모두 같기때문에 set으로 변환하면 중복 두개를 쳐내서 길이가 1이 된다. 이등변삼각형은 두 변의 길이가 같기때문에 각도 두개가 같고, 여기서 하나를 쳐내서 set으로 변환하면 길이가 2가 된다. 그냥 삼각형은 세 각이 다 다르기때문에 쳐낼 게 없다.