Algorithm/BOJ

[BOJ]4153 직각삼각형[Python]

강승원 2021. 12. 1. 10:46

 

https://www.acmicpc.net/problem/4153

 

4153번: 직각삼각형

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

www.acmicpc.net

문제

출처: 백준 4153번

과거 이집트인들은 각 변들의 길이가 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")

코드 길이도 반으로 줄고 더 효율적으로 짤 수 있게 됬다.