개발

백준 1459 본문

Java/Algorithm

백준 1459

Dev.hs 2021. 2. 8. 01:39

브론즈1 이길래 쉽게 풀줄알았더니 반례를 못찾아서 한참을 찾다가 결국 답코드 보고 케이스 찾음..ㅠ

 

1. 대각선으로 이동한다

    - 직선 2회이동이 빠른경우

    - 대각선이 빠른경우

 

2. 남은 직선을 이동한다. 

    - 대각선이 빠른경우  (여기서 2 * w < s 조건으로 생각을함..)

        - 짝수인경우 대각선으로 이동 가능

        - 1은 직선으로 간 뒤 나머지를 대각선으로 이동

    - 직선이 빠른경우

 

2 * w < s 의 케이스는 대각선으로 이동하는 경우의 대소비교임..

 

직선의 경우 짝수는 대각선 2회로 이동하므로, 2 *w < s 로 할 경우,, 2,3으로 들어간다면 직선이 빠른데 3으로들어가게됨,,

 

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

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        long x = Integer.parseInt(st.nextToken());
        long y = Integer.parseInt(st.nextToken());
        long w = Integer.parseInt(st.nextToken());
        long s = Integer.parseInt(st.nextToken());

        long slide = Math.min(x,y);      //대각선수
        long linear = Math.max(x,y) - slide;     //직선수
        long second = 0;     //이동시간


        //대각선으로 이동한 수. 직선 or 대각선으로 작은 숫자로 이동 했음.
        if(2 * w < s){
            second = w * 2 * slide;
        } else {
            second = slide * s;
        }


        if (2 * s <  2 * w){
            //대각선2번으로 직선을 이동할 수 있음
            if(linear % 2 == 0){
                second += linear * s;
            } else if(linear % 2 == 1) {
                second += w;    //직선으로 한칸 가고나서
                linear--;       //직선 하나 줄이고
                //나머지는 대각선을 이용해 간다.
                second += linear * s;
            }
        //남은 직선을 이동하자.
        } else {
            second += linear * w;
        }
        System.out.println(second);
    }
}

'Java > Algorithm' 카테고리의 다른 글

백준 2589  (0) 2021.01.25
프로그래머스 위장  (0) 2021.01.23
백준 2596  (0) 2020.11.25
백준 자바 런타임에러(입력값)  (0) 2020.11.22
백준 19939  (0) 2020.11.18
Comments