-
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