'봄싹 3기/퀴즈'에 해당되는 글 6건

  1. 2009.04.09 TDD 퀴즈들 1
  2. 2009.03.23 이번 주 연구 과제 10
  3. 2009.02.04 세 번째 퀴즈 입니다. 볼링 게임~
  4. 2009.01.14 두 번째 퀴즈: 야구게임 3
  5. 2009.01.06 퀴즈 풀 때 주의 할 것 16
  6. 2009.01.05 TDD 퀴즈 1. 비디오 샵 7
2009. 4. 9. 11:11

TDD 퀴즈들

http://sites.google.com/site/tddproblems/all-problems-1

위 링크에 가시면 TDD 퀴즈들이 올라와 있습니다. 괜찮은 듯 합니다. 심심할 때 마다 하나씩 해보세요~
2009. 3. 23. 10:22

이번 주 연구 과제

코딩 퀴즈만 푸는데 너무 지치신 것 같아서 이번엔 다른 퀴즈를 드립니다. 정답은 저도 몰라요. 방금 사부님한테 받은 과제인데 여러분과 함께 고민하고 싶습니다. 이번 주 토요일까지 각자 연구해오고 오프라인에서 각자 연구 결과를 공유해보아요~~~

그럼 대화의 일부분을 그대로 올려드리겠습니다.

tobyilee:
JUnit의 @Before가 왜 필요한지 알아?
백기선: 흠.. @_@
tobyilee: 매 테스트 마다 새로 인스턴스를만드는데
왜 구지 @Before를 써서 초기화 할까?
그냥 인스턴스 변수에 넣거나
백기선: 생성자 역할을 대신하는걸까요
tobyilee: 생성자 써도 되는데
왜일까?
백기선: 생성자를 쓰면 안되는 이유가 있으려나
tobyilee: 니네 스터디에서 한번 토론해 보셧
백기선:
tobyilee: JUnit이 매 테스트마다 인스턴스를 통채로 만드는 건 알지?
백기선: 네 그건 알죠
tobyilee: 근데 왯
@Before를 쓸까나
백기선: 흠..
tobyilee: 이걸 가지고 junit 씹는 인간들도 제법 있지
연구해보셈
백기선:

2009. 2. 4. 20:50

세 번째 퀴즈 입니다. 볼링 게임~

목표

볼링점수를 계산하는 프로그램을 작성

볼링점수계산

계산법참고

  • Stike인 경우는 다음 두번 투구수의 점수를 합한다. 따라서 이후 두번 더 투구할 때까지 strike한 프레임의 점수는 계산되지 않는다.
  • Spare인 경우는 다음 한번 투구스의 점수를 합한다. 따라서 이후 한번 더 투구할 때까지 spare한 프레임의 점수는 계산되지 않는다.
  • 마지막 프레임의 경우는 위의 두가지 조건을 만족하기 위해서 Stike이면 2번, Spare면 한번의 투구가 가능하다.

요구사항

  • 볼링게임(BowlingGame)클래스의 인스턴스를 만들면 새 게임이 시작한 것으로 간주한다.(명시적인 start는 필요없음)
  • 현재 몇번째 프레임의 몇번째 투구(첫번~세번째)를 할 차례인 조회해 볼 수 있다. 게임이 끝났으면 GameOverException을 던진다.
    (Frame번호 + 그 프레임의 시도횟수)
  • 현재까지 진행된 프레임결과와 각 프레임 점수를 보여준다. 확정되지 않은 점수는 표시하지 않아도 된다.
    결과는 현재프레임을 포함해서 진행한 프레임(Frame)갯수만큼의 리스트를 리턴하도록 한다.
    각 프레임에는 프레임번호와 결과스트링(X/-1~9)과 그 프레임의 점수를 돌려준다.

ex)
Frame(1, 08, 8)
Frame(2, X, 15)
Frame(3, 5-, 5)
...
Frame(10, XXX, 30)

기호)
Stike : X
Spare : /
Gutter: -
그외 : 0~9

  • 한번 투구를 하는 메소드(roll)를 만들고 쓰러뜨린 핀의 수를 파라메터로 넘긴다. 게임이 끝났으면 GameOverException을 던진다.
