[백준 1085 C++] 직사각형에서의 탈출

https://www.acmicpc.net/problem/1085

 

1085번: 직사각형에서 탈출

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램

www.acmicpc.net

 


해결전략

직사각형 중심을 기준으로 사분면을 나눈다고 가정한다. 사분면으로 나눈 상태에서 점(x,y)와 근접한 직사각형 변 2개과 길이를 비교하면 된다. 

 

점(x,y)와 직사각형 변과 최단거리는 다음 4가지 중 하나이다.

  • x
  • w - x
  • y
  • h - y

 


 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
using namespace std;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int x, y, w, h;
    cin >> x >> y >> w >> h;
 
    if (x > w/2)
    {
        if (y > h/2)
        {
            if ((w - x) < (h - y))
                cout << w - x;
            else
                cout << h - y;
        }
        else
        {
            if ((w - x) < y)
                cout << w - x;
            else
                cout << y;
        }
    }
    else
    {
        if (y > h/2)
        {
            if ( x < (h - y))
                cout << x;
            else
                cout << h - y;
        }
        else
        {
            if (x < y)
                cout << x;
            else
                cout << y;
        }
    }
 
    return 0;
}
cs

 

더 나은 해답

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
using namespace std;
 
int main() 
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int x,y,w,h;
    int tmp1,tmp2;
    cin >> x >> y >> w >> h;
 
    tmp1 = min(x,y);
    tmp2 = min(w-x,h-y);
    cout << min(tmp1,tmp2);
}
cs

 

 

#include <algorithm>에 내장된 min(), max() 메소드를 사용하면 더 쉽게 구할 수 있다.

min, max, sort 등 라이브러리를 활용할 수 있다는 사실을 자주 잊는다. 까먹지말고 활용해서 코딩시간을 줄이자.

 


 

'⭐ 코딩테스트 > 백준' 카테고리의 다른 글

[백준 10798 C/C++] 세로읽기  (0) 2023.04.19
[백준 2563 C/C++] 색종이  (0) 2023.04.19
[백준 10815 C++] 숫자 카드  (0) 2022.11.17
[백준 2566 C++] 최댓값  (0) 2022.11.16
[백준 10870] 피보나치 수 5  (0) 2022.07.23