문제 출처: https://www.acmicpc.net/problem/1085
1. 코드
#include <stdio.h>
int main(void)
{
int x, y, w, h;
scanf("%d %d %d %d", &x, &y, &w, &h);
if(w - x > h - y)
{
if(h - y > x) printf("%d", (x > y) ? y : x);
else if(h - y > y) printf("%d", (y > x) ? x : y);
else printf("%d", h - y);
}
else
{
if(w - x > x) printf("%d", (x > y) ? y : x);
else if(w - x > y) printf("%d", (y > x) ? x : y);
else printf("%d", w - x);
}
return 0;
}
2. 문제 해결 방식
이 문제는 정말 엄청나게 간단하다. 기본적인 산술만 할 줄 안다면 누구나 다 풀 수 있는 문제이다. 먼저 x, y, w, h를 전부 입력한다.
w와 h는 1,000보다 작거나 같은 자연수이고, x는 1보다 크거나 같고, w-1보다 작거나 같은 자연수이고, y는 1보다 크거나 같고, h-1보다 작거나 같은 자연수이다.
여기서 알 수 있는 것은 1 ≤ x ≤ w - 1, 1 ≤ y ≤ h - 1라는 2가지 조건을 알 수 있는데 그렇다면 조건을 통해 w - x ≥ 0, h - y ≥ 0이라는 조건 또한 도출할 수 있고, 이것들이 말하는 것은 (x, y) 점인 '한수'는 무조건적으로 직사각형 안에 존재한다는 것이다.
그리고 이해가 안 될 수 있으니 예제가 6 2 10 3이다. 한번 그려보자
빨간색이 (x, y) 점이고 파란색이 (w, h) 점이다. 그리고 회색 점선은 직사각형을 의미하는데 문제에서 요구하는 것은 저 회색 선을 나가거나 x선이나 y선을 나가는데 최소한의 거리인 것이다. 한마디로 w - x, h - y, x, y 중 누가 제일 작은지 찾으면 된다는 것이다. 예제를 대입하면 w - x = 10 - 2 = 8, h - y = 3 - 2 = 1, x = 6, y = 2이다. 그렇다면 제일 작은 것은 1이다. 그러면 정답은 1이 나오게 하면 된다.
전부 if 문으로 풀어도 되지만 나는 삼항 연산자를 사용했다. 왜냐하면 전부 if 문을 사용하게 된다면 글이 어쩔 수 없기 길어지고 길어진다면 자연스럽게 가독성에 별로 좋지 않기 때문에 삼항 연산자를 이용하여 조금 간결해 보이게 하였다.
3. 느낀 점
처음 이 문제를 보았을 때 소수 문제가 드디어 끝났다는 생각에 조금 기뻤다. 반복적으로 했던 것을 하니 지루해지기 때문이다. 그래서 이 문제를 기분 좋게 풀었는데 푸는 도중에 어째서 이런 간단한 문제가 수학 2에 있는지 의문이 들긴 했지만 일단은 풀었다. 이 문제는 그저 문제만 잘 읽으면 쉽게 해결할 수 있을 것이다.
'컴퓨터 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 3009번: 네 번째 점 C언어 (0) | 2020.03.29 |
---|---|
백준 알고리즘 4153번: 직각삼각형 C언어 (0) | 2020.03.24 |
백준 알고리즘 9020번: 골드바흐의 추측 C언어 (0) | 2020.03.20 |
백준 알고리즘 4948번: 베르트랑 공준 C언어 (0) | 2020.03.18 |
백준 알고리즘 1929번: 소수 구하기 C언어 (0) | 2020.03.14 |