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

위와 같이 계산되어 의도하지 않은 순서로 연산을 하게 되는 것이다.

 

하지만 괄호를 사용해도 해결되지 않는 오류가 있으니 매크로 함수의 사용은 되도록이면 지양하는 것이 좋다고 한다.