conjurer000   4년 전

int stairs[303]; // 각 계단의 점수

int arr[303][2]; // arr[i][0] : 전 계단을 밟지 않고 이 계단을 밟았을 때 최고점

                           // arr[i][1] : 전 계단을 밟고 이 계단을 밟았을 때 최고점

int max(int a, int b)
{
return a > b ? a : b;
}

//#define max(a,b) a>b? a:b


출력부분에 if문을 사용하지 않고 max함수를 통해 출력값을 결정했습니다.


int max() 함수로 풀면 문제 풀리는데 

#define max(a,b)로 만든 매크로 함수는 오류가 나네요.


arr[i][0] = max(arr[i - 2][0], arr[i - 2][1]) + stairs[i]; 이 부분에서

arr[5][0]이 75가 되어야 하는데 55로 나옵니다.

이 부분에서 +stairs[i]가 작동을 안하는 것 같습니다. 


그런데

arr[i][0] = (max(arr[i - 2][0], arr[i - 2][1])) + stairs[i];

이렇게 매크로함수 이용 부분에 괄호를 넣으면 제대로 작동합니다.

매크로 함수는 단독으로만 써야 하는 건가요?





alice   4년 전

매크로 함수는 단순치환입니다.

#define max(a,b) a>b? a:b을

arr[i][0] = max(arr[i - 2][0], arr[i - 2][1]) + stairs[i];에다가 치환하면

arr[i][0] = arr[i - 2][0] > arr[i - 2][1] ? arr[i - 2][0] : arr[i - 2][1] + stairs[i];


삼항 연산자의 범위가 stairs[i]까지 포함되었습니다. arr[i - 2][0] > arr[i - 2][1]가 true이면 stairs[i]는 더해지지 않겠죠.


반면에 말씀하신 괄호를 넣은 예는


arr[i][0] = (max(arr[i - 2][0], arr[i - 2][1])) + stairs[i];는

arr[i][0] = (arr[i - 2][0] > arr[i - 2][1] ? arr[i - 2][0] : arr[i - 2][1]) + stairs[i]


가 됩니다. 앞쪽의 삼항 연산자가 어찌됐든 stairs[i]는 무조건 더하게 되죠.


이런 문제점이 생길 수 있어 매크로 함수를 정의하실 때는 아래처럼 괄호로 최대한 묶는 것이 좋습니다.

#define max(a,b) ((a) > (b) ? (a):(b))

conjurer000   4년 전

아 그런거였군요! 감사합니다!

onjo0127   4년 전

매크로 함수는 웬만하면 안 쓰시는 게 좋아요

f() 라는 함수가 있을 때 매크로 함수로 max(f(), 100)를 호출하면

f() > 100 ? f() : 100 이기 때문에 f()가 더 크면 f()가 두 번 호출되서 예상치 못한 상황이 생기거나 상수 시간이 늘 수 있어요

댓글을 작성하려면 로그인해야 합니다.