[Quiz] The Blocks Problem

Etc... 2010. 4. 9. 17:53
반응형



출처 : UVa Online Judge [ http://uva.onlinejudge.org ]


이번 문제는 명령셋을 일괄적으로 입력받은 다음, 입력이 끝날 때 최종상태를 출력하는 것이 목표입니다.
처음에는 블럭의 총 개수를 입력받고 그 이후에는 명령셋을 입력받습니다.
( 명령셋의 입력은 "quit" 명령이 나올때까지 반복합니다. )

인식가능한 명령셋은 다음과 같습니다.

move a onto b
   a 블럭과 b 블럭 위에 다른 블럭이 있다면 해당 블럭들을 원래 위치로 복귀시킨 다음,
   a 블럭을 b 블럭위로 옮긴다.
   ex) a 위에 b 가 있고, c 위에 d 가 있을 경우, 'move c onto a' 라는 명령이 입력되면,
         a 와 c 위의 b, d 를 원래 위치로 옮기고, c 를 a 위로 옮긴다.

move a over b
   a 블럭 위에 다른 블럭이 있으면 해당 블럭들을 원래 위치로 복귀시키고,
   a 블럭을 b 블럭이 있는 블럭 기둥의 맨 위로 옮긴다.
   ex) a 위에 b, c 가 있을 경우 'move d over a' 라는 명령이 입력되면, d 는 c 위로 이동하게 됨.

pile a onto b
   b 블럭 위에 다른 블럭이 있으면 해당 블럭들을 원래 위치로 복귀시키고,
   a 블럭을 포함하여 a 블럭 위에 있는 모든 블럭을 b 블럭 위로 옮긴다.
   이 때, 블럭이 쌓인 순서는 유지되어야 한다.
   ex) a 위에 b, c 가 있고, d 위에 e 가 있을 경우, 'move a onto d' 라는 명령이 입력되면,
        d 위의 e 는 제자리로 옮기고, a 를 포함해 a, b, c 를 쌓인 순서대로 d 위로 옮긴다.

pile a over b
   a 블럭을 포함하여 a 블럭 위에 있는 모든 블럭을 b 블럭이 있는 블럭 기둥의 맨 위로 옮긴다.
   ex) a 위에 b, c 가 있고, d 위에 e, f 가 있을 경우, 'move a over d' 라는 명령이 입력되면,
        a 를 포함해 a, b, c 를 쌓인 순서대로 f 위로 옮긴다.

quit
   입력을 끝내고, 블럭들의 최종 상태를 출력한다.


※ 주의사항
  1. 같은 블럭에 대한 명령은 무시한다.
      ex) move a over a, move d onto d
  2. 같은 블럭 기둥에 있는 블럭들에 대한 명령은 무시한다.
      ex) (a, b, c 가 같은 기둥일 때...) pile c over a, move b onto c
  3. 그 외의 잘못된 입력은 무시한다.



다음은 'Accept' 받은 소스코드입니다.



블럭 수에 따라 메모리를 동적으로 할당 한답시고 한 점이랑... 함수 호출의 오버헤드를 줄이려고...
한방에 다 작성을 하다보니 코드가 많이 복잡해졌습니다..;;
요런걸~ '나쁜 코드' 예로 들면 딱일텐데 말입니다... 아.하.하.하... ^^;;;;
( 요런데서.. 개발 표현력이 떨어지는구나.. 하며 반성을 많이 하게 됩니다..;;;; )


겹치는 부분을 함수화하고 접근방식을 달리하면 훨씬 보기 쉽고 깔끔한 코드가 나올 듯 하지만..
'Accept' 받고 난 이후로는 뭔가 의욕이 떨어져 버렸네요..;; ^^;;;..

( 한 줄의 코드가 길어서 잘려서 보이는 코드가 있지만 긁어보니 제대로 긁어지네용.. )



반응형
AND