본문 바로가기
코딩테스트

[C] 백준 1459번 - '걷기' 풀이

by CuckooBird 2023. 1. 13.

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 출력이 안 나와서 그냥 한번 내봤는데 성공 뜨더라고요. 이건 뭔지.. 참... 어렵군요...