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

 

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

코딩의 ‘코’자도 모르는 코.알.못. 홍 기자가 수학 문제를 코딩으로 푸는 오일러 프로젝트 문제를 하나하나 해결해 나갈 예정입니다. 오일러 프로젝트는 수학과 프로그래밍 실력을 모두 키울 수 있도록 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'에서 연산기호를 바꿔보자.

 

 

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

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

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

 

 

  •  

    기자 님 기사 잘 읽었습니다! 코딩마스터가 되기를 바랍니다. 화이팅!

    그리고 파이썬 에디터는 IDLE보다 파이참을 추천드려용!

    댓글 작성하기 좋아요0 댓글수2
  •  

    + 파이썬을 배우시려면 구름edu에서 배우시거나 구글에 '점프 투 파이썬'을 검색해서 참고하시는 걸 추천드립니다.

    댓글 작성하기 좋아요0 댓글수6
    •  
      우와 Lv.5 2020.01.04

      꿀팁 감사합니다!

      2020년에는 파이썬 도전!

      좋아요0
    •  
      홍아름 기자 Lv.2 2020.01.06

       

      안녕하세요, 집돌이 페렐만 친구! 꿀팁이 담긴 댓글 남겨줘서 고마워요!

      그리고 소~오름 돋는 부분 한 가지!

      이 기사를 준비하면서 가장 많이 참고했던 책이 바로 점프 투 파이썬이랍니다! (인증샷↓↓)

       

      (아직 맨 앞부분 몇장만 봤다는 건 안비밀..ㅎ)

       

      그리고 구름edu에 있는 내용들은 조금 어려워보이지만, 열심히 코딩 배워서 해볼 수 있도록 할게요!

      앞으로도 많이 알려주세요~!

       

      좋아요1
    •  
      피타고라수 Lv.4 2020.01.10

      저도 파이썬은 모르는데 이참에 배워봐야겠어요.

      좋아요0
    •  
      홍아름 기자 Lv.2 2020.02.03

       

      피타고라스 친구! 같이 파이썬 배워봐요~!

       

      좋아요1
    •  
      cacky Lv.1 2020.04.30

      으아 저두요!

      좋아요0
    •  
      최산 Lv.4 2020.05.18

      저는 모두의파이썬 봐요.

      좋아요0
  •  
    mathwizard Lv.7 2020.01.03

    저도 파이썬을 배워야 겠어요!

    댓글 작성하기 좋아요0 댓글수1
    •  
      홍아름 기자 Lv.2 2020.01.06

       

      안녕하세요, mathwizard 친구! 앞으로 같이 파이썬 배워봐요~:)

       

      좋아요0
  •  
    c언어 Lv.2 2020.01.05

    코드를 짧게 짜고싶은 분들을 위한 간단한 팁으로

    s = s + a 

    라는 코드와 

    s += a라는 코드의 뜻은 같습니다!

    마찬가지로  s = s-a | s = s * a | s = s/a  라는 코드도

    s -= a | s *= a | s /= a

    라는 코드로 바꿀 수도 있습니다!

    댓글 작성하기 좋아요0 댓글수5
    •  
      홍아름 기자 Lv.2 2020.01.06

       

      안녕하세요, c언어 친구! 댓글 남겨줘서 고마워요!

      하지만 아직 저는... 코딩으로 기본적인 사칙연산 밖에 쓸 줄 몰라서...

      혹시 s = s + a 이 어떻게 s += a로 표현될 수 있는지랑

      s는 어...어떻게 저렇게 다양한 방법으로 표현할 수 있는 건지 설명해줄 수 있을까요?

       

      알려준 방법은 다음 오일러 프로젝트 문제 풀 때 써보도록 할게요! 고마워요!

       

      좋아요0
    •  
      21세기오일러 Lv.11 2020.01.10

      저는 잘모르지만 s+=a는 s의 값을 a만큼 높여라 아닌가요?

      좋아요0
    •  
      홍아름 기자 Lv.2 2020.02.03

       

      21세기오일러 친구, 알려줘서 고마워요~!

       

      좋아요0
    •  
      mswgen Lv.5 2020.02.10

      s += a는 말그대로 s에다가 더하는 수(s +)는 (=) a라는 말(a)입니다.

      이런식으로 생각해보시면 -=, *=, /=도 쉽게 알 수 있을 거에요.

      좋아요0
    •  
      cacky Lv.1 2020.04.30

      내가 알아들을 수 있는 거시 업따....

      좋아요0
  •  
    Lv.11 2020.01.05

    #include<cstdio>
    int main(){
        int a=0;
        for(int i=1;i<1000;i++){
            if(i%3==0 || i%5==0){
                a=a+i;
            }
            if(i%3==0 && i%5==0){
                a=a-i;
            }
        }
        printf("%d",a);
        return 0;
    }
    c++로 짜보았는데 해결이 안되네요ㅠㅠㅠ 누군가 좀 도와주세요ㅠ

    댓글 작성하기 좋아요0 댓글수4
    •  
      홍아름 기자 Lv.2 2020.01.06

       

      갈릴레오 갈릴레이 친구, 이 어마어마한 글은 무엇인가요...?

      저는 뭐가 뭔지 1도 모르겠어요...ㅜ^ㅜ

      c언어를 알고 있는 친구들! 갈릴레오 갈릴레이 친구에게 도움을 주세요!!! (떠넘기기)

       

      좋아요0
    •  
      아이즈원_조유리 Lv.3 2020.01.06

      #include<cstdio>
      int main(){
          int a=0;
          for(int i=1;i<1000;i++){
              if((i%3==0) || (i%5==0)){
                  a=a+i;
              }
          }
          printf("%d\n",a);
          return 0;
      }

      위 코드가 정답입니다. 아마

      if(i%3==0 && i%5==0){
                  a=a-i;
      }

      이 부분에서 오류가 난 것 같은데, 3의 배수 "또는" 5의 배수이므로 15의 배수도 포함이 가능합니다. 그래서 위 조건식 없이도 조건을 만족 할 수 있습니다

      좋아요0
    •  
      홍아름 기자 Lv.2 2020.02.03

       

      우와, 아이즈원_조유리 친구! 대단해요..(감탄)

       

      좋아요0
    •  
      cacky Lv.1 2020.04.30

      이거시 진정 코딩이란 마린가

      좋아요0
  •  
    아이즈원_조유리 Lv.3 2020.01.06
    확인요청중

    s = 0
    for i in range(1, 1000):
            if (i % 7 == 0) or (i % 13 == 0):
                    s = s + i
    print "sum : " + str(s)

    multi = 1
    for i in range(1, 1000):
            if (i % 7 == 0) or (i % 13 == 0):
                    multi = multi * i
    print "multi : " + str(multi)

     

    아침에 보자마자 풀어봤습니당.

    댓글 작성하기 좋아요0 댓글수3
    •  
      아이즈원_조유리 Lv.3 2020.01.06

      s = 0
      for i in range(1, 1000):
              if (i % 3 == 0) or (i % 17 == 0):
                      s = s + i
      print "sum : " + str(s)

      multi = 1
      for i in range(1, 1000):
              if (i % 3 == 0) or (i % 5 == 0):
                      multi = multi * i
      print "multi : " + str(multi)

       

      위 코드에 약간 수정 해야할 부분이 있어서 수정했습니다

      좋아요0
    •  
      21세기오일러 Lv.11 2020.01.10

      그래서 답이 몇나왔나요? ( 제가 맞는지 확인해 보게요.)

      좋아요0
    •  
      cacky Lv.1 2020.04.30

      이 어마어마 한 거슨 뭐시져 ㅠㅠ

       

      좋아요0
  •  
    무한대의끝을본남자 Lv.6 2020.01.18

    c언어 써도되나요 ㅋㅋ

    댓글 작성하기 좋아요0 댓글수1
    •  
      홍아름 기자 Lv.2 2020.02.03

       

      그럼요! c언어로 문제를 해결했다면 코드를 여기에 남겨주세요~!

       

      좋아요0
  •  
    Lv.11 2020.01.19

    #include<cstdio>
    int main(){
        int sum=1;
        for(int i=1;i<=1000;i++){
            if(i%3==0 || i%5==0){
                sum=sum*i;
            }
        }
        printf("%d",sum);
    }

    곱 코드를 짜려고 하는데 결과가 0이 나와요 왜 그런건가요?

    댓글 작성하기 좋아요0 댓글수1
    •  
      홍아름 기자 Lv.2 2020.02.03

       

      흠흠.. 친구들, 이레릴갈오레릴갈 친구를 도와주세요!ㅜ

       

      좋아요0
  •  
    설리번 Lv.2 2020.01.26

    제가 코딩을 몰라서 그런데 3 또는 5의 배수라고 하면 15의 배수는 하나로 쳐서 알아서 (3의배수)+(5의배수)-(15의 배수) 를 해주는건가요?

    댓글 작성하기 좋아요0 댓글수1
    •  
      홍아름 기자 Lv.2 2020.02.03

       

      네, 이 내용을 '포함배제의 원리'라고 한답니다!

      자세한 내용은 수학동아 1월호에서 확인할 수 있어요~!

       

      좋아요0
  •  
    설리번 Lv.2 2020.01.26
    확인요청중

    문제 2번

    s = 1
    for a in range(1, 100) :
        if a % 3 == 0 or a % 5 == 0 :
            s = s * a
    print(s)

    13656259021130871772314533494945947941803211599380480000000000000000000000

    맞나요? 

    1번은 104104 나왔어요 

    댓글 작성하기 좋아요0 댓글수1
    •  
      홍아름 기자 Lv.2 2020.02.03

       

      설리번 친구, 저도 똑같이 나왔어요~:)

       

      좋아요0
  •  
    강냉이 Lv.6 2020.01.30

    저도한번 파이썬을....

    댓글 작성하기 좋아요0 댓글수1
    •  
      홍아름 기자 Lv.2 2020.02.03

       

      강냉이 친구, 앞으로 파이썬 같이 배워봐요~!

       

      좋아요0
  •  
    Lv.8 2020.02.10

    하하

    저도 코딩을 배우고 있느 중이지만 아직 왕초보입니다ㅠㅠ

    좋은 코딩책좀 추천해주세요

    댓글 작성하기 좋아요0 댓글수2
    •  
      홍아름 기자 Lv.2 2020.02.10

       

      안녕하세요, 깁 친구!

      저는 파이썬 왕초보라 '점프 투 파이썬'이라는 책을 참고한답니다!

      그리고 폴리매스 친구들이 남겨준 댓글들을 많이 참고해요!

       

      좋아요0
    •  
      Lv.8 2020.02.10

      감사합니다... 열심히 배울께요

      좋아요0
  • 폴리매스 문제는 2019년도 정부의 재원으로 한국과학창의재단의 지원을 받아 수행된 성과물입니다.

  • ☎문의 02-6749-3911