https://www.acmicpc.net/problem/1459
1459번: 걷기
세준이는 학교에서 집으로 가려고 한다. 도시의 크기는 무한대이고, 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마다 있다. 세준이는 현재 (0, 0)에 있다. 그리고 (
www.acmicpc.net
코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
unsigned long X, Y, W, S, h1, h2, h3, longSide;
scanf("%d %d %d %d", &X, &Y, &W, &S);
h1 = W * (X + Y);
h2 = 0;
longSide = X > Y ? X : Y;
if (X % 2 == 0 && Y % 2 == 0) {
if (W >= S) {
h2 += longSide * S;
}
}
else if (X % 2 != 0 && Y % 2 != 0) {
if (W >= S) {
h2 += longSide * S;
}
}
else {
if (W >= S) {
h2 += (longSide - 1) * S;
h2 += W;
}
}
h3 = 0;
if (X <= Y) {
h3 += X * S;
h3 += (Y - X) * W;
}
else {
h3 += Y * S;
h3 += (X - Y) * W;
}
unsigned long result;
if (h2 == 0) {
result = h1;
}
else {
result = h1 < h2 ? h1 : h2;
}
result = result < h3 ? result : h3;
printf("%ld", result);
return 0;
}
크게 세가지의 경우로 나눴습니다.
h1은 (X+Y) * W 로 가장 먼저 생각할 법한 방법입니다.
h2부터 조금 복잡해지는데요, h2는 대각선의 길이가 블록의 길이보다 작을 경우에 해당합니다. (코드를 모두 쓰고 깨달음 ^^..) 따라서 전부 대각선으로 이루어진 경로 혹은 대각선 + 블록하나 이렇게 구성 되어있습니다.
1. X와 Y가 모두 짝수인 경우
2. X와 Y가 모두 홀수인 경우
3. X가 홀수이거나 Y가 짝수인 경우 + X가 짝수이거나 Y가 홀수인 경우
로 나눕니다.
첫번째와 두번째 경우에는 대각선으로만 이루어질 수 있으므로 X와 Y중 긴 longSide를 이용하여 longSide * S를 합니다.
세번째 경우는 대각선으로 모두 그리고 나면 블록 하나의 길이가 남으므로 longSide * S + W 를 해줘야합니다.
h3은 대각선과 블록을 옮겨다니는 개수를 고려한 '시간을 고려하지 않은' 최단 '거리' 를 구해줍니다.
그렇게 나온 h1과 h2, h3을 비교하여 result에 넣어 값을 구했습니다.
후기
하루 할달량을 다 하고 나면 '시도했지만 맞지 못한 문제' 를 풀어볼까 합니다. 이 문제는 경우의 수를 잘못 나눴던것 같아요. 하나 놓치면 코드 다 쓰고 난 뒤라 두번 정도 싹다 지우고 풀었습니다.
범위 맞추는 것도 조금 어렵네요. 예제 6 출력이 안 나와서 그냥 한번 내봤는데 성공 뜨더라고요. 이건 뭔지.. 참... 어렵군요...
'코딩테스트' 카테고리의 다른 글
[C] 백준 2884번 - '알람 시계' 풀이 (0) | 2023.01.14 |
---|---|
[C] 백준 2525번 - '오븐 시계' 풀이 (0) | 2023.01.13 |
[Python] 백준 1940번 - '주몽' 풀이 (0) | 2023.01.13 |
[Python] 백준 1920번 - '수 찾기' 풀이 + 이진탐색 (이분탐색) (0) | 2023.01.12 |
[Python] 백준 2839번 - '설탕 배달' 풀이 (0) | 2023.01.11 |