티스토리 뷰

(EndTime은 저와 도토리 2인팀, MolaMola는 저, 도토리, 상수 3인팀입니다)


0. 개론

 

 2명 이상이 대회를 하는 상황에서 팀 전략은 꽤 중요하게 작용합니다. 그 중요도는 팀원 조합에 따라 달라지긴 합니다만, 팀 전략을 수정하는 것만으로 팀 실력을 올릴 수 있다고 봅니다.

 

 ICPC는 컴퓨터를 한 대만 쓰는 대회입니다. "3인 대회에서 컴퓨터를 한 대만 쓴다니손해 아닌가요?" 3명이 컴퓨터 하나씩 잡아도 결국 풀이 생각하는 시간, 코딩하는 시간, 디버깅 시간 같은 것들을 다 합쳤을 때 15시간을 넘을 수 없습니다. 그리고, 진짜 컴퓨터 앞에 있어야만 하는 시간은 코딩을 할 때(와 디버깅에서 말렸을 때) 뿐입니다. 이 행동들을 잘 당기고 밀어서 모든 행동이 컴퓨터 한 대만 사용해도 가능하게끔 하는 것이 팀 전략의 핵심입니다.

 

 ICPC에서 문제를 풀 때는, 크게 4가지 단계로 나누어집니다.


  1. 풀이 구상
  2. 코딩 구상
  3. 실제 코딩
  4. 디버깅


 문제가 3개 있는 팀대회를 생각해봅시다. 단계는 1-1부터 3-4까지 12가지 단계가 있습니다. 각각이 걸리는 시간은 모르지만, 1-1 < 1-2 < 1-3 < 1-4, ... 순서로 진행되고, 1-3, 2-3, 3-3은 같은 시간대에 있을 수 없습니다

 

 어떻게 문제를 푸는 것이 최적의 전략일까요? 언제 컴퓨터를 쓰고, 언제 안쓰는 것이 최적일까요? 그리고 실제 대회에서는 각 단계가 얼마나 걸릴지 모르는데, 어떤 전략을 선택해야 할까요?

 

1. 코딩 구상


 일반적으로, 3인팀의 경우 컴퓨터 앞에 앉아있는 시간보다 밖에 앉아있는 시간이 훨씬 더 많습니다. 그래서 컴퓨터 밖에서 최대한 많은 것들을 해야 할 필요가 있습니다. 코딩도 예외가 아닙니다.

 

 1인대회에서 코딩을 할 때, 코딩하다가 멍을 때리는 순간이 꽤 많습니다. 여러 이유가 있겠지만, 이 멍을 때리는 시간을 줄이는 것이 구상의 목적입니다. 저는 변수 이름 정하는 것이 오래 걸리는 편이라서 구상 단계에서 변수명을 전부 정하는 정도까지 하는 편입니다. (자신이 알아볼 수 있을 정도로만 작성해도 됩니다만, 자세하게 할수록 좋습니다) 테크닉이 좋다면, 구상 단계에서 코딩이 얼마나 걸릴지도 예측이 가능합니다.


저어번 연습때 제가 한 손코딩입니다. (저도 잘 못 알아보겠지만..)

 

2. 디버깅

 

 예제가 안 나오는 경우의 디버깅은 상대적으로 쉽기 때문에 코딩이 끝나자마자 하는 것이 대부분 좋습니다하지만 WA후 디버깅은, 남은 문제가 있다면 무조건 컴퓨터를 양보해야 합니다. 그래야 문제들이 순차적으로 굴러갈 수 있습니다.

 

 ICPC에서 WA를 받은 뒤 컴퓨터를 양보하고, 밖에서 디버깅을 하려면 어떻게 해야 할까요? 일단 제출과 동시에 인쇄한 뒤, WA를 받으면 오는 인쇄물을 보면서 코드를 봅니다. 그리고 자신의 구상과 다르게 써진 부분을 찾습니다.

 

 종이만 보면서 하는 디버깅은 매우 어렵지만, 연습으로 가능하게 할 수 있습니다. 어떻게 해야 잘 할 수 있을까요저도 잘 모르기 때문에 알게 되었을 때 다시 써보겠습니다. 확실한 것은, 틀렸을 때 바로 디버그 모드로 들어가는 행동으로는 이것을 연습할 수 없을 것입니다.


