728x90

백준 1459_걷기

시간 제한 2초, 메모리 제한 128MB

**# 조건

  • 세준이는 학교에서 집으로 가려고 한다.
  • 도시의 크기는 무한대이고, 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마다 있다.
  • 세준이는 현재 (0, 0)에 있다. 그리고 (X, Y)에 위치한 집으로 가려고 한다. 세준이가 걸을 수 있는 방법은 두가지 인데, 하나는 도로를 따라서 가로나 세로로 한 블록 움직여서 이번 사거리에서 저 사거리로 움직이는 방법이고, 블록을 대각선으로 가로지르는 방법이 있다.
  • 세준이가 집으로 가는데 걸리는 최소시간을 구하는 프로그램을 작성하시오.

# 접근 방법

  • 우선 입력으로 주어지는 한 블록 가는 시간과 대각선으로 가로지르는 시간을 비교해준다.
  • 2블록 가는 시간이 대각선으로 가로지르는 시간 보다 작다면, (X+Y) * 한 블록 가는데 걸리는 시간을 해준다.
  • 만약 가로지르는 시간이 작다면, MIN(X, Y) * 가로지르는 시간을 이동한 후 abs(x-y)만큼 가야되는데 여기서 조건 분기를 해주어야 한다.
    • 짝수인 경우 그대로 ABS(X-Y) * 가로지르는 시간을 해주면 된다.
    • 홀수 인 경우 아래 두 경우 중 최소로 이동하면 된다.
      • 일자 거리 abs(x-y) * w
      • 짝수 abs(x-y-1) * 가로지르는 시간만큼 이동 후 w만큼 이동

#include <iostream>
using namespace std;



int main() {

    long long X, Y, W, S;
    cin >> X >> Y >> W >> S;


    long long case_A = (X + Y) * W;
    long long case_B = min(X, Y) * S;
    case_B += min(abs(X - Y) * W, (abs(X - Y) % 2 == 1 ? (abs(X - Y) - 1) * S + W : abs(X - Y) * S));

    cout << min(case_A, case_B);
}
728x90