이번에도 부진했다. 2008 년 11월 부터는 계속 gray 에 머문듯... ㅠㅠ

Level1 만 간신히 풀고 룸 9등, Div 379/609 였다. Rating 은 799 (+23) 로 소폭 상승했다.

Level1 - KnockoutTourney ( 168.52 Passed System Test )
1 번부터 N 번까지 플레이어를 나열해 놓고 인접한 숫자의 2 명씩 짝지어서 토너먼트를 벌인다. 당신과 당신의 라이벌 번호표가 주어질 때, 당신이 라이벌과 만나는 것은 몇번의 토너먼트 게임이 이루어 진 후인지를 계산하는 문제이다. 실제 SRM 에서는 배열을 잡아놓고 토너먼트를 시뮬레이션 하면서, 같은 게임 군에 속하는 플레이어들을 같은 값으로 매핑하는 형태로 꽤나 복잡하게 풀었다. 사실은 배열도 필요없고, 1-2, 3-4 에서 1-4, 5-8 ... 과 같이 매 게임마다 커버되는 플레이어 번호의 범위를 증가시키면서 당신과 라이벌이 같은 범위에 들어오는 순간만 체크하면 된다.



포럼을 보니 Petr 은 아래와 같이 간단하게 풀었다. ㅠㅠ


Level2 - ShufflingMachine ( Opended )
문제 description 이 도통 이해가 안가던 문제. 한참 읽어봐도 이해가 안가다가 helloneo 의 해석을 읽고 겨우 문제를 이해했다. 내용을 이해해보니 단순 시뮬레이션 문제였다. ( 그래서 Div2의 경우 submit 비율은 낮지만 submit 한 사람들의 성공률은 꽤나 높았다. )

카드를 셔플하는 방법이 shuffle 벡터로 주어지고, 최대 셔플 횟수가 주어진다. 당신은 초기 카드 배치를 자유롭게 할 수 있다. ( 이 말이 의미하는 것은 결국 최종적으로 셔플한 후에 받는 카드의 순서는 마음대로 할 수 있다는 뜻이 된다. ) 셔플이 끝난 후 특정 slot 의 카드들을 받는다 할때, 자신이 원하는 카드를 받을 기대값을 구하는 문제이다.

실제 시뮬레이션으로 매번 shuffle 을 하면서, 매 shuffle 마다 카드를 받을 수 있는 slot 에 들어오는 카드의 인덱스들을 카운트 한다. 그리고 난 후 소트하여 ( 소트를 해도 되는 이유는 앞서 말했듯이 원하는 카드의 순서를 자유롭게 배치할 수 있기 때문이다 ) 가장 많이 등장하는 카드들의 숫자를 센 후, shuffle 횟수로 나누면 기대값이 된다. 매번 shuffle 마다 받을 수 있는 카드의 갯수를 구할 수 있으므로, 매 shuffle 하면서 받을 수 있는 가장 많은 카드의 갯수를 모두 더한 후, 이 값을 shuffle 로 전체를 나누면 된다.


Level3 - DistinctDigits ( Opened )
Not Yet.

'TopCoder' 카테고리의 다른 글

TopCoder SRM 426 - 2008/11/23  (0) 2009/01/16
TopCoder SRM 425 - 2008/11/13  (0) 2009/01/16
TopCoder SRM 424 - 2008/11/06 (완)  (0) 2008/11/12
TopCoder SRM 423 - 2008/10/29  (1) 2008/11/02
TopCoder SRM 422 - 2008/10/19  (0) 2008/10/25
TopCoder SRM 421 - 2008/10/09  (0) 2008/10/12


ACM-ICPC 이후에 치룬 매치.
참 오래간만에 한꺼번에 정리하는 로그라서 기억이 좀 가물가물 하긴 하다. ㅋ
2008 ACM-ICPC 전후로 내 TopCoder Rating 은 상당한 부진속에 빠져 있었는데, 이번 매치에서는 정말 오래간만에 Level1 을 틀리면서 776 으로 레이팅이 급격히 하락했다 ㅋ

문제들이 평소보다는 좀 어려운 느낌이었다. 룸 12 등, Div 541/1079, Rating 은 776 (-48).