3. EndTime 팀 전략

 

 모든 문제에 대해 저는 풀이와 코딩 일부 구상을 담당하고, 나머지 단계를 도토리가 담당합니다. 그러니까 저는 코딩을 절대 하지 않습니다이렇게 보니 제가 하나도 안하는 것 같군요.

 

 연습 초기에는 평범한 다른 2인팀처럼 전략을 세웠습니다. 서로 다른 문제를 풀고, 안 풀릴 때 같은 문제를 풀고, 각자가 푼 문제는 각자가 코딩합니다. 이 전략은 2명이 풀이를 생각하는 것과 코딩하는 것을 잘 맞물리게 한다면 완벽한 호흡을 보여주지만, 풀이와 코딩의 밸런스가 깨지면 잘 안 굴러갑니다. 연습 때 풀이만 3개 남았는데 코딩을 못했다, 혹은 풀이 나온 것이 없어서 문제를 못 풀었다, 혹은 두 명이 동시에 풀이를 생각하는 경우 코딩을 동시에 들어갈 수 없어 충돌이 나는 경우도 있습니다.

 

 연습을 통해 제가 풀이를 간략하게 구해서 전달하는 것이 제가 코딩까지 하는 것보다 더 빠르다는 것을 확인했습니다. 이것은, (풀이 전달 시간) + (도토리 구상, 코딩 시간) < (제 코딩 시간) 이라는 뜻입니다. 거기다가 제가 풀이를 완벽하게 끝내는 것보다, 풀이를 간략하게 구상한 뒤 도토리가 끝내는 것이 더 빨랐습니다. 정확히는 제가 수식을 계산하고, 예외처리를 하는 것에 상대적으로 너무 약했습니다.

 

 그래서 저희가 찾은 전략은 이렇습니다저는 문제를 읽고, " dp식을 세우거나, 식을 계산하면 끝나"는 수준까지 생각하여 전달하는 것만 하고 있습니다. 도토리는 코딩을 하지 않을 때는 문제를 읽고, 풀이를 같이 생각하고, 코딩할 것이 생긴다면 코딩을 합니다. 여기에는 코딩 구상, 식 정리를 포함합니다.

 

 이 전략의 장점은 절대 코딩이 충돌하지 않는다는 것입니다. 각자가 할 일이 정해져 있어 할 일에만 집중할 수 있습니다. 풀이가 쌓이는 경우는 딱히 문제가 되지 않고, 풀이가 비어있는 경우 2명이 힘을 합칠 수 있기 때문에 더 빠르게 해결이 가능합니다. , 풀이를 항상 공유하기 때문에 풀이가 잘못되는 경우가 매우 드물게 일어납니다.

 

 이 전략의 단점은 풀이 전달 시간이 아깝게 느껴집니다. (하지만 문제를 같이 생각하고 있다면 약간 줄어듭니다) 그리고 코딩 구상과 디버깅 단계를 컴퓨터 밖에서 할 수 없습니다. 코딩스타일이 비슷한 덕에 디버깅을 어느정도 할 수는 있지만, 적극적으로 도와줄 만한 단계는 아닙니다.

 

4. MolaMola 팀 전략

 

 2인 팀 전략이 고정된 상태에서 한 명이 추가되었습니다. 저는 그대로 코딩을 안하고 풀이만 넘겨주는 역할을 했고, 상수와 도토리 2명이 반반씩 코딩을 하기로 했습니다. 이 경우 2인 팀의 단점인 코딩 구상 시간과 디버깅 시간이 공중으로 뜬다는 점이 해결되었고, 풀이 전달 시간도 한 명이 코딩을 하고 있기 때문에 아깝지 않아졌습니다.

 

 (단점은 없나요?) 일단 저희 3명 조합으로는 딱히 단점이 없습니다만, 일반적인 팀에서 사용하기에는 어렵지 않을까요? 풀이 전달이 일반적으로 시간이 많이 드는 작업이라서 대부분의 팀에서는 잘 안합니다. 그 외에도, 실제로 해 보면 많은 단점이 보이지 않을까 싶어요.


 몇 달 전, GP of Spb에서 잘못된 판단으로 제가 코딩을 잡아서 3시간을 깡으로 날린 적이 있습니다. 이 전략은 2명이 약간 말리는 것 까지도 어떻게든 커버가 됩니다만, 한 명이 말리면서 잘못된 선택을 하는 경우는 돌이킬 수 없는 것 같습니다. 때문에 팀 호흡을 맞추기 위한 연습을 많이 해야만 했습니다.

 

5. 정리


 이런 전략을 선택한 이유는 각자의 효율을 극대화시키기 위해서 입니다. 각자의 장단점을 서로가 최대한 보안하는 동시에, 시너지 효과를 낼 수 있도록 하고 있습니다. 저는 다른 두 누텔라 팀원에 비해 코딩을 매우 못하지만, 코딩을 안하기 때문에 전혀 문제가 없습니다. 도토리는 자신의 장점을 활용하기 위해 코딩을 최대한 많이 하고, 상수는 2인 전략이 손해가 없도록 빈 공간을 채우고 있습니다.


 3명이 아무 전략 없이 문제를 해결하는 것 보다 더 좋은 방법이 있다는 것만으로도, 전략을 다시 한 번 되짚어보는 것이 좋을 것 같습니다. 개인적으로 구성원들이 어떤 특징을 가질 때 최선의 전략은 어떤 것인지에 대해 궁금하기도 합니다.


끝!


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함