ALGORITHM

백준 1459 걷기 (Java)

공부하는_다온 2023. 6. 3. 21:15

1. 문제 링크

 

1459번: 걷기

세준이는 학교에서 집으로 가려고 한다. 도시의 크기는 무한대이고, 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마다 있다. 세준이는 현재 (0, 0)에 있다. 그리고 (

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

처음에는 직진이랑 대각선만 비교하고 구했다

그리고 x나 y가 남아있는 경우가 있으니 직선 시간을 더하고

근대 2 0인 예제가 틀리길래 봤더니 대각선으로 갔다가 오는 방법도 있어 최소 거리만큼 대각선을 가는 방법을 알게 되었다

그래서 여러 경우를 나눠 문제를 풀었다

  1. 직선으로 한 블럭의 가로 세로를 가는게 대각선보다 적은 시간이 걸리는 경우
  2. 대각선이 직선보다 작아 최대한 대각선으로 가는 경우(직선으로 갈 수 있는 거리를 대각선으로 가는 것이라 3-2와는 조금 다르다.)
  3. 그 외의 경우가 제일 문제였다.
    3-1. x, y 좌표가 같은 경우는 그만큼 대각선으로 가면 된다.
    3-2. 대각선으로 갈 수 있는만큼 가고 남은 거리를 직선으로 가면 된다.

그리고 자료형이 int가 아닌 long이라는 점도 주의해야 한다.

 

4. 코드

import java.io.IOException;
import java.util.Scanner;

public class Main {
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		long x = sc.nextInt();
		long y = sc.nextInt();
		long w = sc.nextInt(); //직선 시간
		long s = sc.nextInt(); //대각선 시간
		
		long min = Integer.MAX_VALUE;
		
		long time = (x+y) * w; //전부 직선
		min = Math.min(time, min);
		
		if(2*w < s) { //직선으로만
			time = (x+y) * w;
		}
		else if(w>s) { //최대한 대각선으로
			if((x+y) % 2 ==0) {
				time = Math.max(x, y)*s;
			}
			else {
				time = (Math.max(x, y)- 1) *s;
				time += w;
			}
		}
		else { 
			if(x == y) {
				time = s * x;
			}
			else {
				time = Math.min(x*s, y*s);
				time += Math.abs(x-y)*w;
			}
		}
		
		System.out.println(time);
	}
}