걷기(1459)
[문제]
세준이는 학교에서 집으로 가려고 한다. 도시의 크기는 무한대이고, 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마다 있다. 세준이는 현재 (0, 0)에 있다. 그리고 (X, Y)에 위치한 집으로 가려고 한다. 세준이가 걸을 수 있는 방법은 두가지 인데, 하나는 도로를 따라서 가로나 세로로 한 블록 움직여서 이번 사거리에서 저 사거리로 움직이는 방법이고, 블록을 대각선으로 가로지르는 방법이 있다.
세준이가 집으로 가는데 걸리는 최소시간을 구하는 프로그램을 작성하시오.
[입력]
첫째 줄에 집의 위치 X Y와 걸어서 한 블록 가는데 걸리는 시간 W와 대각선으로 한 블록을 가로지르는 시간 S가 주어진다. X와 Y는 1,000,000,000보다 작거나 같은 음이 아닌 정수이고, W와 S는 10,000보다 작거나 같은 자연수이다.
[출력]
첫째 줄에 세준이가 집에가는데 걸리는 최소시간을 출력한다.
[입력 예시]
4 2 3 10
[출력 예시]
18
[내 풀이]
https://buzz-program.tistory.com/entry/BOJ1459%EA%B1%B7%EA%B8%B0
[파이썬, 자바] BOJ_1459(걷기)
문제 https://www.acmicpc.net/problem/1459 1459번: 걷기 세준이는 학교에서 집으로 가려고 한다. 도시의 크기는 무한대이고, 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마
buzz-program.tistory.com
X, Y, W, S=map(int, input().split());
#평행 이동
move1=W*(X+Y)
#대각선 이동
if (X+Y)%2==0: #대각선만 이동할 때, X+Y 는 무조건 짝수이다.
move2=S*(max(X, Y)) #X, Y 중 큰 값을 골라 대각선 이동 시간과 곱해준다.
else: #대각선 이동 + 평행 이동 1번할 때, X+Y 는 홀수이다.
move2=S*(max(X, Y)-1)+W
#평행+대각선 이동
move3=S*(min(X, Y))+W*(max(X, Y)-min(X, Y))
print(min(min(move1, move2), move3))
[해설]
i) 2*w < s
ii) 2*w > s
iii) 2*w == s
첫 번째 시도에 이 경우로 나누어 조건문을 이용해 풀려고 했으나,
도저히 풀리지 않아 구글링으로 풀이를 참고했다.
i) 평행 이동만 하는 경우
(x+y)*w
ii) 대각선 이동만 하는 경우
1 - x+y 가 짝수이면, 대각선 개수가 2로 나누어 떨어지므로 대각선 이동만으로 가능하다.
max(x,y)*s
2 - x+y 가 홀수이면, 대각선 이동+평행 이동 1번으로 가능하다.
(max(x,y)-1)*s+w
iii) 대각선 이동 + 평행 이동 하는 경우
x,y 값 중 작은 값으로 대각선 이동을 해주고 나머지는 평행이동 한다.
min(x,y)*s+(max(x,y)-min(x,y))*w
'알고리즘' 카테고리의 다른 글
[그리디 알고리즘] YONSEI TOTO (0) | 2022.11.09 |
---|---|
[그리디 알고리즘] Project Teams (0) | 2022.10.10 |
[그리디 알고리즘] 카약과 강풍 (0) | 2022.10.02 |
[그리디 알고리즘] 거스름돈 (0) | 2022.10.02 |
[프로그래머스] 하샤드 수 (0) | 2022.10.02 |