[백준][파이썬] 30703번. 온도 맞추기

문제

https://www.acmicpc.net/problem/30703

 

풀이

첫 번째 시도

더보기
더보기
N = int(input())
A = list(map(int, input().split()))  # 초기 온도
B = list(map(int, input().split()))  # 목표 온도
X = list(map(int, input().split()))  # 온도 변화 값

# 모든 i에 대해서 온도가 한 번에 조절되는게 핵심
answer = 0

for i in range(N) :
  diff = A[i] - B[i]
  if diff < 0 :
    diff = -diff
  # 먼저 맞추는게 가능한지 아닌지 판단하기
  # 초기 온도와 목표 온도의 차이가 온도 변화 값의 배수가 아니라면 온도를 절대 맞출 수 없다
  if diff % X[i] != 0 :  
    answer = -1
    break
  else :
    answer = max(answer, diff // X[i])
print(answer)

→ 틀렸습니다

초기 온도와 목표 온도의 차이가 온도 변화 값의 배수라면, 그 몫만큼 버튼을 누르면 된다고 생각한 것이 틀린 부분이다.

 

반례

3
1 3 5
7 9 5
2 3 4
  • 내 코드에서는 (7-1)//2 = 3 이 정답으로 출력되지만, 실제로는 온도 조절 버튼을 3번 누르게 된다면 두 번째, 세 번째 비커의 온도를 맞출 수 없게 된다.

 

두 번째 시도

만약 첫 번째 비커의 온도를 맞추기 위해 버튼을 홀수번 눌러야 하고, 두 번째 비커의 온도를 맞추기 위해서는 버튼을 짝수번 눌러야만 한다면 온도 조절 장치만으로 온도를 맞출 수 없게 된다.

이런 상황을 고려해야 하므로 answer를 바로 갱신해주는게 아니라, 버튼을 짝수번 누르는지 홀수번 누르는지 확인 후 이전 비커의 상황과 비교하여 동일한 경우에만 갱신하는 것으로 코드를 바꿨다.

N = int(input())
A = list(map(int, input().split()))  # 초기 온도
B = list(map(int, input().split()))  # 목표 온도
X = list(map(int, input().split()))  # 온도 변화 값

# 모든 i에 대해서 온도가 한 번에 조절되는게 핵심
answer = 0

for i in range(N) :
  diff = A[i] - B[i]
  if diff < 0 :
    diff = -diff

  count = diff // X[i]
  if i == 0 :
    even = count % 2
  
  if (diff % X[i] == 0) and even == (count % 2) :
    answer = max(answer, diff // X[i])
  else :
    answer = -1
    break
print(answer)
728x90