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

2021. 12. 1. 10:46Algorithm/BOJ

 

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")

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

'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