알고리즘
백준 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);
}
}