[PS] BOJ 14470 / 전자레인지

[PS] BOJ 14470 / 전자레인지
Daily PS) BOJ 14470 / 전자레인지
문제 링크: https://www.acmicpc.net/problem/14470

브론즈 IV 난이도의 간단한 문제입니다! 문제 요건에 맞게 간단한 수식으로 구현할 수 있고, 입력으로 주어지는 수 또한 -100~100 사이의 작은 범위입니다.

문제

A℃의 고기를 전자레인지로 B℃까지 데우려고 한다.
고기는 온도가 0℃보다 낮을 때 얼어 있고, 0℃보다 높을 때는 얼어 있지 않다.

온도가 정확히 0℃일 때 고기는 얼어 있을 수도, 얼어 있지 않을 수도 있다.
(고기의 온도가 0℃보다 낮은 상태에서 데워져 0℃에 도달했을 때에는 아직 얼어있습니다!)

고기는 아래의 규칙을 따라 데워집니다:

  • 고기가 얼어 있고 온도가 0℃ 미만일 때 : 온도가 C초에 1℃씩 오른다.
  • 고기가 얼어 있고 온도가 정확히 0℃일 때 : 얼어 있지 않은 상태로 만드는(해동하는) 데 D초가 걸린다.
  • 고기가 얼어 있지 않을 때 : 온도가 E초에 1℃씩 오른다.

이 규칙을 토대로, 고기가 B℃까지 데워지는 데 몇 초가 걸리는지 구하라.

입력

  • A: 원래의 고기의 온도.
    • \(-100 \le A \le 100\)
    • \(A \ne 0\)
  • B: 고기의 목표 온도.
    • \(1 \le B \le 100\)
    • \(B \ge A\)
  • C: 얼어 있는 고기를 1℃ 데우는 데 걸리는 시간
    • \(1 \le C \le 100\)
  • D: 얼어 있는 고기를 해동하는 데 걸리는 시간
    • \(1 \le D \le 100\)
  • E: 얼어 있지 않은 고기를 1℃ 데우는 데 걸리는 시간
    • \(1 \le E \le 100\)

풀이

고기의 초기 온도 (A)를 기준으로, 목표 온도 (B)에 도달하기까지 어떤 과정을 거치는지 생각해봅시다.

  • A가 0도보다 크다면, B는 A보다 크므로 0도보다 클 것입니다.
    • 온도 차이만큼 "얼어 있지 않은 고기를" 데우면 됩니다.
    • \( (B - A) \times E \) 초의 시간이 걸립니다.
  • A가 0도보다 낮다면, A가 B에 도달하려면 영하 -> 0도 -> 영상의 3단계를 거쳐야 합니다.
    • 먼저 A가 0도까지 도달해야 합니다.
      • \( -A \times C \)
    • 이후, 0도에서 아직 얼어있는 고기를 해동시켜야 합니다.
      • \( D \)
    • 이후 해동된 고기를 B도까지 데워야 합니다.
      • \( B \times E \)
    • 이를 모두 합하면 다음과 같습니다:
      \( -A \times C + D + B \times E \)

코드

from sys import stdin

A = int(stdin.readline().strip())   # 원래의 고기의 온도 A가 주어진다. 단, A는 -100 이상 100 이하이며, 0이 아니다.
B = int(stdin.readline().strip())   # 목표 온도 B가 주어진다. 단, B는 1 이상 100 이하이며, A보다 크다.
C = int(stdin.readline().strip())   # 얼어 있는 고기를 1℃ 데우는 데 걸리는 시간 C가 주어진다.
D = int(stdin.readline().strip())   # 얼어 있는 고기를 해동하는 데 걸리는 시간 D가 주어진다.
E = int(stdin.readline().strip())   # 얼어 있지 않은 고기를 1℃ 데우는 데 걸리는 시간 E가 주어진다.

"""
JOI 군은 가열할 때 고기가 아래의 규칙을 따라 데워진다고 가정하고, 고기를 데우는 데 걸리는 시간을 어림하기로 했다.

- 고기가 얼어 있고 온도가 0℃ 미만일 때 : 온도가 C초에 1℃씩 오른다.
- 고기가 얼어 있고 온도가 정확히 0℃일 때 : 얼어 있지 않은 상태로 만드는(해동하는) 데 D초가 걸린다.
- 고기가 얼어 있지 않을 때 : 온도가 E초에 1℃씩 오른다.

이 규칙을 토대로, 고기가 B℃까지 데워지는 데 몇 초가 걸리는지 구하라.
"""

if A < 0:   # 고기가 얼어 있는 상태
    if B < 0:   # 목표 온도가 0℃ 미만인 경우 -> 그냥 얼어있는채로 데우기만 하면 된다.
        print((B - A) * C)
    elif B == 0:   # 목표 온도가 0℃인 경우 -> 얼어있는 고기를 |A| * C초 데우고, 이후 D초 해동
        print(-A * C + D)
    else:   # 목표 온도가 0℃ 이상인 경우 -> 얼어있는 고기를 |A| * C초 데우고, D초 해동 후, 0℃에서 B℃까지 E초에 1℃씩 데우기
        print(-A * C + D + B * E)
else:       # 고기는 얼어 있지 않으며, 목표 온도 또한 0도보다 높다.
    print((B - A) * E)

solution.py