ALGORITHM
백준 1459 걷기 (Java)
공부하는_다온
2023. 6. 3. 21:15
1. 문제 링크
1459번: 걷기
세준이는 학교에서 집으로 가려고 한다. 도시의 크기는 무한대이고, 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마다 있다. 세준이는 현재 (0, 0)에 있다. 그리고 (
www.acmicpc.net
2. 문제 및 입출력예제
3. 문제 풀이
처음에는 직진이랑 대각선만 비교하고 구했다
그리고 x나 y가 남아있는 경우가 있으니 직선 시간을 더하고
근대 2 0인 예제가 틀리길래 봤더니 대각선으로 갔다가 오는 방법도 있어 최소 거리만큼 대각선을 가는 방법을 알게 되었다
그래서 여러 경우를 나눠 문제를 풀었다
- 직선으로 한 블럭의 가로 세로를 가는게 대각선보다 적은 시간이 걸리는 경우
- 대각선이 직선보다 작아 최대한 대각선으로 가는 경우(직선으로 갈 수 있는 거리를 대각선으로 가는 것이라 3-2와는 조금 다르다.)
- 그 외의 경우가 제일 문제였다.
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);
}
}