2012년 code jam round 1A를 읽고 문제 풀이에 대해 생각 까지만 해본 내용들 정리.

http://code.google.com/codejam/contest/1645485/dashboard

Problem A. Password Problem


password를 typing 하다가 말고, 아 틀렸나? 하고 생각이 들 때,

1. 계속 typing을 하는 것이 낫나

2. 지우고 typing을 하는 것이 낫나

3. enter 쳐버리고, 처음부터 다시 typing하는 것이 낫나

기대값을 구하기.


첫 번째 문제라서 그나마 쉬운 편이다. 알고리즘이랄 것이 많이 없고, 구현만 잘하면 된다. 내가 구현하면 2.5시간 쯤 걸릴 것 같다. ^^;;

문제 examples에서 계산 방법을 다 설명으로 써놨더라고.

그런데, 막상 구현을 하다보면 막힐 수도 있다. 경우의 수에 따라서 probability와 keystrokes 값을 각각 구해야 하는데, 이 경우들을 어떻게 정의해야 좋을지 막막할 수 있다.

막연히 다차원 배열로 생각하자면, 이미 입력한 keystrokes 개수에 따라서 차원이 마구 늘어나니 힘들다.

1차원 배열이라고 생각하되, 각 경우의 수에 맞는 값을 하나씩 정의하는 것이 좋겠다. 그렇다면, 각 경우의 수를 어떻게 나열하느냐가 관건인데, 각자 프로그래밍 하기 좋은 방법으로 한 가지 원칙을 설정해서 나열하면 되겠다.

그 중 가장 이해가 잘 가는 방법은 2진수를 그대로 사용하는 것이다. keystrokes가 맞는지 안맞는지를 각 자릿수 bit로 생각하면, 2^n만큼 숫자의 2진수 안에 빼곡히 index를 채워넣을 수 있다.

index를 정의했다고 해서 배열을 사용하면 large input 은 통과할 수가 없다. small input은 통과하게 해놨나보다.

배열을 만들어두지 않고, 각 경우의 값을 dynamic하게 계산하는 것이 좋겠다.

계산하는 것도 모든 index에 대해서 계산하면 large input을 통과할 수가 없다. 시간이 부족해서.

겹치는 것들은 한 번씩만 계산한다.

probability를 계산할 때는 1 bit의 개수가 동일한 것들에 대해서 한 번씩만 계산한다. 이건 어떻게 알아내지? bit를 shift해가면서 세야 하나?

keep typing 하는 경우에 대한 keystrokes 계산은 특정 2^n-1 숫자보다 큰 경우와 그렇지 않은 경우로 나눠서 한 번씩만 계산한다.

m번 backspace 하는 경우 계산은 2^n-1보다 작은 경우와 그렇지 않은 경우로 나눠서 한 번씩만 계산한다.


2진수 계산 연습과 확률 계산 연습을 조금씩 해 놓으면 좋겠다.


한편, google solution에는 엄청 간단한 수식으로 풀 수 있다고 써 있는 것 같다. ^^;;


Problem B. Kingdom Rush

다음 문제도 크게 어렵지는 않을 것 같다. 내가 구현하면 2+2시간은 걸리겠지만 ㅋㅋ.

greedy한 방법으로 풀면 되지 않을까 생각한다. 그렇게 해봐서 안되면 망하는 거고.

무조건 별점 2개짜리 먹기부터 다 채운다. 가능한 것부터 아무거나.

끝나면, 별점 1개짜리 중 먹을 수 있는 것을 먹어본다.

계속 반복해도 도달할 수 없는 것이 없게 되면 Too bad.


나중에 google solution을 봤더니, 다행히 greedy algorithm으로 푸는 게 맞다고 하네. ㅎㅎ.

그렇다면야, 2시간이면 풀 수도 있었겠다.


Problem C. Cruise Control

이 문제 풀이 방법까지는 생각도 못했다. 

나는 문제를 읽는 것도 하나 당 15분 이상씩 걸리고, input, output 처리만 1시간은 걸리는데, 문제를 15분 만에 푸는 괴물들은 도대체 뭐지..

이건 풀기를 시도하더라도 생각해야 할 조건도 종종 생길 것 같다. 차 길이 등.

동시에 같은 거리에 2개 이상의 차가 없는지만 계산하는 방법이 있겠다. 

1초마다 모든 차를 이동해가면서 simulation해봐도 small input은 풀 수 있을지도 모르겠다. 보장 못하지.

simulation하는 경우는 backtracking까지 하는 거면 더 어렵겠다. 차가 모두 앞으로 등속이동을 하니, backtracking이 필요 없을 것 같기도 하다. 딱 한 경우만 나오겠네.

차 3개씩의 모든 set에 대해서 같은 시각에 같은 위치에 있는지를 검사해볼 수도 있겠다. large input까지는 안되겠지?


google solution 을 읽다가 깨달았는데, 차가 추월할 때, 옆으로 순식간에 이동하더라도 그 순간 양측에 차가 없어야 된다는 조건을 구현에 넣기가 쉽지 않았을 것 같다.


아, 해설도 열라 기네. 해설을 읽고 풀으라고 해도 5시간 이상 걸리겠다.

영어 공부부터 해야 할 판.










'공부 > Computers' 카테고리의 다른 글

Computer vision 책 추천  (0) 2012.07.16
freemarker manual  (0) 2012.05.31
Havard extensions는 sample 밖에 없기도 한다  (0) 2012.05.27
ai 하나 별로  (0) 2012.05.26
tomcat 사용방법에 대해 공부하기  (0) 2012.05.20
Programming scala 책을 처음 읽기  (0) 2012.03.24
Scala 공부하기  (0) 2012.03.24
java 또는 web framework 공부하기 준비  (0) 2012.03.20
podcast rails 강의  (0) 2012.03.20
code jam 등 algorithms 문제 풀이 대비  (0) 2012.02.26
by 언제나19 2012. 4. 28. 19:38
| 1 |