티스토리 뷰
반응형
백준 1459 걷기 C++
문제 설명
문제
세준이는 집에서 학교까지 가장 빠르게 가는 시간을 구해야 합니다. 집은 (0,0)에, 학교는 (X,Y)에 위치해 있습니다. 세준이는 오른쪽, 위쪽, 오른쪽 위 대각선으로만 이동할 수 있습니다. 오른쪽, 위쪽으로 한 칸 이동하는 데 걸리는 시간은 W, 대각선으로 한 칸 이동하는 데 걸리는 시간은 S입니다.
테스트케이스
4 2 3 5
3 5 3 5
2 0 12 10
문제 작동 원리
예를 들어 X=2, Y=0, W=12, S=10이라면,
- 방법 1 — 직선만 사용
오른쪽으로 2번 이동
총 비용 = \(2 \times W = 2 \times 12 = \textbf{24}\) - 방법 2 — 대각선만 사용
(0,0) → (1,1) 대각선 이동 = S = 10
(1,1) → (2,0) 대각선 이동 = S = 10
총 비용 = \(10 + 10 = \textbf{20}\)
이 경우 대각선 이동이 더 저렴하므로 최적 경로는 방법 2이고, 최소 시간은 20입니다.
아이디어
1. 만약 \(2W < S\) 이면, 가로, 세로로만 이동하는 것이 최소 비용입니다.
조건
- 출발:
(0,0)
- 도착:
(4,2)
- W = 3, S = 10
- W < S → 직선만 이용하는 것이 최소 비용
- 표 크기: y=0~2, x=0~4 범위 (3행 5열)
- 이동 순서대로 값 기록
0단계 (출발점)
1단계 (1,0)
2단계 (2,0)
3단계 (3,0)
4단계 (4,0)
5단계 (4,1)
6단계 (4,2)
도착
요약하면
우리는 대각선을 사용하는 것보다 가로, 세로 방향을 쓰는 게 항상 최적이라면 가로, 세로만 써서 값을 구할 수 있습니다.
2. 가로, 세로 이동(W) < 대각선 이동(S) < 가로, 세로 2번(2W) 일 경우에는 대각선으로 가로, 세로만큼 최대 이동 후 남은 거리는 최소값으로 갑니다.
조건
- 시작:
(0,0)
- 목표:
(4,2)
- W=3, S=5
- 표 크기: y=0~2, x=0~4 (3행 5열)
- 한 칸씩 이동, 최적 경로만 채움
0단계 (출발점)
1단계 — (1,1)
(대각)
2단계 — (2,2)
(대각)
3단계 — (3,2)
(직선 → W=3)
- 만약 대각선으로 간다면
4단계 — (4,2)
(직선 → W=3)
- 만약 대각선으로 간다면
결과
- 최적 경로:
(0,0)
→(1,1)
→(2,2)
→(3,2)
→(4,2)
- 총 비용: 16
- 규칙: 대각선 최대한 사용 후, 나머지는 직선
요약하면
대각선으로 최대한 이동한 후에, 대각선을 사용하는 것과 가로, 세로를 사용하는 것 중 더 싼 것을 골라야 합니다.
3. 가로, 세로를 두 번 이동하는 것보다 대각선이 싸다면 대각선을 이용합니다. 그러나 대각선으로 \(|X-Y|\)가 홀수인 곳은 이동할 수 없습니다.
홀수인 경우
1단계 — 0번째 이동
2단계 — 1번째 이동
(0,0)
→(1,1)
(대각 이동) : 비용 = 10
3단계 — 2번째 이동
(1,1)
→(2,1)
(직선 이동) : 비용 = 10 + 12 = 22
✅ 최소 비용 경로:
(0,0)
→ (1,1)
→ (2,1)
✅ 총 비용: 22
짝수인 경우
네, X=2, Y=0, W=12, S=10에 대해서 아까 방식 그대로 최적 경로만 표로 만들겠습니다. 출발: (0,0)
→ 도착: (2,0)
1단계 — 0번째 이동
2단계 — 1번째 이동
(0,0)
→(1,1)
(대각 이동) : 비용 = 10
3단계 — 2번째 이동
(1,1)
→(2,0)
(대각 이동) : 비용 = 10 + 10 = 20
✅ 최소 비용 경로:
(0,0)
→ (1,1)
→ (2,0)
✅ 총 비용: 20
전체코드
X,Y,W,S = map(int,input().split())
if 2*W<=S:
print(W*(X+Y))
elif S>=W and S<2*W:
print(abs(X-Y)*W + min(X,Y)*S)
else:
if abs(X-Y)%2==0:
print(max(X,Y)*S)
else:
print((max(X,Y)-1)*S + W )
결론
- 직선 이동(W)과 대각선 이동(S)의 비용을 비교하여 최적의 이동 방법을 선택해야 합니다.
- 경우 1: \(2W \le S\)
대각선 이동이 직선 2번 이동보다 비싸거나 같다면, 오직 직선 이동만 사용하여 \( (X+Y) \times W \)의 비용을 계산합니다. - 경우 2: \(W > S\)
대각선 이동이 직선 1번 이동보다 싸다면, 최대한 대각선으로 이동하는 것이 유리합니다.- 두 지점의 거리 차이 \(|X-Y|\)가 짝수이면, 직선 이동 없이 \( \max(X, Y) \times S \)의 비용으로 도착할 수 있습니다.
- 두 지점의 거리 차이 \(|X-Y|\)가 홀수이면, 마지막 한 칸은 직선으로 이동해야 하므로 \( (\max(X, Y)-1) \times S + W \)의 비용이 듭니다.
- 경우 3: \(W \le S < 2W\)
대각선 이동이 직선 2번 이동보다는 싸지만, 직선 1번 이동보다는 비싸거나 같다면, 대각선으로 이동할 수 있는 만큼 이동한 후 남은 거리를 직선으로 이동합니다. 이 경우 비용은 \( |X-Y| \times W + \min(X, Y) \times S \)로 계산합니다. - 최종 답은 위 세 가지 경우 중에서 가장 최소 비용을 찾는 것입니다. 제시된 코드는 이를 세 가지 경우로 나누어 처리하고 있습니다.
반응형
'백준 스터디' 카테고리의 다른 글
백준 카약과 강풍 2891 python (1) | 2025.08.12 |
---|---|
백준 카약과 강풍 2891 C++ (0) | 2025.08.12 |
백준 1459 걷기 C++ (0) | 2025.08.12 |
백준 종이 접기 1802 python (2) | 2025.08.10 |
백준 종이 접기 1802 C++ (0) | 2025.08.10 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- dfs
- 코딩테스트
- 그래프 탐색
- 알고리즘기초
- 코딩 테스트
- 그리디
- 동적 계획법
- 알고리즘 문제풀이
- 파이썬코딩
- 그리디알고리즘
- 문제풀이
- 객체지향
- 브루트포스
- C++ 알고리즘
- python 알고리즘
- 알고리즘
- 문자열처리
- 알고리즘문제풀이
- 파이썬
- 백준
- 프로그래밍
- 문제 풀이
- Python
- C++
- 인접 행렬
- c++알고리즘
- DP
- 동적계획법
- 코딩
- c언어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
글 보관함
반응형