문제
처음 작성한 코드
import sys
from math import gcd
N = int(sys.stdin.readline())
wallet = 0
charge = None # 충전금
min_M = pow(10,18)
for _ in range(N):
money , remain = map(int, sys.stdin.readline().split())
if wallet + money < 0: #충전
if remain != 0:
min_M = min(min_M, remain) # min_M(남은 금액의 최소)이 충전금보다 많으면 오버해서 충전한거
charge_tmp = remain - money - wallet #현재 충전된 금액
#charge -> 충전값 정함
if charge == None:
charge = charge_tmp
else:
charge = gcd(charge, charge_tmp)
#오버해서 충전했거나, charge==1일때는 무조건 remain이 0이어야하는데 그 조건을 만족 못 시킬 경우
if (min_M != pow(10,18) and charge <= min_M) or (charge == 1 and remain!=0):
print(-1)
break
else: #충전안해도 될 때는 원래 있던 돈(wallet)과 현재 입출금된 돈(money)를 더하면 현재 남아있는 돈(remain)이 되어야한다.
if wallet + money != remain:
print(-1)
break
wallet = remain #현재 남아있는 돈(remain)을 원래있던 돈(wallet)에 넣는다.
else:
if charge == None: #충전금이 사용되지 않을때
print(1)
else: print(charge)
깨달은 점
- 위 문제는 구현하는 데 어려움이 없었지만 조건을 생각해야하는 데서 2시간이 걸렸다.. 자증나!
- 제일 이해 안갔던 조건은 최소충전금액이 남아있는 금액(입력값에서 두번째, remain)의 최소값보다 커야한다는 점이었다. 그래서 이해가 안가서 바람쐬러 가면서 생각했는데 ---> 돈이 없어서 충전을 했어 근데? 충전한 값보다 남은 돈이 더 많아? 그럼 충전을 안해도 됐는데 한거니까 모순된 행동인거다.. 글 쓰면서 또 이해 안가서 10분 생각했음.. -_-
반례
3
1500 1500
-1600 1200
-400 0
>> -1 (3번째 로그에 모순이 있음)
'Baekjoon' 카테고리의 다른 글
[백준 2668] 숫자고르기 (0) | 2021.03.06 |
---|---|
[백준 14719] 빗물 (0) | 2021.03.06 |
[백준 15591] MooTube (Silver) (0) | 2021.02.27 |
[백준 1167] 트리의 지름 (0) | 2021.02.26 |
[백준 17298] 오큰수 (0) | 2021.02.14 |