알고리즘 대회/TopCoder SRM 연습

실수로 풀어버린 SRM 256

방랑여행 2013. 6. 17. 15:50

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