본문바로가기
[오일러 프로젝트] 코딩충: 코딩은 나눌수록 행복하잖아요
수학동아 2020.01.02 12:03

 

코.알.못 홍 기자의 코딩 도전기

코딩의 ‘코’자도 모르는 코.알.못. 홍 기자가 수학 문제를 코딩으로 푸는 오일러 프로젝트 문제를 하나하나 해결해 나갈 예정입니다. 오일러 프로젝트는 수학과 프로그래밍 실력을 모두 키울 수 있도록 2001년에 만든 수학 문제 웹사이트로, 수학 문제를 프로그래밍으로 해결하는 게 목적이지요. 홍 기자와 함께 한다면 수학과 파이썬 모두 정복할 수도…? 같이 한번 풀어봐요!

 

 

“아들아, 역시 너는 계획이 다 있구나!”

2019년 칸 영화제 황금종려상을 받은 영화 ‘기생충’이 낳은 역대급 유행어입니다. 누가 봐도 괜찮지 않아 보이는 계획을 실행하려는 아들에게 하는 대사죠. 새해를 맞아 저도 기생충의 주인공처럼 무모한 도전을 시작합니다! ‘무계획이 완벽한 계획’이라는 말처럼 아무런 계획 없이 무작정 코딩으로 수학 문제 풀기에 나서볼까요?

 

<오일러 프로젝트 1번 문제>

10 보다 작은 자연수 중에서 3 또는 5의 배수는 3, 5, 6, 9이고, 이들의 총합은 23이다. 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 얼마일까?

 

이 문제를 수학으로 해결하기 위해서는 다양한 방법을 쓸 수 있습니다. 대표적으로 포함배제의 원리를 예로 들 수 있는데요, 코딩으로 모든 수를 일일이 다 늘어놓고 3, 5의 배수를 찾아 더하기만 해도 손으로 푸는 것보다 훨씬 빠르게 풀 수 있답니다. 이 문제를 해결하기 위해서는 어떤 파이썬 명령어가 필요할까요?

 

1. 반복문(for)과 range 함수

컴퓨터가 잘하는 일이 같은 일을 반복하는 거예요. 그만큼 반복문은 코딩에서 아주 중요한데요, 파이썬에서는 ‘for’라는 명령어를 써요. 흔히 숫자 목록을 자동으로 만드는 ‘range’ 함수와 함께 다니지요. 이번 문제에서는 1부터 1000 미만의 수가 3 또는 5의 배수인지 알아봐야 하므로, a라는 변수가 1부터 999까지 변하는 코드를 만들어 볼 거예요.

 

 

특이하게 a가 1부터 999까지 변하는데 range 안의 수는 (1, 1000)이에요. range는 (시작 숫자, 끝 숫자) 형태로 나타내는데, 시작 숫자는 ‘이상’, 끝 숫자는 ‘미만’의 수를 의미해요. 끝 숫자는 포함하지 않는다는 것을 명심하세요!

 

2. 조건문(if)

조건에 따라 참, 거짓을 판별하는 조건문은 ‘if’라는 명령어를 사용해 아래와 같이 나타냅니다. 이번 문제에서는 변수 a가 3 또는 5의 배수인지 따져봐야 하므로 두 경우를 연결하는 ‘or(또는)’이라는 명령어를 이용해요.

 

 

여기서 ‘%’는 나눗셈의 ‘나머지’ 값을 알려주는 나머지 연산자입니다. 따라서 a를 3이나 5로 나눴을 때 나머지가 0이라면 조건문 바로 아래의 코드를 실행합니다.

 

TIP 1. 수학에서 ‘=’은 양쪽이 같다는 의미지만, 파이썬에서는 변수에 어떤 값을 대입할 때 사용합니다.

파이썬 뿐 아니라 다양한 프로그래밍 언어에서는 양쪽이 같다는 뜻으로 ‘==’을 쓴답니다.

 

TIP 2. 반복문(for)이나 조건문(if)이 끝나는 곳에는 꼭 콜론(:)을 붙여야 합니다. 그래야 조건식의 경계가 명확해져 코드가 실행될 수 있습니다. 그렇지 않으면 아래의 오류창 을 쉴새 없이 만나게 될 거예요.

 

도전! 오일러 프로젝트 1번 문제 뽀개기

* 코딩 언어는 Python으로 두고 실행하세요!

 

#1. 가장 먼저 변수를 정의합니다. 문제의 답을 변수 s에 저장하며, 초깃값을 0으로 설정합니다.

#2. 1 이상 1000 미만의 자연수를 변수 a로 설정합니다. 수를 일일이 헤아려 3과 5의 배수를 찾아야 하므로 for문을 사용해 정의합니다. 

#3. a가 3 또는 5의 배수인지 판별하는 조건문입니다. 만약 a가 3 또는 5의 배수라면 4번 줄의 코드를 실행합니다.

#4. 3번 줄의 조건문을 만족하는 a의 값을 s에 더합니다. 이때 3, 4번의 과정은 a가 999가 될 때까지 계속 반복합니다.

#5. a가 999가 될 때까지 실행해 구한 3, 5의 배수의 합인 s를 출력합니다. 이때 명령어를 들여쓰기해 사용하면 명령어가 조건문 안에 들어가 변수 s가 바뀌는 과정을 모두 출력합니다.

 

Bonus! 오일러 퀴즈

오일러 프로젝트 1번 문제를 위 코딩창에서 풀어보고, 다음 예제 문제에도 도전해 보세요!

 

1. 1000보다 작은 자연수 중에서 7 또는 13의 배수를 모두 더하면 얼마일까?

    Hint. 'if a % 3 == 0 or a % 5 == 0 :'에서 수를 바꿔보자.

 

2. 100보다 작은 자연수 중에서 3 또는 5의 배수를 모두 곱하면 얼마일까?

    Hint. 'for a in range(1, 1000) :'에서 수를, 's = s + a'에서 연산기호를 바꿔보자.

 

혹시 더 좋은 코딩 아이디어가 있거나,

코딩을 빠르게 익힐 수 있는 좋은 방법이 있다면

댓글을 남겨 코.알.못 홍아름 기자를 도와주세요!

 

첫 댓글의 주인공이 되어 보세요!
  • 폴리매스 문제는 2019년도 정부의 재원으로 한국과학창의재단의 지원을 받아 수행된 성과물입니다.

  • ☎문의 02-6749-3911