ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2090. [Python]조화 평균
    Python_알고리즘/Silver IV 2023. 5. 14. 22:29

    1. 문제

     

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

     

    2090번: 조화평균

    N개의 수 A[1], …, A[N]의 조화평균은 1/(1/A[1] + 1/A[2] + … + 1/A[N]) 으로 정의된다. 즉, 각각의 수들을 뒤집어서(분모와 분자) 모두 더한 뒤, 그 값을 다시 뒤집는 것이다. 예를 들어 1, 2, 4의 조화평균

    www.acmicpc.net

     

    2. 접근 방법

     

    • 시간 제한: 2초
    • 메모리 제한: 128MB
    • Math 함수 ( 유클리드 호제법도 가능 )

     

    3. 파이썬 코드

     

    import math
    # 리스트의 최소공배수를 구하는 함수
    def euclid(nums):
        lcm = nums[0]
        check = 1
        for i in range(check,len(nums)):
            lcm = math.lcm(lcm,nums[i])
        return lcm
    
    N = int(input())
    num_list = list(map(int,input().split()))
    # N값이 1인경우 그냥 수를 뒤집어주기만 하면된다.
    if N == 1:
        print(num_list[-1],end="")
        print("/",end="")
        print(1)
    # 그 외의 경우
    else:
        # 최소공배수를 함수를 통해서 구한다.
        lcm = euclid(num_list)
        total = 0
        # 리스트를 반복해가며 최소공배수를 i값으로 나눠가며 값을 더해준다.
        for i in num_list:
            middle_value = lcm//i
            total += middle_value
        # 모두 계산을 끝냈을 경우 총합과 최소공배수가 나눠 떨어지는지 확인
        gcd = math.gcd(total,lcm)
        # 둘의 최대공약수를 나눠준다.
        lcm = lcm//gcd
        total = total//gcd
        print(lcm,end="")
        print("/",end="")
        print(total)

     

    • 틀렸던 코드

     

    더보기
    import math
    
    def euclid(nums):
        lcm = nums[0]
        check = 1
        for i in range(check,len(nums)):
            lcm = math.lcm(lcm,nums[i])
        return lcm
    
    N = int(input())
    num_list = list(map(int,input().split()))
    if N == 1:
        print(num_list[-1],end="")
        print("/",end="")
        print(1)
    else:
        lcm = euclid(num_list)
        total = 0
        for i in num_list:
            middle_value = lcm//i
            total += middle_value
        print(lcm,end="")
        print("/",end="")
        print(total)

     

    4. 문제를 풀고난 후 생각

     

    • 들어온 수들의 최소 공배수를 구한 후 최소공배수를 값들로 나눈 몫을 더해주면 문제가 해결된다고 생각했다.
    • 이후 출력하는 방법만 내가 조절해주면 해결된다고 생각하여 문제를 구현헀지만 40%정도에서 계속해서 틀린 값이 나와서 왜 틀렸는지 고민을 많이헀다.
    • 틀린 코드와 정답인 코드의 차이는 모든 값을 구한 후 그 값들이 약분이 되는지 안되는지 확인을 해준 것 밖에 없다.
    • 값들이 각각 나온 후 마지막으로 두 값들의 최대공약수를 구하여 그 값들이 나누어 떨어지는 값인지 아닌지 판단하여 계산까지 해준 후 답을 출력하면 문제가 해결된다.

     

    ex)

    3

    2 3 6

    값들이 input으로 들어올 경우 1/2 + 1/3 + 1/6 을 구해야 한다. 이 결과로는 6/6 이 나오게 되며 아래 틀린코드에서는 6/6 을 출력하지만 위의 정답코드에서는 약분처리를 해줘서 1/1 로 출력한 결과를 내준다.

     

     

    5. 문제를 푸는데 도움이 되는 지식

     

    • 유클리드 호제법
    • 최대공약수 최소공배수
    • Math 함수

    'Python_알고리즘 > Silver IV' 카테고리의 다른 글

    1057. [Python]토너먼트  (2) 2023.05.16
    1544. [Python]사이클 단어  (0) 2023.05.15
    1758. [Python]알바생 강호  (0) 2023.05.11
    1487. [Python]물건 팔기  (0) 2023.05.04
    1388. [Python]바닥 장식  (0) 2023.05.03

    댓글

Designed by Tistory.