Algorithm/BOJ

[BOJ] 1085번, 직사각형에서 탈출(Python)

강승원 2021. 11. 30. 16:05

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

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

서론

 알고리즘 공부를 막상 시작해야할때 어떤 것 부터 풀어야할지 몰라서 solved.ac에서 class 2를 쭉 풀어보기로 했다.

class 1은 나중에 c++ 문법 공부하면서 풀 것이므로 지금은 건너 뛴다.

https://solved.ac/class

 

solved.ac - 문제 › CLASS

 

solved.ac

레벨 순으로 나열

맨 위에 있는 직사각형에서 탈출을 풀어보자

문제

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

입력

첫째 줄에 x, y, w, h가 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.

제한

  • 1 ≤ w, h ≤ 1,000
  • 1 ≤ x ≤ w-1
  • 1 ≤ y ≤ h-1
  • x, y, w, h는 정수

입출력 예시는 본 사이트 가서 보도록 하자

해설

주어진 w,h로 직사각형 그렸을때, 내부에 있는 임의의 좌표 x,y에서 w,h로 그린 직사각형 변까지의 최소 거리를 구하면 된다. x,y가 왜 내부에 있는 점이냐면 제한에서 보면 알 수 있다.

  • 1 ≤ x ≤ w-1
  • 1 ≤ y ≤ h-1

또 이 문제에서 걸어놓은 제한사항 중에 하나가 왼쪽 아래 꼭지점은 0,0으로 고정되어 있다는 점! 그러면 사각형의 위치는 고려하지 않아도 되니 문제는 쉬워진다

 문제에서 준 조건대로 그림을 한번 그려보았다. 변과 점의 최소 거리는 직각이 되는 선분의 길이와 같은데 저 4개의 선분 중 가장 길이 짧은 선분의 길이를 출력해주면 된다.

0,0으로 시작해서 기울지 않는 예쁜 직사각형이기 때문에 오른쪽 가로는 w-x  왼쪽 가로는 x 위쪽 세로는 h-y 아래쪽 세로는 y이다.

 

내가 작성한 코드는

x,y,w,h = map(int,input().split())
def minLen(a,b):
    return b-a if b-a<a else a
print( minLen(x,w) if minLen(x,w)<minLen(y,h) else minLen(y,h) )

 이건데 가로(w-x, x)와 세로(h-y, y) 먼저 비교하고 그 중 짧은 것끼리 한번 더 비교해서 출력해준다.

사실 min()이라는 함수를 쓰면 두줄만에 끝난다. 이거 풀 당시에는 min을 쓸 생각을 못했다.

x,y,w,h=map(int,input().split())
print(min(w-x,h-y,x,y))

최단거리에 대한 기본개념만 알면 풀 수 있는 문제였다.