본문 바로가기

ALGORITHM

백준 1459 걷기 (Java)

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);
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 1461 도서관 (Java)  (0) 2023.06.05
백준 11724 연결 요소의 개수 (Java)  (0) 2023.06.04
백준 2529 부등호 (Java)  (0) 2023.06.02
백준 22251 빌런 호석 (Java)  (0) 2023.06.01
백준 9935 문자열 폭발 (Java)  (0) 2023.05.31