구구단, 소수, 피보나치 수열 구하기 등의 간단하고 쉬운 문제들


자주 사용되는 ToyProblems:

당신은 이제까지 이런 문제들을 후배들에게 가르치면서 그들을 정신의 감옥 속에 가둬넣지 않았습니까? 이제까지 구구단 문제를 정말 생소한 방법으로 해결한 후배를 본 적이 있습니까? 모두 for 루프를 쓰지 않던가요? 네. 당신은 이제까지 후배들을 자신의 협소한 패러다임으로 세뇌시켜왔습니다. (사실, 시간을 써가며 후배들에게 자신의 지식을 베푸는 선배들은 정말 훌륭하고 그런 사람들을 폄하할 생각은 전혀 없습니다. 일부러 좀 과장을 해서 썼습니다.) --JuNe

ToyProblems에는 단점이 있다. 너무 간단하다. 배우는 사람은 지루하고 시시하게 느낄 수 있고, 문제를 풀어봐야 별 감흥이 없으며, 새로운 걸 배운 느낌이 들지 않는다. 그러나 그들에게 아직 복잡한 문제는 시기상조이다. 이 딜레마를 어떻게 깨트릴까.

ToyProblems를 풀게 하되 다음 방법을 이용한다. Seminar:TheParadigmsOfProgramming (pdf)(http://www.jdl.ac.cn/turing/pdf/p455-floyd.pdf)을 학습하게 하는 것이다.

  1. 일단 자신이 아는 방법을 총동원해서 문제를 풀게 한다.
  2. 선배가 이 간단한 문제를 다양한 패러다임으로 다르게 풀 수 있다는 것을 보여주고 간략히 설명한다. 이때, 대부분의 경우 긴 설명이 필요없다. 이미 문제를 풀어봤기 때문이기도 하고, 문제 자체가 간단하기 때문이기도 하다.
  3. 이번에는 해당 패러다임을 이용해서 앞서 1번에서 풀었던 문제와 유사하지만 다른 문제를 풀게 한다.

이런 식으로 패러다임을 여러가지 소개한다. 예를 들어 구구단 같은 문제는 최소 10가지 이상의 패러다임으로 풀 수가 있다.

학생은 이 경험을 통해 프로그래밍 "개념"과 "패러다임"들을 학습하게 되며, 어떤 경우에 어떤 패러다임이 더 적절한지 판단할 능력이 생기고, 무엇보다도 한가지 패러다임에 대한 초기 각인(새끼새가 처음 본 흰색을 무조건 어미라고 생각하는 효과)을 깨트리고, 좀 더 자유로워질 수 있다 -- 한가지 패러다임만 아는 사람보다는 여러가지 패러다임을 아는 사람이 더 개방적이고 포용력이 넓다. --JuNe

고학년(저학년을 가르칠 사람들) 대상으로 강의를 해줄 용의가 있습니다. 만만한 문제가 결코 만만한 게 아니라는 것, 간단한 것에서 정말 엄청나게 많은 걸 배울 수 있다는 것 등을 느끼게 될 것입니다. --JuNe
요세 저도 위와 같은 것 때문에 고민 했는데 해결하기가 쉽지 않았습니다. 후배들에게 좀 더 많은 걸 배울 수 있는 문제에 관하여서... 그런데 어려운 문제는 좌절할 거 같고 그렇다고 쉬운 문제는 배우는 게 얼마 없는 거 같고... 여러 가지 패러다임을 통해서 고민을 해결할 수 있다면 이번 기회에 한 번 시도 해보고 싶습니다. --재동

ToyProblems 목록

ToyProblems Lab

  • 날짜: 6월 1일 오전 10시
  • 장소: 중앙대 공대 7층 컴퓨터 공학과 PC실 (여러 대의 컴퓨터와 화이트 보드가 이곳밖에는...)
  • 준비물: 기본적으로 이클립스와 Python 2.3b1( + idlefork), NetMeeting 설치
  • 강사: 김창준
  • 조교: 강규영

  • 참가자 자격: 후배를 가르쳐봤고, 앞으로도 가르칠 사람.
  • 신청자:
    1. 류상민 : 요즘 조금 바쁘지만, 시간이 맞는다면, 당연히! 안맞으면 맞추어서~ 당연히!
    2. 인수
    3. 임인택
    4. 신재동
    5. 채희상
    6. 1002
    7. 상욱 : 늦게 올려서 죄송해요... 참가 그래도 가능하겠죠?? ㅡ.ㅜ
      일이 생겨서 못가게 되었습니다. ㅜ.ㅡ --창섭
      잘하면 갈 수 있을 지도 모르겠습니다. -_-; 지금 시간 조율중이라..;; 꼭 가고 싶어서.;; 죄송합니다. 이랬다 저랬다 해서..; 되도록 가도록 하려구요.. 재밌을 거 같은데..;;

ToyProblems를 풀면서 접하게 될 패러다임들(아마도): CSP, Generators, Coroutines, Various Forms of Recursion, Functional Programming, OOP, Constraint Programming, State Machine, Event Driven Programming, Metaclass Programming, Code Generation, Data Driven Programming, AOP, Generic Programming, Higher Order Programming, Lazy Evaluation, Declarative Programming, ...

Programme
  • 전체 진행 2시간 30분
  • ToyProblems 후보 : 구구단, 소수구하기, SpiralArray, 삼각형 그리기, (기타 참가자가 원하는 것 추가 가능. 단 조건은 1학년이 한 시간 내에 풀 수 있는 간단한 문제)
  • PairProgramming
  • 자신이 원하는 언어 (python recommended)

  1. 여기에서 두 가지 정도를 고른 다음
  2. 그 중 하나에 대해 스스로 문제를 풀게한다 10m.
  3. 비교해 본다. 몇 가지 패러다임이 나왔나(아마도 하나나 둘을 넘지 않을 것이다) 10m
  4. 전혀 새로운 패러다임으로 동일 문제를 푸는 과정을 보여준다 10m
  5. 비슷하지만 약간 다른 문제를 풀게한다 10m
  6. 비교해 본다. 5m
  7. 또 다른 패러다임으로 동일 문제를 푸는 과정을 보여준다 10m
  8. 비슷하지만 약간 다른 문제를 풀게한다 10m
  9. 1번에서 고른 나머지 문제를 가능하면 다양한 방법으로 여러번 풀게한다. 각자 몇 개의 전혀 다른 프로그램을 만들어 내는가? 60m
  10. 비교한다. 10m
  11. 토론 15m

감상
인수 - 신기했다. CSP가 재미 있었다. 집에서 해봐야겠다.
희상 - CSP를 응용해 문제를 푸는 것을 듣고 난 후 Alan Kay가 Paradigm이 Powerful Idea라고 했던 것에 고개를 끄덕끄덕 할 수 있었다. 그동안 FP를 맛만 보았지 제대로 탐구하지 않았던 것이 아쉬웠다. FP에 대한 관심이 더 커졌다.
상욱 - 새로운 새고방식을 알아 간다는 것은 재미있었다.
지원 - FP Skill 을 배우게 된 것이 좋았다.
창준
늦게 온 사람이 중간에 참여하는 것은 문제가 있다. 그 사람은 앞부분을 모르기 때문에 어떤 부작용이 있다.
코딩 시간이 부족했다. Code Kata를 해보지 못해서 아쉽다.
한문제 여러번 푸는 것은 역시 좋은것 같다.
상민 - 새로운 사고란, 새로운 사고법이라 불리우는 것이, 미묘한 차이를 인지하는 것에서 온다는 사실을 알았다. 겸손한 자세가 중요한것 같다.
- 창준 - Higher Order Programming과 로우레벨에서의 설명(예컨대 단순한 함수 포인터로 설명하는 것)의 차이는 미묘하고, 또 크다. 동사(달리다)를 명사(달림)의 품 안에 넣는 것이다. 이 사고에서 엄청난 차이가 생길 수 있다.
재동 - 한문제 다시 풀기가 재미있었따. 사고의 고정화를 경계해야 겠다. 시간안에 못해서 충격 이었다.
- 창준 - 타인을 가르치기 위해, 여러가지로 풀 가능성이 주어지는 것을 문제로 만들자.
석천 - 늦으면 안된다. Python 사용중 아는 것과 쓰는 것의 커다란 차이를 느꼈다. 기존 사고에 갇혀버려 새로운 사고로 전이 못하는 것에서 어려움을 느꼈다.
- 창준 - 교육의 3단계 언급 Romance(시, Disorder)-Discipline(예, Order)-Creativity(악, Order+Disorder를 넘는 무언가) , 새로운 것을 배울때는 기존 사고를 벗어나 새로운 것만을 생각하는 배우는 자세가 필요하다. ( 예-최배달 유도를 배우는 과정에서 유도의 규칙만을 지키며 싸우는 모습), discipline에서 creativity로 넘어가는 것이 중요하다.
규영 - 가르치는 것의 어려움. 어설프게 가르치려다가 어떤 면에서는 피해를 줄 수도 있겠다는 생각을 했다. 그리고 수학이나 논리적 사고의 중요성을 깨달았다.
인택 - 가르치는 것 역시 배우는 과정이다. Metaphore의 필요성


Higer order programming에서 중요한 것은 동사를 명사화해준다는 것인데, Command Pattern도 이와 비슷한 것 같습니다.
CP도 Functor 의 일종이다. ( 예 - Spiral Matrix를 Vector의 방법으로 풀기). CP부터 배우면 CP에서 제시하는 예에서만 적용하는 것으로 갇힐수 있다.

추천책 3권
그외 언급된 책들
  • HowToSolveIt
  • ChapterZero
  • How to Prove it
  • How to Read and Do Proofs
  • Proofs and Refutations (번역판 있음)
  • 문제해결의 수학적 전략
  • The Art and Craft of Problem Solving


  • JuNe님 소스 공개 해주셔요. _temp에 있던 코드들이 눈 앞에 아른거려요. :) --강규영
  • 패러다임 프로그래밍 재미있어 보이네요. 2011년 데블스 캠프에 시도해보면 좋겠습니다 - 서지혜
Retrieved from http://wiki.zeropage.org/wiki.php/ToyProblems
last modified 2021-02-07 05:28:17