2017년 5월 12일 금요일

Project Euler - 004(Largest palindrome product)

Project Euler - 004(Largest palindrome product)

사이트

문제

영문
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
한글
앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.
두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.
세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?

풀이과정

이번 문제는 좀 어려웠다.
대칭수를 구하는 부분에서 어떻게 해야하나 많은 고민을 했다.
처음에는 리스트를 이용해 역순정렬을 하려고 했지만, 문자열을 바로 역순으로 보여주는 문법이 있어 이를 응용했다.
(자세한 자료는 아래 참고사이트에서 확인)

내가 푼 답안

# 대칭수를 찾기 위한 함수 
def palindrome(num):
    # 넘어온 굿자를 문자열화 시킨다.(숫자는 안되기 때문...) 
    num_str = str(num)
    #print("구하고자 하는 수 : ", num_str) 
    # 대칭수인지 아닌지 판별을 위해 문자를 뒤집는다. 
    num_str_reverse = num_str[::-1]
    #print("문자를 뒤집는다. : ", num_str_reverse) 
    if num_str==num_str_reverse:
        #print("%d 는 대칭수 입니다." %num) 
        return True
    else:
        #print("%d 는 대칭수가 아닙니다." %num) 
        return False
# palindrome(9009) 
def main(n1, n2):
    lst = [0, 0, 0]
    for x in range(1n1+1):
        for y in range(1n2+1):
            num = x * y
            if palindrome(num)==True and lst[0] < num:
                lst[0] = num
                lst[1] = x
                lst[2] = y
    return lst
print("두자리 수의 곱 중 가장 큰 대칭 수 구하기")
num = main(9999)
print("대칭수 : %d\n1번수 : %d\n2번수 : %d" % (num[0]num[1]num[2]))
print("===" * 50)
print("세자리 수의 곱 중 가장 큰 대칭 수 구하기")
num = main(999999)
print("대칭수 : %d\n1번수 : %d\n2번수 : %d" % (num[0]num[1]num[2]))

참고사이트

#Project_Euler #question4 #프로젝트_오일러 #python3 #Largest_palindrome_product #palindrome #StackOverflow #reverse #Extended_Slices

임을위한행진곡(원곡)

2017년 5월 3일 수요일

Project Euler - 003

Project Euler - 003(Largest prime factor)

사이트

문제

영문
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
한글
어떤 수를 소수의 곱으로만 나타내는 것을 소인수분해라 하고, 이 소수들을 그 수의 소인수라고 합니다.
예를 들면 13195의 소인수는 5, 7, 13, 29 입니다.
600851475143의 소인수 중에서 가장 큰 수를 구하세요.

풀이과정

  1. 소인수가 저장될 리스트lst = []를 만든다.
  2. 소인수는 2부터 시작한다.
  3. 구하고자 하는 수를 2로 나누어 떨어진다면 2는 소인수이다. 그렇다면 다음 수를 구하기위해 원 수에서 x를 나누어 나온 몫을 다시 구하고자 하는 수에 넣는다.
  4. 만약 나누어 떨어지지 않는다면 그 수는 소인수가 아니고 하나를 증가(x+1)시켜 다시 계산하도록 한다.
  5. 제수가 피제수보다 커지면 모든 소인수를 다 구한 것이다.(더이상 나눌 수가 없음)

내가 푼 답안

lst = []         # 소인수가 저장될 리스트 
n = 600851475143 # 소인수 구할 수 
x = 2            # 최초로 나눌 수(나눠지지 않으면 +1 씩 커진다) 
'''
n(피제수 : 나누어 지는 수)이 x(제수 : 나누는 수)로 나뉘게 될 때
제수(x)가 피제수(나누어 지는 수) 보다 커지면 반복문을 종료한다.
'''
while x <= n:
    if n % x == 0:    # 피제수가 제수에 나누어 진다면 x는 n의 소인수 이다. 
        lst.append(x) # 소인수를 리스트에 추가 
        n /= x        # 피제수를 소인수로 나눈 몫을 다음 피제수로 한다. 
    else :
        x += 1        # 나누어 지지 않는다면 소인수가 아님(제수를 하나 증가시킨다) 
