백준 1459번 바로가기

나의 풀이

x, y, w, s = map(int, input().split())
a=max(x,y)
b=min(x,y)

ans = 0
if 2*w > s:
  ans += b*s
else:
  ans += b*2*w

if w > s:
  if (c:=(a-b)) % 2 == 0:
    ans += c*s
  else:
    ans += (c-1)*s + w
else:
  ans += (a-b)*w

print(ans)

고수의 풀이

x,y,w,s = map(int, input().split())

x,y = min(x,y), max(x,y)
m = (x + y) % 2

print(min((x+y)*w, x*s+(y-x)*w, (y-m)*s+m*w))

출처

CODE REVIEW

  1. case_work에 해당하는 문제답게 경우를 쪼개서 풀어내는 것이 풀이의 핵심이다.
  2. 나의 경우엔 직사각형을 정사각형과 직사각형으로 쪼개서 풀었다.
    • 앞의 if문이 정사각형 이동,
    • 뒤의 if문이 직사각형 이동을 나타낸다.
  3. 고수의 풀이같은 경우 세 가지 경우로 쪼개서 풀어냈다.
    • 대각선으로만 이동하는 경우
    • 직선으로만 이동하는 경우
    • 두 경우를 혼용하는 경우