2009. 1. 14. 22:26

두 번째 퀴즈: 야구게임

목적

숫자야구게임용 엔진개발

숫자야구게임룰

컴퓨터는 미리 3개의 1~9사이의 숫자를 가지고 있다. (ex. 1 3 5)
사용자는 컴퓨터가 가지고 있는 숫자를 정확히 맞춰야 한다.
사용자는 미리 지정된 만큼의 횟수동안 시도할 수 있다. 지정된 횟수까지 시도해서도 맞추지 못하면 "out"이다.
사용자는 매번 3개의 숫자를 넣고 컴퓨터는 미리 가지고 있는 3개의 숫자와 비교해서 다음의 응답을 해야한다.
1) 3개의 숫자가 맞고 위치도 맞으면 "hit"
2) 1)이 아닐경우 입력한 숫자가 컴퓨터가 가지고 있는 숫자 중의 하나이고 그 위치도 맞으면 strike가 1씩 올라간다.
예를 들어 컴퓨터의 숫자가 1 3 5인데 사용자가 입력한 숫자가 2 3 4이면 "1 strike"이고 2 3 5를 입력했다면 "2 strikes"이다.
3) 숫자는 맞으나 위치가 다르면 ball이 1씩 올라간다. "1 ball", "2 balls", "3 balls"

예) 컴퓨터의 숫자 1 3 5
1 2 3 => "1 strike 1 ball"
5 1 3 => "0 strike 3 balls"
1 5 3 => "1 strike 2 balls"
6 7 8 => "0 strike 0 ball"
1 3 6 => "2 strikes 0 ball"
1 3 5 => "hit"

요구사항

  • BaseballGame클래스를 메인클래스로 작성한다. 완성된 코드는 여러개의 클래스로 구성해도 상관없다.
  • 게임은 여러번 진행할 수 있다.
  • 게임을 시작하기 위해서는 컴퓨터가 가진 숫자와 최대 시도횟수가 등록되어있어야 한다.
  • 게임이 시작되면 이번에 몇번째 게임인지 정보를 돌려준다.
  • 2번째 게임부터의 컴퓨터의 숫자는 이전 게임에서 사용한 것과 동일한 것을 쓸 수 없다. 단 최대 시도횟수는 같아도 상관없다.
  • 게임이 종료되는 것은 "hit" 또는 "out"되었을 때이다.
  • 게임이 종료된 후 다시 게임을 시작하기 전에는 게임을 시도할 수 없다.
  • 게 임 중에는 게임의 현재 상태를 요청할 수 있다. 게임상태는 최대시도가능 횟수, 현재 시도한 횟수, 그리고 현재까지의 최고기록의 정보를 돌려준다. 최고기록은 strike는 3점, ball은 1점으로 계산해서 그 중 최고점수를 가진 시도의 정보(몇번째시도 와 시도한 숫자)를 돌려준다. 최고기록이 같은 경우가 2번이상 있으면 모두 돌려준다.
  • 게임의 최고기록을 요청하면 지금까지 진행된 게임중 가장 적은 시도로 맞춘 결과(시도횟수)를 보여준다. 게임의 최고기록을 요청하는 것은 게임이 종료된 이후에만 가능하며 한번도 게임을 시도하지 않았으면 결과를 요청할 수 없다.
  • 모든 단서조항(...한다, ...할 수 없다, ...일경우는)에 위배되는 경우는 적절한 Exception을 던져야 한다.
  • 각 결과는 적절한 형태로(String 또는 임의의 Object) 리턴되면 된다(화면에 출력될 필요는 없다. 엔진이니까. UI는 이번 엔진을 이용해서 나중에 따로 개발할 것이다)

야구게임 엔진을 만든다는 기분으로...
2009. 1. 6. 09:46

퀴즈 풀 때 주의 할 것

1. task 먼저 작성할 것.

- 미리 자신이 테스트 하고자 하는 것을 한 문장으로 작성하세요. 그걸로 작업 단위를 조절할 수 있습니다. 미리 모든 task를 정리하진 않으셔도 됩니다. 조금씩 계속 점진적으로 수정하고 추가해 나가세요.

