ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 1297번: TV 크기
    코딩(Coding)/백준 문제풀이 2021. 1. 6. 18:22
    728x90

    링크: https://www.acmicpc.net/problem/1297

     

    1297번: TV 크기

    첫째 줄에 TV의 대각선 길이, TV의 높이 비율, TV의 너비 비율이 공백 한 칸을 사이에 두고 주어진다. 대각선 길이는 5보다 크거나 같고, 1,000보다 작거나 같은 자연수, 높이 비율은 1보다 크거나 같

    www.acmicpc.net

     

    TV 크기

    문제

    김탑은 TV를 사러 인터넷 쇼핑몰에 들어갔다. 쇼핑을 하던 중에, TV의 크기는 그 TV의 대각선의 길이로 나타낸 다는 것을 알았다. 하지만, 김탑은 대각선의 길이가 같다고 해도, 실제 TV의 크기는 다를 수도 있다는 사실에 직접 TV를 보러갈걸 왜 인터넷 쇼핑을 대각선의 길이만 보고있는지 후회하고 있었다.

    인터넷 쇼핑몰 관리자에게 이메일을 보내서 실제 높이와 실제 너비를 보내달라고 했지만, 관리자는 실제 높이와 실제 너비를 보내지 않고 그것의 비율을 보내왔다.

    TV의 대각선 길이와, 높이 너비의 비율이 주어졌을 때, 실제 높이와 너비의 길이를 출력하는 프로그램을 작성하시오.

    입력

    첫째 줄에 TV의 대각선 길이, TV의 높이 비율, TV의 너비 비율이 공백 한 칸을 사이에 두고 주어진다. 대각선 길이는 5보다 크거나 같고, 1,000보다 작거나 같은 자연수, 높이 비율은 1보다 크거나 같고, 99보다 작거나 같은 자연수 너비 비율은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다. 너비 비율은 항상 높이 비율보다 크다.

    출력

    첫째 줄에 TV의 높이와 TV의 너비를 공백 한 칸을 이용해서 구분지은 후 출력한다. 만약, 실제 TV의 높이나 너비가 소수점이 나올 경우에는 그 수보다 작으면서 가장 큰 정수로 출력한다. (예) 1.7 -> 1


    문제접근

    해당문제는 완전 수학문제이다. 대각선이 나왔으니 물론 피타고라스의 정리를 사용하는 것이다.

    우선 나는 아래와 같이 문제를 접근하였다.

     

    피타고라스의 정리: c^2 = a^2 + b^2
    비율 h,w에 대하여 a:b = w:h(내항의 곱은 외항의 곱이 같음을 적용)

    피타고라스의 정리와 비율의 관계를 사용해서 문제를 접근했다. 

    저 비율의 외항의 곱 == 내항의 곱을 풀어보면

    a*h = b*w => a = (w*b)/h

     

    양변을 제곱하면
    a^2 = (w*b*/h)^2 = (w/h)^2 * b^2

     

    여기서 피타고라스 정리를 이용해 c^2을 b^2에 대해 정리 할 수 있다.
    c^2 = (w/h)^2 * b^2 + b^2

     

    식을 풀어보면
    b^2 = c^2 / (1+ (w/h)^2)

     

    따라서 a와 b를 구할 수 있다.
    b = (c^2 / (1+ (w/h)^2))^0.5
    a = b*w/h

     

     

    그래서 코드를 작성했는데...

    import sys
    import math
    
    def calc(inch, h, w):
        a = int(((inch**2) / (1+ (w/h)**2))**0.5)
        b = math.ceil(a*(w/h))
        return str(a)+" "+str(b)
    
    
    def main():
        inch, h, w = sys.stdin.readline().split()
        inch = int(inch); h = int(h); w = int(w)
        print(calc(inch, h, w))
    
    if __name__ == "__main__":
        main()

    위 방법은 답은 근사하게 나오나 백준에서 원하는 답은 안나오나 봄

     


    따라서 다른 방법을 생각해 봤는데...

    대각선의 비율을 구하는 것으로 접근을 바꾸어 보았다.

     

    따지고 보면 비슷하겠지만 식을 다르게 하니까 맞았다.

    대각선의 비율 r은 대각선의 길이 / (tv높이 비율 h + tv너비 비율 w)로 구할 수 있겠다.

    따라서 아래와 같은 식으로 a,b를 구할 수있다.

     

    r = (c^2 / (w^2 + h^2))**0.5
    a = h*r, b = w*r


    코드

    """
    백준 알고리즘 1297번: TV 크기
    https://www.acmicpc.net/problem/1297
    
    피타고라스의 정리: c^2 = a^2 + b^2
    비율 h,w에 대하여 a:b = w:h(내항의 곱은 외항의 곱이 같음을 적용)
    a*h = b*w => a = (w*b)/h
    a^2 = (w*b*/h)^2 = (w/h)^2 * b^2
    c^2 = (w/h)^2 * b^2 + b^2
    b^2 = c^2 / (1+ (w/h)^2)
    b = (c^2 / (1+ (w/h)^2))^0.5
    a = b*w/h
    위 방법은 답은 근사하게 나오나 백준에서 원하는 답은 안나오나 봄
    
    대각선의 비율을 구함
    r = (c^2 / (w^2 + h^2))**0.5
    a = h*r, b = w*r
    """
    import sys
    
    def calc(inch, h, w):
        r = (inch**2 / (w**2 + h**2))**0.5
        a = h*r
        b = w*r
        return int(a), int(b)
    
    
    def main():
        inch, h, w = sys.stdin.readline().split()
        inch = int(inch); h = int(h); w = int(w)
        a, b = calc(inch, h, w)
        print(a, b)
    
    if __name__ == "__main__":
        main()

    완전 수학문제여서 재미있게 풀었던거 같다.

    728x90

    댓글

Designed by black7375.