2021. 12. 1. 10:46ㆍAlgorithm/BOJ
https://www.acmicpc.net/problem/4153
4153번: 직각삼각형
입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.
www.acmicpc.net
문제

과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.
입력
입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.
출력
각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.
예제 입력 1
6 8 10
25 52 60
5 12 13
0 0 0
예제 출력 1
right
wrong
right
해설
일단 N개의 테스트 케이스 받는다는 말도 없고 0 0 0을 입력받고 출력을 안나오는 것을 보니 이 문제는 무한 루프문에서 0 0 0을 받았을 때 break가 걸어줘야 한다는 것을 알 수 있다.
직각삼각형의 조건은 피타고라스의 정리를 생각하면 된다. c가 빗변일때,
$$ a^2+b^2=c^2 $$
위 식이 적용되고, 어떤 변이 빗변인지 모르니 세개의 케이스 별로 검사해서 right인지 wrong인지 판별한다.
while True:
a,b,c = map(int,input().split())
flag = False
if a == 0 and b == 0 and c == 0:
break
if a**2 == b**2+c**2:
flag = True
if b**2 == a**2+c**2:
flag = True
if c**2 == a**2+b**2:
flag = True
if flag:
print("right")
else:
print("wrong")
하지만 위에 코드처럼 모든 케이스를 제곱해서 판별할 필요는 없다.
빗변은 항상 양 변보다 크기 때문에 (c>a, c>b)
세 값중에 제일 길이가 큰 값을 빗변으로 가정하고 판별하면 된다.`
while True:
l = list(map(int,input().split()))
c = max(l) #리스트의 최댓값을 빗변으로 둠
if c == 0: # 최댓값이 0이면 나머지도 0이므로 최댓값이 0일때 break
break
l.remove(c) #리스트에서 최댓값을 빼낸다.
if c**2 == l[0]**2+l[1]**2: #피타고라스의 정리로 판별
print("right")
else:
print("wrong")
코드 길이도 반으로 줄고 더 효율적으로 짤 수 있게 됬다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]2292번 벌집(Python) (0) | 2021.12.20 |
---|---|
[BOJ] 2231 분해합(Python) (0) | 2021.12.14 |
[BOJ] 10250번 ACM호텔(Python) (1) | 2021.12.01 |
[BOJ] 1085번, 직사각형에서 탈출(Python) (0) | 2021.11.30 |
[BOJ]1003번, 피보나치 함수(Python) (0) | 2021.10.30 |