Project Euler
- 공식 홈페이지 - projecteuler.net
- 한글 번역 - projecteuler @kr
- (HackerRank) ProjectEuler+ - hackerrank.com
Problem
- No 6 : Sum square difference
- HackerRank : Project Euler #4: Sum square difference
Simple Code
컴퓨터는 연산이 빠르기 때문에 Brute Force한 방법으로 그냥 단순히 반복문을 통해 다 더하여 답을 구할 수도 있다.
def sum_of_num(n): |
하지만 조금이라도 효율적인 성능을 이끌어 내기 위해서는 수식을 이용한 풀이가 더 적당할 것 같다.
n까지의 단순 합은 n(n+1)/2와 같고
n까지의 제곱 합은 (2n+1)(n+1)n/6과 같다.
def sum_of_num(n): |
제곱의 합 공식
Simple Code
최소 공배수를 찾는 문제이다.
최대 공약수, 최소 공배수를 찾을 때 유클리드 호제법을 응용한 유클리드 알고리즘을 사용하면 쉽다.
def gcd(a, b): |
테스트 케이스 입력 받는 부분만 추가해 주면 된다.
def gcd(a, b): |
유클리드 호제법을 잘 이해하고 있다면 쉽게 풀 수 있는 문제이다.
Simple Code
세자리 수 중 가장 큰 999부터 하나씩 곱해가며 가장 큰 수를 구한다.
큰 숫자 중 문자열 비교를 통해 숫자가 대칭인지 확인한다.
def largest_palindrome_product(): |
HackerRank 문제에서는 정수 N을 입력 받아 해당 정수보다 작은 palindrome number를 출력해야 한다.
그래서 리스트에 저장하고 역순으로 정렬하여 반복문을 통해 조건을 확인하는 방식으로 작성했다.
def largest_palindrome_product(): |
palindrome number의 자리수가 짝수일 때, 11로 나누어 떨어진다.
예를 들어 a, b, c가 정수이고 a != 0 일 때,
N(6, a, b, c) = 100001 * a + 10010 * b + 1100 * c
= abccba = 11 * (9091 * a + 910 * b + 100 * c)
N(8, a, b, c,d) = 10000001 * a + 1000010 * b + 100100 * c + 11000 * d
= abcddcba = 11 * (909091 * a + 90910 * b + 9100 * c + 1000 * d)
임을 확인할 수 있다.
주의할 것은 해당 문제에서 세자리 수 2개를 곱한 값의 자리수가 꼭 짝수는 아니다.
예를 들어,
777 * 117 = 90909 (5자리)
812 * 104 = 84448 (5자리)
813 * 123 = 99999 (5자리)
이러한 palindrome number는 11로 나누어지지 않는다.
어쨌든 최대값을 구하는 것이기 때문에 위 내용을 활용해서 조금 더 최적화 시킬 수 있는데 아래의 링크에서 자세히 설명되어 있다.
Project Euler 4 Solution: Largest palindrome product