SRM 326을 풀었어야 하는데 번호를 잘못 보고 이걸 풀었다.
시간 제한 1시간 10분을 두고 풀었는데, 30분을 남기고 약 40분동안 3문제를 모두 제출했다. 오!!
결과는 다음과 같다.
- Easy : 241.19 / 250
- Mid : 437.81 / 550
- Hard : 695.30 / 550
왜 이렇게 빨리 풀었지? 하고 좋아했지만, 200번대 SRM이라 그런 것 같기도 하고, 좀 쉽기도 했다.
그렇지만 엄청난 집중력으로 하나도 틀리지 않고 빠르게 풀려서 기분은 좋았다.
_____________________________________________________________________
정리해보면, Mid와 Hard에서 다른 사람의 코드를 통해 배울 수 있는 것들이 많았다.
** Mid에서는, 3개의 값 a, b, c 중 최대값과 최소값을 찾는 작업을 반복해야 했는데,
나는 minValue = min(minValue, min(a, min(b, c))); 와 같이 썼다. max도 마찬가지로.
그러나 훨씬 더 좋은 방법이 있었는데, 다음과 같다.
int t[3] = {0, 0, 0}; /* 각각의 t에 값을 저장하는 작업을 끝내고 난 뒤, 정렬한다. */ sort(t.begin(), t.end()); minValue = min(minValue, t[0]); maxValue = max(maxValue, t[2]);
이것이 유용한 경우는, 정렬로 인해 시간을 손해본다고 하더라도 감수할 수 있고,
코딩이 훨씬 간편해지는 경우이다. 시간이 남는다면 n >= 4 부터는 이렇게 쓰는 것이 더 좋을 듯 하다.
주의 : sort() 함수는 벡터에만 사용 가능한 게 아니라, 일반 정수 배열에도 사용가능하다 !!
** Hard에서는, next_permutation() 을 구현하는 법이 정확히 기억나지 않아 직접 코딩했는데,
풀고 보니 그것을 쓰는 것이 훨씬 간편하게 구현할 수 있었다. rng_58의 코드가 깔끔했다.
do { 수행할 작업; }while(next_permutation(per.begin(), per.end()));
이렇게 쓰는 것이 보통이다.
Hard를 다시 풀면서 잡히지 않는 에러가 있었는데, vector<int>에 범위를 초과하여 대입을 하려 한 것이다.
그런데 이상하게 특정 example에서만 uncaught exception 이 일어나서 잡는 데 한참 걸렸다.
메모리를 초과해서 쓰는 경우도 이 에러가 나지만, 이처럼 배열을 벗어나서 쓰는 경우에도 가끔씩
런타임이 아니라 uncaught exception 이 일어날 수 있다. 조심하자.
** 종합해서 주의할 점
1. 테스트용 출력은 지우고 낼 것
2. 그냥 구현만 하면 되는 문제여서, 추가 example을 테스트하지 않고도 맞았지만,
다음에는 그렇게 하지 말 것.
'알고리즘 대회 > TopCoder SRM 연습' 카테고리의 다른 글
SRM 346 (0) | 2015.11.24 |
---|---|
SRM 공부 방법 (0) | 2013.06.02 |
SRM 321 ~ 330 (0) | 2013.05.31 |
SRM 313 ~ 320 (0) | 2013.05.10 |