BOJ
BOJ #1085 직사각형에서 탈출
dbdb
2021. 1. 6. 18:27
문제
한수는 지금 (x, y)에 있다. 직사각형의 왼쪽 아래 꼭짓점은 (0, 0)에 있고, 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 x, y, w, h가 주어진다.
출력
첫째 줄에 문제의 정답을 출력한다.
소스코드(C언어)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define min(x, y) (x < y) ? x : y
int main() {
int x, y, w, h;
scanf("%d %d %d %d", &x, &y, &w, &h);
int tmpa = min(h - y, y);
int tmpb = min(w - x, x);
printf("%d\n", min(tmpb, tmpa));
return 0;
}
★주의
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define min(x, y) (x < y) ? x : y
int main() {
int x, y, w, h;
scanf("%d %d %d %d", &x, &y, &w, &h);
printf("%d\n", min(min(h - y, y), min(w - x, x)));
return 0;
}
원래는 위와 같이 풀었으나 틀린 답이 나왔다.
알고보니 매크로 함수를 사용할 때, 매크로의 모든 인자와 본문 전체에 (괄호)를 씌워야 한단다.
틀린 예시
#define min(x, y) (x < y) ? x : y
맞는 예시
#define min(x, y) ((x < y) ? (x) : (y))
만일 괄호를 씌우지 않는다면,
min(min(h - y, y), min(w - x, x))
위 코드가
( (h-y < y) ? h-y : y < (w-x < x) ? w-x : x) ? (h-y < y) ? h-y : y : (w-x < x) ? w-x : x
위와 같이 계산되어 의도하지 않은 순서로 연산을 하게 되는 것이다.
하지만 괄호를 사용해도 해결되지 않는 오류가 있으니 매크로 함수의 사용은 되도록이면 지양하는 것이 좋다고 한다.