알고리즘

백준 1459번 걷기 (JAVA)

박카스마시며코딩 2022. 8. 29. 22:15

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

 

1459번: 걷기

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

www.acmicpc.net

 

저는 구현을 통해서 문제를 해결하였습니다.

대각선으로 가는 것(s)이  2*도로를 따라 가는 것(2*w)보다 작다면 y.와 x를 Math.min(y,x)만큼 뺸다.

이는 대각선으로 가는 것이 유리하기 때문입니다.

또한 남은 y+x가 짝수라면 y+x를 w,s중 작은 값으로 곱합니다. 

좌표가 무한대이기 때문에 y+x가 짝수라면 대각선으로도 갈 수 있습니다.

홀수라면 한번은 도로를 따라 가야하기 때문에 짝수일 때의 식에서 w를 더해주었습니다.

 

package BOJ.etc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_1459 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        long y = stoi.apply(st.nextToken());
        long x = stoi.apply(st.nextToken());
        long w = stoi.apply(st.nextToken());
        long s = stoi.apply(st.nextToken());
        long result = 0;
        if(2*w > s){
            long length = Math.min(y,x);
            y -= length;
            x -= length;
            result += length * s;
        }
        long sum = y+x;
        if(sum % 2 == 0){
            result += sum * Math.min(w,s);
        }else{
            result += 2 * (sum /2)  * Math.min(w,s) + w;
        }
        System.out.println(result);
    }
}