- 퀴즈에 있는 요구 사항이 task로 1:1로 맵핑 되진 않습니다. 각자가 요구 사항을 읽고 자신만의 task를 만들어 보세요.

2. 절대로 머리속으로 미리 설계하지 않는다.

- 테스트를 성공시키기 위한 코드만 작성하세요. 그리고나서 리팩터링을 하다보면 자연스럽게 멋진 설계가 나온다나... 어쩐다나~

- 그래야 TDD의 묘미를 맛 볼 수 있다고 하네요. 아마 이 것이 가장 힘든 일이 아닌가 싶습니다. 기존에 경험이 많으신 분들은 딱 보면 딱 뭔가 떠오르기 때문에.. 생각을 많이 하지 않는 연습이 필요할 것 같습니다.

3. 한 task가 끝나면 커밋한다.

- 그래야 과정을 볼 수 있습니다. 중간 중간 어떤 단위로 작업을 했는지 코드가 어떤 식으로 발전했는지 말이죠. 물론 더 세세하게 커밋을 해도 됩니다. 테스트 코드만 작성한 다음 커밋한다던지.. 리팩터링 하기 전이랑 후의 코드를 볼 수 있게 커밋한다던지..

- 어쨋든 최소한 한 task 마다 커밋 한 번은 꼭 해주세요.

4. 퀴즈를 여러번 풀어보세요.

- 매번 비슷하지만 약간 다른 코드가 나오거나 전혀 다른 코드가 나올 수도 있습니다. 피드백을 받은 다음에 다시 해봐도 좋지만 그 전에도 여러번 해보면 해볼 수록 새로운 맛을 느낄 수 있을 겁니다.

5. 퀴즈를 다 풀었다!

- 글을 올려주세요. 요즘 댓글이 너무 많이 달려서 댓글을 다 챙겨보기가 힘듭니다. 아예 새로운 글을 올려서 자신이 어떤 퀴즈를 풀었으며 느낌이 어땠는지 저장소 주소가 어떻게 되며 프로젝트 이름은 무엇인지 프로젝트 빌드에 필요한 정보가 있다면 그런 정보도 알려주시면 좋겠죠?(메이븐 프로젝트라면 메이븐이 필요하다고 알려주시구요. 프로젝트에서 사용한 인코딩이 무엇인지 UTF-8인지 EUC-KR인지. 등등)


2009. 1. 5. 09:34

TDD 퀴즈 1. 비디오 샵

목적

비디오방에서 고객이 대여하는 비디오의 대여정보를 조회할 수 있는 프로그램을 작성

요구사항

  • 고객(Customer)은 이름을 가지고 있다.
  • 고객은 한번에 여러개의 비디오를 대여할 수 있으나 각각의 대여(Rental)기간은 다를 수 있다.
  • 비디오(Video)는 영화,스포츠,다큐멘타리의 세종류가 있다.
  • 각각의 비디오는 독립적인 일일 대여요금을 가지고 있다.
  • 영화는 대여기간이 2일 이상되면 3일째 부터는 대여요금이 1/2로 할인된다.
  • 다큐멘타리는 3일 이상 대여하면 4일째 부터는 1/3로 할인된다.
  • 스포츠는 장기대여 할인이 없다.
  • 비디오 1개 대여할 때 마다 보너스포인트는 1포인트씩 올라간다. 단, 스포츠는 2포인트씩 올라간다.
  • 과거의 대여기록을 가지고 있을 필요는 없으나 고객이 얻은 총 보너스 포인트 정보는 알고 있어야 한다.
  • 고객(Customer)의 현재 대여정보를 구할 수 있는 기능을 작성하라
    • 총 대여비디오 수
    • 대여정보: 비디오(종류 + 제목 + 가격), 대여기간 리스트
    • 총대여가격
    • 현재 대여하고 있는 비디오로 인해서 추가된 포인트수

조건

  • 예외상황에 대한 처리는 필요없다.
  • 반드시 TDD의 순서에 따라서 작업할 것
  • 테스트할 목록을 직접 정의한다(txt파일에 정리할 것)
  • 한개의 테스트 메소드 작업이 끝날때마다 commit하도록 한다. 이때 테스트 목록에서 작업한 내용은 체크해서 올린다.