제가 문제를 내면, 그것에 맞게 C언어로 프로그램을 하시면 됩니다. 어려운 문제는 아니지만, 프로그래머의 능력은 같은 코드도 효율성( 용량 최적화, 속도 최적화 )를 해야 한다는데 있습니다. 그래서, C언어 특이하게 프로그래밍하기를 적어볼까 합니다.
문제 : x가 6일 때, 3을 빼고, x가 3일 때 2를 빼고, x가 1일 때 1을 빼고, x가 0일 때 0을 뺀다. ( 물체가 x축으로 감속하면서 정지하는 프로그래밍 )
방법 1: 줄 수 줄이기( 70점 )
방법 2: 메모리를 이용한 속도 최적화 ( 90점 )
방법 3: 수식을 이용한 속도 최적화 ( 100점 )
힌트 1 :
if( x == 6 ) x = x - 3;
else if( x == 3 ) x = x - 2;
else if( x == 1 ) x = x - 1;
힌트 2 :
switch( x ){
case 1: x = x - 1; break;
case 3: x = x - 2; break;
case 6: x = x - 3; break;
}
| x = (x / 2 ) + (x % 2); 자세히 안따져보고 생각한건데...;; | |
| static const int a[] = {0,0,0,1,0,0,3}; x = a[x]; | |
| 빠른 연산자로 바꾸면.. x -= (x>>1) + (x&1); 일감은 이런 코드인데... 먼가 멋진것이 있으려나.. 곰곰.. | |
| 결과만 나오면 된다는 쪽으로 생각하면 x /= 2; 또는 x >>= 1; 이라고 쓸 수 있겠네요. | |
| 그러네요. 문제의 말에 속았네요. --; | |
| 윽... 나 무식해... ㅡ"ㅡ;; | |
| 2개의 답을 너무 쉽게 찾으셔서 제가 고민한 것이 없군요. ^^ | |
| 메모리를 이용한 최적화는 일반적으로 메모리사용량을 높이면, 속도가 빨라진다라고 하는 테이블 최적화입니다. 복잡한 계산이나 불규칙한 숫자 조합의 경우 필요한 계산을 미리 해 놓고, 참조만 하는 식의 방식입니다. 게임에서는 삼각함수의 계산에 대표적으로 많이 쓰고요. 오프젝트 패턴 움직임 프로그래밍에도 사용합니다. | |
| 수식을 이용한 방법은 고등학교 때 배운 수열공식과 같은 개념입니다. 즉, 숫자패턴과 일치하는 특정한 함수를 찾아서 그 함수를 프로그램에 바로 적용하는 겁니다. 문제는 이 문제에서도 조건을 4개로 한정시켰지만, 상황에 따라 더 많은 조건이 많아지면, 수열공식을 찾느니, 그냥 if문 쓴다라는 생각을 하게 되기도 하죠. 어찌하든 수열공식만 찾아낸다면, 메모리를 적게 쓰면서 속도최적화까지 할 수 있는 좋은 방법입니다. | |
| 고등학교 한달 다니니까 문제가 왠지 친근감이 드네요... | |
| 이번 문제는 조금 쉬웠네요.. 또 내주세요 ~_~)/ [오랜만에 찾아왔습니다.] | |
| x >>= 1; | |