Level1 - InverseFactoring ( 182.55 Challenge Succeeded )
벡터 p 에 어떤 수 N 의 모든 약수들이 주어질 때, N 을 구하는 문제이다. 이때 입력되는 약수들 중에서 1 과 N 은 제외된다.
문제가 아주 심플한데, 사실은 좀 tricky 했다.

이 문제를 틀린 이유는 SRM 당시 접근을 잘못하여, p 의 가장 큰 약수에  2 부터 입력 범위까지 소수들을 하나씩 곱해서 candidiate 숫자를 만든 후, 이 candidate 숫자가 p 의 모든 수에 대해서 나눠지는 첫번째 숫자를 답으로 체크했는데, 사실은 답은 p 에 속한 숫자의 곱으로만 이루어져야 하므로, 소수의 리스트를 뽑아서 곱해보는 것은 전혀 엉뚱한 접근이었던 것이다.

어떤 수 N 의 약수를 a 라 할때, N/a 또한 N 의 약수가 된다. 즉, N 을 구하기 위해서는 두 약수를 곱하면 되는데, 가장 큰 약수를 N 으로 나눌 때 나오는 값은 당연하게도 가장 작은 약수가 된다. 그러므로 이 문제는 간단하게 입력된 p 중에서 가장 큰 원소와 가장 작은 원소를 꺼내서 곱해주면 된다. 첼린지 케이스로 걸린 것은 p = {5} 와 같이 N 이 제곱수 형태로 이루어지는 경우였다.



Level2 - CrazyBot ( Opened )
격좌 좌표에서 동서남북으로만 이동이 가능하며, 이미 이동한 곳으로는 이동하지 않는 경우를 생각해 보자. 총 이동거리가 N 으로 주어질 때, 최종적으로 이동한 위치가 이미 이동한 곳은 한번도 지나지 않았을 경우의 수를 구하는 문제이다. 이 문제에서는 동서남북 으로 이동할 확률이 주어진다.

이런 형태의 문제는 DFS 로 푸는 것이 정형화 된 솔루션 같다. N 이 최대 14 이므로 4^14 경우가 될 수 있는데, 이미 지나온 곳은 다시 방문하지 않으므로 실제로는 경우의 수가 대폭 줄어든다. 동서남북 이동하는 재귀 함수에서 매번 각각의 방향으로 이동할 확률을 곱해서 넘겨주고, 최종적으로 모두 이동했을 때 해당 위치에 있을 확률들을 전부 더하면 답이 된다. 이런 유형은 정말 끊임없는 연습만이 대안인 것 같다. Editorial 보고도 푸는데 한참 걸렸다 ㅋ



Level3 - PiecesMover ( Opened )
5*5 의 격자에서 최대 5 개의 말이 있다. 이 말들이 모두 인접하게 하기 위한 각 말들의 이동 횟수의 합의 최소값을 구하는 문제이다. 입력 사이즈도 그렇고, BFS 로 푸는 것이 딱 보이는 문제이다. 아직 풀지는 않았다. Not Yet.


'TopCoder' 카테고리의 다른 글

TopCoder SRM 426 - 2008/11/23  (0) 2009/01/16
TopCoder SRM 425 - 2008/11/13  (0) 2009/01/16
TopCoder SRM 424 - 2008/11/06 (완)  (0) 2008/11/12
TopCoder SRM 423 - 2008/10/29  (1) 2008/11/02
TopCoder SRM 422 - 2008/10/19  (0) 2008/10/25
TopCoder SRM 421 - 2008/10/09  (0) 2008/10/12


개인적으로 대단히 기억에 남는 SRM 이다.
우선, ACM-ICPC 대회 예비소집일에 있던 SRM 이란 점.
이날 어찌나 바쁘던지... 낮부터 저녁까지 예비소집에 다녀온 후에, 밤에는 학교에 가서 특별 세미나 수업을 듣고, 8시에 끝나자마자 바로 부랴부랴 집에와서 TopCoder Arena 에 접속해 보니 이미 SRM 은 시작한지 10 여분이 지난 상태였다.

어쨌든 이날 나온 문제들이 쉬운 편이라 나름 기대를 하면서 열심히 풀었지만... 결과는 씁쓸하다.
Level 1 통과, Level 2 는 한가지 착각을 해서 첼 당하고, Level 3 도 시간만 있었으면 충분히 풀수 있었는데...

