문제
https://www.acmicpc.net/problem/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를 예시로 들자면, 나머지 두 변을 합치면 제일 긴 변이랑 같기때문에 삼각형이 안된다.
'BOJ > [BOJ] Python' 카테고리의 다른 글
백준 24262번 풀이 (0) | 2023.07.03 |
---|---|
백준 14215번 풀이 (0) | 2023.06.30 |
백준 10101번 풀이 (0) | 2023.06.27 |
백준 9063번 풀이 (0) | 2023.06.26 |
백준 15894번 풀이 (0) | 2023.06.25 |