본문 바로가기

(비정기) Dlbo's Post

2nd. Java Algorithm Contest 2009 -_-!

사용자 삽입 이미지

JAC 2009 자바 알고리즘 경진대회.

.... 역시 자바 코딩의 길은 험난합니다.

승질나드라구요 -_-....

1문제 풀고 왔습니다.

한문제 더 풀 수 있었는데 정신놓고 이거저거 손대다보니 이미 푼줄 알고 넘어갔더랩니다.... ㄱ-

저희 팀이 도착했을땐 11시 40분경,

대회 등록 시간은 12시 30분부터 였습죠.

저건 11시 40분에 아무도 없던 데스크...-_-

"그랜드 볼룸"으로 오라길래 갔는데

왜 그랜드 볼룸인지 모르겠심다 ㅋㅋㅋ
사용자 삽입 이미지

여기부턴 폰으로 찍은터라 화질이 구립니다.(디카 충전을 못한 바람에 사진도 없습니다 ㄱ-;;;)

저희 팀은 뭐 노트북 3대...

다른 팀도 3대인데도 불구하고

저희팀 노트북들이 제일 크고 복잡하더군요 -_-;

세대중 제꺼만 비스타에서 돌리고, 나머지는 XP에서 돌렸습니다.

사용자 삽입 이미지


대회 개막사 직전 찍은 한컷.

.....

그냥 뭐 개판이랄까요 ㅡ.,ㅡ;

--------------------------------------------------------------------------------------------------

문제를 모두 수거해가버리는 안습 사태 덕분에 문제를 완전히 기억하진 못합니다. -_-;;;

1번 - 주사위굴리기

한 면에 빨간 점이 있고, 나머지는 모두 빈칸인 주사위가 7 X 7 체스판 위에 있다.

주사위는 정확히 한 칸 위에만 있어야 하며, 체스판의 좌표는 일반적인 체스판처럼

a~g, 0~6을 이용해 가로, 세로를 표기한다.

입력은 아래와 같다.

<목적지> <출발지> <방해물1> <방해물2> .... <방해물n>

이 경우 목적지에 가는 경로를 아래와 같이 출력해야 한다.

<목적지> <출발지> : <경로1> <경로2> ... <경로n>

예시는 아래와 같다.

입력

g0 a0

출력

g0 a0 : a0 a1 ..... g0

g0 a0 : no path (불가능한 경우)

(참고로... 보시면 아시겠지만, 방해물의 갯수 n따위 없습니다.

-_-;;;;; 파싱하기도 난감하고... eof까지 받는건지도 명확히 안나와 있죠.

참 개난감합니다;;;;;)

2. 복소수행렬 곱셈

복소수행렬을 2 X 2부터 최대 9 X 9 사이즈로 둘을 받아, 곱셈을 표현한다.

예를 들면, 아래와 같다.

입력

[x + yi w + zi, a + bi c + di] * [e + fi g + hi, j + ki l + mi]

출력

[x + yi w + zi] X [e + fi g + hi] = [o + pi q + ri]
[a + bi c + di]    [j + ki l + mi]     [s + ti u + vi]

(..... 니미. 자바로는 파싱하기 제일 더러운 Tree Summing과 유사한 타입입니다.

그리고 도대체 뒤에 계산결과는 어떻게 되먹는건지... -_-;;)

3. 같은 블럭 없애기

어떤 크기의 판에 p, q, r, s 4가지의 블럭이 차 있는 면을 파일로(bubble.input) 입력받아

가로, 혹은 세로로 2개 이상의 블럭이 연속해 존재한다면 해당 블럭은 제거합니다.

왼쪽 위에서 부터 시작해 오른쪽 아래로 제거해 나가며,

왼쪽, 아래에 공백이 생길 경우 오른쪽 블럭을 왼쪽으로, 위 블럭을 아래로 당겨 빈칸을 채웁니다.

빈칸은 .으로 표시하며, 각 블럭의 위치는 p, q, r, s로 표현합니다.

입력받은 후, 최종적으로 제거 가능한 모든 블럭이 제거 될 때 까지의

