PC/UVa ID : 110207/10258

시작하기에 앞서...

이 문제를 통해서 다시 한번 생각하게 된 것은 "명확하게 문제가 무엇인지 파악하는 것" 이 알고리즘 개발의 제일 첫번째 할 일 이라는 것 이다. 이번 문제를 잘 이해 하지 못해서, 여러곳의 글들을 보았지만, 다들 각자 다르게 이해를 했는지, 각자 말하는게 달랐다.

그래서 우선 내가 이해한데로 풀고, 문제의 모범 답안(?)을 보고 코드 리뷰를 했다. 이제서야 "점수 개산 방법"이 무엇인지 알게 되어 정리를 하게 된다.


개요

ACM ICPC의 점수 계산법을 구현하여, 참가팀에 모든 순위를 매기어 정렬시키고 1등 부터 꼴찌까지 출력 하라는 내용이다.

각 팀의 순위는 제일 많은 문제를 맞춘 순이며, 만약 맞춘 갯수가 동일한 팀이 있다면, 벌점이 제일 적은 팀이 순위가 높다. 만약 벌점 까지도 동일하다면, 팀원이 제일 적은 팀이 순위가 높다.

여기서 잠깐
현재 팀원의 수가 "무엇"인지 책에도 나와있지 않으므로, 팀원의 수를 파악할 방법이 없다. 그러므로 이 부분은 패스 했다.

벌점의 계산은 해당 문제의 첫번째 정답이 제출 됬을 경우, 그 정답을 제출 할때까지 들어간 시간(분)이고, 만약 해당 문제의 정답이 나오기 전까지 틀린답을 제출했을 경우, 무조건 20점의 벌점을 받는다. 만약 문제의 답이 맞춘것도 아니고 틀린것도 아니라면, 벌점을 주지 않는다.


입력

첫번째, 처음에는 케이스 넘버를 받는다. 이때 케이스 넘버를 받으면 한줄 공백을 준다.
두번째, 각 팀당 문제의 답들을 입력 받는다. 이때 공백 라인이 입력되면, 케이스의 종료이다.

문제에 대한 답을 제출할 경우 다음의 형식을 따른다.

숫자 숫자 숫자 문자 : 예) 1 3 3 C

  1. 첫번째 숫자는 팀의 ID 이다.
  2. 두번째 숫자는 팀이 푼 문제의 ID 이다.
  3. 세번째 숫자는 팀이 푼 문제의 시간(분) 이다.
  4. 네번째 문자는 제출한 답의 결과 인데, C - Correct(정답), I - Incorrect(오답), R - clarification Request(확인 요청), U - Unjudged(미심사), E - Erroneous submission(제출 오류) 의 문자 이다.


출력

다음의 형식을 따른다.

숫자 숫자 숫자

  1. 첫번재 숫자는 팀의 ID이다.
  2. 두번째 숫자는 팀이 문제를 정상적으로 푼 갯수 이다.
  3. 세번째 숫자는 팀의 벌점이다.

각각의 팀들은 1등 부터 순서대로 차례대로 출력 된다. 이때 모든 팀들을 빠짐없이 출력해야 한다. 각 케이스는 한줄 라인으로 구분을 짖는다.




사설

  1. 주석은 달 수 있는 만큼 자세히 달았다. 나중에 내가 리펙토링 할 때를 위해서
  2. 이번 문제를 풀때는 어떤 함수가 필요할 것이다 라고 예상하고, 전체 틀을 먼저 만들고, 작업에 들어갔다. 문제를 푸는 도중 몇개의 함수가 더 필요했지만, 대체로 "무엇을 해야 하지?" 란 고민 없이 바로 작업을 할 수 있어서 편했다.
  3. 입력과 연산을 확실히 나누었다. 문제의 답을 입력 받을 땐, 입력만 받아서 처리 했고, 연산이 필요할땐 연산만 했으며, 출력이 필요할 떈 출력만 했다. 이렇게 짜니, 코드 수정이 무척 편했다.
  4. 유닛 테스트 루틴을 따로 만들어 보았다. 여러가지 테스트 코드로 메인 루틴이 지저분해 지는것을 막을 수 있어서 코드 정리가 한결 쉬워졌다.
  5. 알고리즘을 생각할 때, "차근 차근 한줄씩 만들어 본다"의 방법을 써 보니 한결 생각하기 편해졌다.


posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요