백준 5073번 풀이

문제

세 변의 길이를 토대로 어떤 삼각형인지 판별하기

풀이

예각둔각은 안하나배… 아무튼 이번에는 변의 ‘길이’로 삼각형을 판별하는 문제다. 전에는 각이었음.

import sys

while True:
    byeon = list(map(int,sys.stdin.readline().split()))
    if sum(byeon) == 0:
        break
    byeon.sort(reverse=True)
    # 변 리스트 정렬
    if byeon[0] >= byeon[1] + byeon[2]:
        print('Invalid')
    elif byeon[0] == byeon[1] == byeon[2]:
        print('Equilateral')
    elif (byeon[0] == byeon[1]) or (byeon[1] == byeon[2]):
        print('Isosceles')
    else:
        print('Scalene')

일단 이 문제, 4153번 풀이를 응용했다. 얘는 각도 문제처럼 Invalid가 밑으로 가면 안되고 반드시 Invalid 조건이 위로 와야 한다. 안그러면 로직 조져요. 아무튼 저 리스트와 소트는 왜 와있나… 저 리버스는 뭐냐… 이제 설명 들어갑니다. 잘 따라오십쇼.

일단 배열이 왜 들어왔냐면 삼각형의 부등식으로 이게 삼각형인지 판별할 때는 제일 긴 변과 나머지 두 변이 필요하다. 근데 문제 예시를 보면 아시겠지만(직각삼각형 풀었던 분들도 아시겠지만) 절대 맨 먼저 오는 놈이 제일 긴 변이라는 보장이 없다. 그래서 정렬을 해야 하는데 정수형으로 들어온건 정렬이 안되니까 리스트에 때려박은 것.

그럼 이제 sort와 리스트에 대한 비밀은 풀렸고, 저 리버스는 뭐냐면 배열을 ‘내림차순’으로 정렬한다는 얘기다. 그냥 sort를 쓰면 오름차순이 되는데, 이렇게 되면 제일 긴 변이 뒤로 가게 된다. 긴 변이 뒤에 있는데 부등식 순서가 0 >= 1 + 2면 로직 다꼬입니다. 죄다 인밸리드 떠요. 그래서 걍 내림차순 때렸다. .sort()는 기본적으로 오름차순이고, .sort(reverse=True)로 하면 내림차순.

이등변삼각형의 경우도 배열이기때문에 조건이 더 간소화된 케이스인데, 정렬된 리스트이기때문에 앞에 두 개가 같거나(0, 1) 뒤의 두 개가 같거나(1, 2) 둘 중 하나밖에 없다.

import sys

while True:
    byeon = list(map(int,sys.stdin.readline().split()))
    if sum(byeon) == 0:
        break
    byeon.sort()
    # 변 리스트 정렬
    if byeon[2] >= byeon[1] + byeon[0]:
        print('Invalid')
    elif byeon[0] == byeon[1] == byeon[2]:
        print('Equilateral')
    elif (byeon[0] == byeon[1]) or (byeon[1] == byeon[2]):
        print('Isosceles')
    else:
        print('Scalene')

오름차순 정렬로 하면 제일 긴 변이 뒤로 가기때문에 2 >= 1 + 0이 된다. (뒤에 1 0은 순서 바꿔도 상관 없다) 아, 그리고 중요한거 하나. Invalid 조건에 >=가 들어가야 맞는다. 5 3 2를 예시로 들자면, 나머지 두 변을 합치면 제일 긴 변이랑 같기때문에 삼각형이 안된다.