모든 블럭 처리 과정을 표시하세요.

입력

pqrsqrs
prppsrq
rqrrrprq

출력

[start]
.qrsqrs      qrsqrs.
.rppsrq  -> rppsrq.
rqrrrprq      rqrrrprq

qrsqrs.       qrsqrs.
r..srq.    -> rsrq...
rqrrrprq      rqrrrprq

qrsqrs.       qrsqrs.
.srq...   ->  srq....
.qrrrprq       qrrrprq.

qrsqrs.      qrsqrs.
srq....   -> srq....
q...prq.      qprq....

q.sqrs.     qsqrs..
s.q....  -> sq.....
qprq....     qprq....
[finish]

(..... 쉽긴 쉬운데, 다른 팀원이 열내서 풀고 있던터라 그냥 뒀습니다.

결국 답이 안나왔죠. 자바 자체의 지저분한 입출력때문에 고생한 예시입니다.

FileBufferdStream 클래스를 써야 하는데 FileInputStream클래스를 써서 돌아가지 않았습니다.

뭐 FileBufferdStream 클래스라 해도 잘 돌아갈지는 미지수... -_-;

거기에 저런 독특한 출력을 요구하면서

중도 과정을 모두 출력하라니.... ㅡ.,ㅡ;

군말없이 그냥 하는게 맞지만.... 중요 알고리즘 구성보다 출력형태 맞추는게 더 힙듭디다 ㅡ.,ㅡ..;;)

4. 소수의 합

숫자 하나를 입력받아서,

4개의 소수의 합으로 나타내시오.

불가능하다면 Impossible을  출력하시오.

입력

24
36
46

출력

24 : 11 3 7 3
36 : 13 7 13 3
46 : 13 13 13 7

복수의 답이 존재할 수 있으며, 불가능한 경우 Impossible을 출력하시오

(.... 유일하게 그냥 풀어버린 문제입니다.

퍼포먼스 늘여보겠다고 10분만에 풀어놓고는 20분을 더 잡고 있었습니다만,

그냥 압축해 넣었습니다 ㅡ,.ㅡ;

이 문제... eof까지 받아야 하는거 같긴 한데, 이에 대한 얘기가 아무것도 없습니다.

-_-;;)

5. 최대영역 넓이구하기

어떤 크기 넓이의 영역에 몇개의 눈사람이 있다.

이 눈사람을 경계로 하여, 내부에 어떠한 눈사람도 갖지 않는 직사각형 영역중

가장 넓이가 넓은 영역의 넓이를 구하여라.

(죄송합니다. 이게 풀어야 되는데 까먹고 냅둔 문젠데...

입력 출력 형태를 잊었군요. -_-)

6. Side by Side 게임

7개 숫자가 연달아 붙어있는 수열을 입력받은 후,

붙어있는 두 숫자의 합, 차가 해당 수열 내에 존재하지 않도록 재배열하라.

입력

7204567

출력

2056747

(..... 그냥 DFS 때림 되는데요.

...... 정말 포인터와 pass by referrence가 명확한 C가 미친듯이 그리운 문제였지요.

.... 제기랄 -_-;;; 이 또한 eof까지 받아야 할 듯 한데 아무런 얘기가 없지요.)

-------------------------------------------------------------------------------------------

정말 C/ C++이면 쉽게 풀 문제들이었지만,

언어의 벽은 높더군요.

뭐 기본 지원 라이브러리/API를 완벽하게 숙지하지 못한 탓도 있지만

문법적으로 C/C++에 비해 심히 경직되어 있는 Java로는

순수하게 ADL로 알고리즘을 익힌 사람이 아닌 한

생각해낸 알고리즘을 고대로 코드로 옮겨버리는건 힘들지 싶습니다.

C/C++은 특성을 이용한 변태짓으로 돌릴 수 있지만 Java는 안되거든요 ㅡ,.ㅡ;;;

Java건 뭐건 언어에 상관없이 그냥 다 짜버리는 괴물분들 앞에선 그냥 침묵 & 묵념.

-_-...;;

아직 갈길이 멀었음을 몸으로 느끼고 있답니다.