특히나 Level 2 를 첼린지 한 사람이 학교 후배이자 ACM-ICPC 대회장에서 만날 녀석이란 점에서 무척이나 부담이 되었다. -0-;; 
( 그래서 ACM-ICPC 대회 성적이 아쉽게 나왔나?? 그나마 위안? 이 되는 건 이 후배는 ACM-ICPC 대회 성적으로 이겼다 -0- )

룸 11등, Div 438/740, Rating 은 824(-19) 로 다시 하락했다... ㅋ

Level 1 - MagicSpell ( Coding Time 09:33, 225.55 Passed System Test )
쉬운 문제인데 파악에 시간이 좀 걸렸다.
간단한 형태의 encryption 과 decryption 하는 것을 묻는데, 임의의 스트링 spell 이 주어졌을 때, 이 스트링 내의 모든 A 와 Z 만 추출하여 이 A 와 Z 의 순서를 reverse 한 후에, 원래 스트링의 A 와 Z 가 위치한 자리에 끼워넣는 것이 문제이다. A 와 Z 를 추출한 후에 reverse 하고, 다시 spell 에 끼워넣기 위해서 tmp 스트링 한개를 사용해서 쉽게 해결이 가능하다.


Level 2 - ProductOfDigits  ( Coding Time 19:04, 362.48 Challenge Succeeded )
쉬운 문제인데 참 아까웠다. 숫자 N 이 주어질 때, 제곱수의 형태로 N 을 만들 수 있는 digits 의 제곱승이 최소가 되도록 구하는 것이다. 즉, N 의 모든 소인수 중에서 1 ~ 9 의 숫자가 이루는 지수의 최소값을 구하는 문제이다. 처음에는 2 부터 9 까지 N 에 대해 나누어보면서 얻을 수 있는 모든 소인수들을 구해서, 이 소인수들의 지수승을 구했는데, 이렇게 할 경우 6 = 2^1*3^1 보다는 6 = 6^1 으로 구하는 것이 지수의 값이 최소가 되도록 할 수 있게 된다. 그러므로 역으로 9 부터 2까지 N 에 대해서 brute force 하게 나누어 보면서 구할 수 있는 지수승을 모두 더하면 답이 된다.


Level 3 - BestRoads ( Opened )
MST 문제.
N 개의 도시를 연결하는 도로 상태가 연결("Y") 또는 연결되지 않음("N") 으로 주어지는 N*N 크기의 string 벡터가 입력으로 주어지고, index 가 낮을 수록 우선순위가 높다고 할 때, 전체 도시에서 우선순위가 높은 M 개의 도로를 뽑아낸다고 할 때 각각의 도시마다 몇개의 도로가 포함되어 있는지를 출력하는 문제이다.

일반적인 MST 와는 달리 도시간의 도로에 직접 값이 주어지는 것이 아니라 index 가 작은 도시가 우선순위가 높으며, 도시간에 도로를 연결하는 것이 아니라 이미 연결되어 있는 도시간의 도로중에서 숫자를 카운트 하는 것이므로 우선순위 순서대로 연결된 도로를 하나씩 카운트하면서 M 값을 하나씩 빼면서 도로를 제거해 나간다. 만약 도로를 전부 카운트 했음에도 M 이 남는다면 답을 찾을 수 없는 경우이므로 -1 을 출력한다. 이 문제에서 이미 연결되어 있는 도시들의 그래프 중에서 MST 를 찾기 위해 Kruskal 알고리즘을 돌릴 때 N*N 벡터를 루프 돌면서 먼저 등장한 도시간에 연결이 되어 있다면 이 도로를 하나씩 카운트 해 나간다.

'TopCoder' 카테고리의 다른 글

TopCoder SRM 426 - 2008/11/23  (0) 2009/01/16
TopCoder SRM 425 - 2008/11/13  (0) 2009/01/16
TopCoder SRM 424 - 2008/11/06 (완)  (0) 2008/11/12
TopCoder SRM 423 - 2008/10/29  (1) 2008/11/02
TopCoder SRM 422 - 2008/10/19  (0) 2008/10/25
TopCoder SRM 421 - 2008/10/09  (0) 2008/10/12