null 팀의 경우 B 문제 하나를 풀었고 (1시간 5분 정도 소요. 패널티 없음), A 번 문제를 계속 시도하던중 시간초과.
초기 5분 ¶
1002가 5분 지각을 했습니다.; 암튼, 35분에 시작을 했고, 일단 5분의 시간을 두고 neocoin 과 1002 는 문제들을 읽어나가기 시작했습니다. 한글 문서였기 때문에 3개의 문제를 훑는데에도 5분이면 충분하더군요. neocoin 은 B번을, 1002 는 A번을 일단 읽고, C 번에 대해서는 같이 읽었습니다. 그리고 미리 문제출제자쪽에서 난이도를 C > A > B 임을 언급했습니다. 문제를 읽어나가면서도 일단 B의 경우가 바로 계산이 나올 것 같아서 B 를 먼저 해결하기로 선택했습니다. 그 다음에는 문제에 대한 이해도가 상대적으로 높았던 A번을 해결하기로 했습니다.
진행 ¶
도구는 연습장과 인덱스 카드, assert 문을 이용한 테스트 케이스 등을 이용했습니다. 연습장과 인덱스 카드는 주로 개개인 수식과 중요 변수들을 적기 위해, 또는 그림을 그리기 위해 이용했고 (두 도구의 용도가 구분되어있진 않았음) 문제에 대해서 답이 나왔다하는 가정하에 (문제지에 Sample Input->Output 이 나와있었기에 가능했습니다.) Backward 로 문제가 해결된 상황을 가정하고, 그러기 위해 필요한 변수들을 찾아나가는 방법으로 진행했습니다. 프로그래밍 스타일은 Structured 스타일의 Stepwise Refinement & PBI & assert 를 이용한 TDD 를 사용했습니다.
B 번 진행 ¶
한 20분정도 잘못진행했었는데, 첫번째는 1002 가 B 번문제를 제대로 이해하지 못했고 (앞부분만 읽고, 문제의 input-output 을 거꾸로 판단), 두번째는 input 이 100 일때의 output 예상치를 잘못계산한 상태에서 이를 근거로 Test Driven 을 시도해서 추후 발견뒤 테스트를 수정하는동안 시간을 낭비했습니다.
Sample 로 제공한 데이터들을 만족시키는 코드는 작성하였으나, 여전히 변수들이 다 뽑아져지지 않아서, 임의의 결과데이터 (100인 경우) 에 대해 예상되는 결과를 생각하고 코드를 작성한뒤, 코드와 결과들, 코드로부터 발견되는 변수들을 토대로 연습장에 기록을 했고, 그러던중 neocoin 이 일반화 공식을 찾아내었습니다.
적절히 중복코드를 삭제하고 난 뒤, 한 5분정도 Input-Output 코드를 iostream 과 STL/vector 를 사용하여 작성한 뒤 이를 제출, 통과했습니다.
A 번 진행 ¶
A 번 진행중 아쉬웠던점은, 만일 이 문제를 바로 풀기전에 OO 패러다임으로 해결할 것인가 Structured 패러다임으로 해결할 것인가에 대해 먼저 생각하는 여유를 가졌더라면 문제 해결이 더 쉽지 않았을까 하는 점이였습니다.
문제에 대해 역시 B 번을 진행하던 스타일대로 Structured 로 진행했는데, 초반에 너무 코드위주로 각 변수들을 뽑아내려고 접근한 것이 문제가 되었던 것 같습니다. 여유를 두고 페이퍼 프로그래밍을 했어도. 바늘들에 대해서 OO 로 접근했으면 좀 더 쉽지 않았을까 생각.
마치며 ¶
지난번 IPSC 경험때는 맨땅에 해딩하는 느낌이였는데, 이번에는 비록 입상하지 못했지만, 각각의 과정들이 의식적으로 일어난 점에 대해서 개인적으로는 즐거웠고 명쾌했습니다. 급조되어 2주만에 만난 Pair 치고 손발이 잘 맞았습니다. (이건 방학 두달동안 ProjectPrometheus 때 하도 서로 싸워대어서. -_-;)
미리 예제문제로 제시된 5문제중 어려웠었던 뒤의 3문제들을 각자 풀어보고 훈련했었다면 실전에서도 더 여유있고 의식적인 작업을 할 수 있었으리라 생각하며. 그리고, 초반에 바로 TDD 로 나가는 것보다, 문제에 대한 여러 접근방법을 둔 뒤, 하나를 고르고 그에 대해 TDD 로 나가는 것이 더 좋았을 것이라고 생각. (TDD를 바로 문제 Approach 기법으로 적용하는것 보단, 해당 문제 접근방법에 대해 빨리 필요한 변수들을 발견해나가고, 명확하게 해주는데 더 효과가 크다는 생각이 들어서)
문제를 풀때 우스개로 이야기했던것이 '수학자의 접근이냐 공학자의 접근이냐'(페르마의 마지막정리 책에 나왔던 예. 즉, 연역/귀납). 이런문제인 경우 문제 풀기전 '어느쪽 접근이 더 유용할까' 궁리를.; 개인적으론 연역이 약해서 후자를..; --1002
1002가 사실을 모두 써줘서 너무 감사합니다. 얼마나 기억을 더듬었을까..
문제를 푸는 동안, 굉장히 여유롭다는 느낌이 들었습니다. 적당히 달려나간다고 할까요. 위에 언급된 2가지의 실수가 없었다면, A를 넘어 C번도 노려 봄직한 느낌이 듭니다. 이런 것들이 연습으로 체화되는 것이겠지요. 다음 ipsc를 즐겁게 기다려 봅니다.
시간 지연된 이유는, 성급한 방법론의 선택과 믿는 것을 가장 의심하라 라는 디버깅 원칙을 시간에 쫓겨서 생각을 하지 못한점으로 생각합니다.
마지막으로, 2주만에 만난 팀의 전략을 쓴다니, 약간 사기죠 ^^; --neocoin