print(lst)
#Project_Euler #question3 #프로젝트_오일러 #python3

2017년 5월 1일 월요일

공부 - 목표를 이루기 위한 수단

공부 - 목표를 이루기 위한 수단

어디서 보고 메모해 둔 글인데, 어디서 본 글인지 기억이 나질 않는다. OTL
  • 자신만의 공부법을 찾아라.
    • 공부는 결코 즐겁지 않다.
  • 노력
    • 자신이 정한 방법을 매일 같이 되풀이 해야 하는 반복과 계속을 의미
    • 엄청난 끈기, 자제력, 각오
  • 공부는 공부 그 자체가 목적이 아니라, 그 목적을 위한 수단이 되어야 한다.
  • 공부(수단)를 통해 목표(결과)가 이뤄진다.
    • 공부 과정을 즐기면서 할 필요는 없다. 공부하는 지금은 괴롭겠지만, 목표에 도달했을 때는 분명히 행복하리라.
  • 자신감, 자존감을 더 높여라.
    • 실패에 집착하면 나아가지 못한다.
  • 실패했을 때는 '다음번에는 같은 실수를 반복하지 말아야지.' 라고 다짐하고, 잊어버려라.(실패에 얽매이지 마라.)
  • 할 수 있는 것과, 해낸 것 생각하기
    • 작은 성취라도 크게 기뻐해라.
  • 성과가 없을 때 일수록 자신감이 자산이다. 또한 자신감은 성공 가능성을 크게 만든다.
#공부 #목표 #수단 #실패 #다짐 #노력 #끈기 #자제력 #각오 #결과 #과정 #행복 #성공 #자존감 #성취 #자신감 #가능성 #메모

Project Euler - 002

Project Euler - 002(Fibonacci sequence)

사이트

문제

영문
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
한글
피보나치 수열의 각 항은 바로 앞의 항 두 개를 더한 것이 됩니다. 1과 2로 시작하는 경우 이 수열은 아래와 같습니다.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
짝수이면서 4백만 이하인 모든 항을 더하면 얼마가 됩니까?

풀이과정

  1. 리스트에 시작항목lst = (1,2)를 입력해 둔다.
  2. 항목을 더한 값을 저장할 변수(num)를 하나 두고 0으로 초기화 해 둔다.
  3. 400만 까지라고해서 반복문(while)을 사용한다.
  4. 리스트에서 마지막 항목을 뽑아올 수 있기 때문에 마지막 항목과 그 이전 항목을 가져와 더하면 다음 항목의 값이 생성된다.
  5. 그 생성된 수가 400만 보다 작다면 리스트에 입력하고, 400만 보다 커지면 반복문을 빠져나온다.
  6. 생성된 값에서 짝수만 더해야 하므로 다시 리스트의 값들을 2로 나누어 떨어지는 수들만 더한다.

내가 푼 답안

lst = [1,2] # 시작항목 입력 
num = 0     # 다음 항목을 계산해서 저장하기위한 변수 
while num <= 4000000:     # 400만 번 이하까지 반복한다. 
  num = lst[-1] + lst[-2] # 수열의 마지막 항목을 계산 
  if num <= 4000000:      # 계산된 수가 400만 이하일 때 리스트에 추가 
    lst.append(num)
  else:                   # 400만 이상이라면 반복문 종료 
    break
# 모든 항목에서 짝수들만의 합을 구해야 함 
s = 0
for x in lst:
  if x % 2 == 0# 2로 나누어 나머지가 0이면 짝수이다. 
    s += x
print("sum : "s)

문제를 잘못읽어 다른 방향으로 풀었던 방법

문제를 순전히 짝수 2, 4로 시작한다고 오독해서 풀었던 방법
lst = [2,4]
while lst[-1] <= 4000000:
  num = lst[-1] + lst[-2]
  if num <= 4000000:
    lst.append(num)
  else:
    break
print(lst)
print("sum : "sum(lst))
#Project_Euler #question2 #프로젝트_오일러 #python3 #Fibonacci_sequence #피보나치_수열