Two Tables (#B)
문제파악
W(가로), H(세로) 길이를 가진 공간 위에 좌하단 우상단 좌표를 가진 직사각형(R1)과 가로와 세로 길이가 주어진 직사각형(R2)을 배치할 수 있게 하기 위해서 R1을 움직이는 최소 길이를 구해라 또는 그럴 수 없다면 -1을 반환
IDEA
-
직사각형 간 서로 접하지 않는다면 두 도형 간에 수직 또는 수평적인 선을 그을 수 있다는 것이다.
즉 겹치는 부분을 없애기 위해서는 수직 또는 수평적인 움직이는 것이 최소가 된다 -> 대각선 움직임은 낭비
-
따라서 두 직사각형을 떨어지게 두기 위해서는 두 직사각형의 가로 길이의 합이 W 이하이거나 세로 길이의 합이 H 이하여야 한다
-
수직 또는 수평 이동의 경우의 수는 4가지이다( 상,하,좌,우 )
CODE
#include <stdio.h>
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#define MAX(x, y) ((x) > (y) ? (x) : (y))
int main(){
int T;
scanf("%d", &T);
for(int t=0; t<T; t++){
int W,H, f_pos[2][2], s_pos[2], result = __INT32_MAX__;
scanf("%d %d", &W, &H);
scanf("%d %d %d %d", &f_pos[0][0], &f_pos[0][1], &f_pos[1][0], &f_pos[1][1]);
scanf("%d %d", &s_pos[0], &s_pos[1]);
if(s_pos[0] + f_pos[1][0] - f_pos[0][0] <= W){
result = MIN(result, MAX(0,s_pos[0] - f_pos[0][0]));
result = MIN(result, MAX(0, f_pos[1][0] - (W - s_pos[0])));
}
if(s_pos[1] + f_pos[1][1] - f_pos[0][1] <= H){
result = MIN(result, MAX(0, s_pos[1] - f_pos[0][1]));
result = MIN(result, MAX(0, f_pos[1][1] - (H - s_pos[1])));
}
printf("%d\n", result == __INT32_MAX__ ? -1 : result);
}
}
주의 사항
- 직사각형의 움직임이 상하좌우 라는 것을 알아야 한다
- 좌표를 생각하지말고 직사각형이 움직임만 신경 쓰면 된다
- 세세한 조건을 고려해야 한다. (ex. -1 반환 등)
실제 문제 풀이시에 1을 파악 했지만 2번 사항에서 R2 사각형의 좌표를 생각하며 코드를 구성해 코드가 복잡해지고 이로 인해 조건문을 하나 빼먹는 실수를 했다. 문제를 최대한 단순화 하는 게 중요하다
댓글남기기