ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 4153번 - 직각 삼각형(Python)
    Algorithm(in Python) 2023. 4. 12. 14:43

    4153번 문제는 중학 수학에서 다루는 '피타고라스 정리'를 이용해 삼각형이 직각삼각형인지, 아닌지를 구하는 문제이다. 

    * 파이썬으로 머리 아프게 코딩한 경험이 너무 오래되어서 이번 스터디를 시작하며 '재활 운동' 겸 쉬운 문제부터 시작하게 되었는데, 이 문제는 브론즈 3 티어 문제다... 굉장히 쉽다는 거(상대적) 

    아무튼 

     

     

     

    입출력 형태

    문제 입력으로는 세 숫자 값(변의 길이)을 스페이스로 구분해서 받고, '0 0 0'이 입력되면 실행을 멈춘다. 

     

    def sqr(i,j,k):		# 세 변의 값을 입력받음 - i가 가장 긴 변의 길이
        cul = i**2 == (j**2 + k**2)		# cul - 직각삼각형인지 아닌지 판단(cul의 값은 0 혹은 1)
        if(cul):		# 직각삼각형이 맞을 때(cul 값이 1)
            print("right")
        else:			# 직각삼각형이 아닐 때(cul 값이 0)		
            print("wrong")

    먼저 피타고라스 정리를 통해(가장 긴 변의 제곱이 나머지 변의 제곱의 합과 같은지) cul 값이 0 혹은 1로 정해진다. 

    아래 if문을 통해 직각삼각형이 맞으면 right, 아니면 wrong을 출력하도록. 비교를 두번 수행하기 때문에 코드가 불필요하게 중복되는 게 싫어서 함수를 만들었다. (아마 함수를 배운 누구든 똑같은 코드를 복붙하고 싶진 않을 것...)

     

    while(a!=0 and b!=0 and c!=0): 
        a, b, c = map(int, input().split())	# 세 변의 값 입력 
        
        if (a==0 and b==0 and c==0):	# (0,0,0) 값이 입력되면 종료(break 수행)
            break 
        
        if(a>b):					# a가 b보다 큰 경우 -> (1차 승자)
        
            if(a>c):				# a가 가장 큰 값인 경우 -> (2차 승자)
                sqr(a,b,c)
                
            else:					# c가 가장 큰(크거나 같은) 값인 경우 -> (2차 승자)
                sqr(c,a,b)
                
        else:						# b가 a보다 큰(크거나 같은) 경우 -> (1차 승자)
        
            if(b>c):				# b가 가장 큰 값인 경우 -> (2차 승자)
                sqr(b,a,c)
                
            else:					# c가 가장 큰(크거나 같은) 값인 경우 -> (2차 승자)
                sqr(c,a,b)

    삼각형의 세 변에서 각 변의 길이에 대한 1,2,3위를 구하는 게 아니고 가장 긴 길이의 값만 구하는 것이기 때문에 부전승이 존재하는 3명의 가위바위보에서 승자를 구해내는 것처럼 처음에 두 수의 대소를 비교하고, 큰 수와 나머지 (비교 연산에 포함되지 않은; c) 수를 비교해서 가장 큰 수를 구해서 위에서 만든 함수를 적용해주는 방식으로 코드를 작성했다. 

    a,b,c 값을 입력받을 때 map 함수를 통해 3가지 수를 입력받고, split 함수로 각각의 수를 분리해준 다음 int형으로 각 변수에 입력했는데 처음에 코드를 작성할 때 아마 split 함수가 기본 값으로 공백을 통해 수를 구분한다는 것을 까먹고(...) 괄호 안에 잘못된 값을 입력했다가 출력 오류(...)가 떠서 억울했지만 다른 스터디원의 피드백 덕분에 해결했다...! 

    아무튼

    되더랍니다... 

    난이도 조절을 잘못한 거 같아서 다음 주차부턴 실버 레벨의 문제 위주로 풀이를 해야겠다는 생각이 들었다 

    끝 

     

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

    댓글