구현
문제에서 주어진 준현이와 성민이의 매매법을 정리하면 아래와 같다.
- 준현이의 매매법
- 한번산 주식을 절대 팔지 않는다.
- 주식을 살 수 있다면 최대한 많이산다. 그리고 이후에 주식을 살 수 있다면 즉시 매수한다.
- 성민이의 매매법
- 모든 거래는 전량 매수와 전량 매도 :: (현금 < 주가) -> 주식 살 수 없다. (현금 > 주가) -> 최대의 수로 산다.
- 3일 연속 가격이 전일 대비 상승하는 주식은 다음날 무조건 가격이 하락 :: 주식 전량 매도
- 3일 연속 가격이 전일 대비 하락하는 주식은 다음날 무조건 가격이 상승 :: 주식 전량 매수
위 매매법을 직접 코드로 구현하면 아래와 같다
틀린 코드
# BNF (현금, 주가)
def BNP(money, price):
result = 0 # 투자 후 얻은 자산
for i in price:
# 살 수 있으면 최대한 산다.
if money >= i:
# 최대한 살 수 있는 주식 수
temp = money // i # 산 주식
money = money - (temp * i) # 남은 돈
result = temp * i + money # 주식 매수 후 보유 자산
return result
# TIMMING
def TIMING(money, price):
buy = []
before_pri = 0
# 3일 연속 상승/하락 확인
# before_pri의 초기값이 0이어서 첫 주가부터 상승/하락의 개수를 세는 것을 방지하기 위해 -1로 선언
up_check = -1
down_check = -1
for i in price:
if i > before_pri: # 상승
up_check += 1
elif i < before_pri: # 하락
down_check += 1
else: # 가격이 유지되면 연속 카운트
up_check = 0
down_check = 0
# rule1 : 3일 연속 상승하면 전량 매도 (동일 주가 제외)
if up_check == 3:
# 전량 매도
for j in buy:
money += (i * j) # 현재주가의 주식 개수만큼 가격을 더하면 전량 매도
buy = [] # 싹다 비워서 초기화
# 연속 상승 혹은 하락 초기화
up_check = 0
down_check = 0
# rule2 : 3일 연속 하락하면 전량 매수 (동일 주가 제외)
if down_check == 3:
# 전량 매수 + 현재 돈 상황 확인
if money > i: # 주식을 살 돈이 있음
#전량 매수
temp = money // i # 살 수 있는 주식 개수
money = money - (temp * i) # 남은돈
buy.append(temp) # 구매한 주식 개수 유지
# 연속 상승 혹은 하락 초기화
up_check = 0
down_check = 0
before_pri = i
result = sum(buy) * i + money # 주식 거래 후 보유 자산
return result
n = int(input())
#주가
price = list(map(int,input().split()))
# 결과 확인
result_1 = BNP(n,price)
result_2 = TIMING(n,price)
if result_1 > result_2:
print("BNP")
elif result_1 < result_2:
print("TIMING")
else:
print("SAMESAME")
- 해당 코드를 제출하면 런타임 에러(UnboundLocalError)가 발생한다.
- 코드를 확인한 결과 BNP함수에서 if money >= i: 조건문을 한 번도 거치지 않는 상황에서는 temp 변수가 정의되지 않아서였다.
정답 코드
# BNF (현금, 주가)
def BNP(money, price):
result = 0 # 투자 후 얻은 자산
temp = 0
for i in price:
# 살 수 있으면 최대한 산다.
if money >= i:
# 최대한 살 수 있는 주식 수
temp = money // i
money = money - (temp * i)
result = temp * i + money
return result
# TIMMING
def TIMING(money, price):
buy = []
before_pri = 0
up_check = -1 # 3일 연속 상승 확인
down_check = -1 # 3일 연속 하락 확인
for i in price:
if i > before_pri: # 상승
up_check += 1
elif i < before_pri: # 하락
down_check += 1
else: # 가격이 유지되면 연속 카운트
up_check = 0
down_check = 0
# rule1 : 3일 연속 상승하면 전량 매도 (동일 주가 제외)
if up_check == 3:
# 전량 매도
for j in buy:
money += (i * j) # 현재주가의 주식 개수만큼 가격을 더하면 전량 매도
buy = [] # 싹다 비워서 초기화
up_check = 0
down_check = 0
# rule2 : 3일 연속 하락하면 전량 매수 (동일 주가 제외)
if down_check == 3:
# 전량 매수 + 현재 돈 상황 확인
if money > i: # 주식을 살 돈이 있음
#전량 매수
temp = money // i # 살 수 있는 주식 개수
money = money - (temp * i) # 남은돈
buy.append(temp) # 구매한 주식 개수 유지
up_check = 0
down_check = 0
before_pri = i
# 14일 자산
result = sum(buy) * i + money
return result
n = int(input())
#주가
price = list(map(int,input().split()))
# 결과 확인
result_1 = BNP(n,price)
result_2 = TIMING(n,price)
if result_1 > result_2:
print("BNP")
elif result_1 < result_2:
print("TIMING")
else:
print("SAMESAME")
- temp = 0 으로 변수를 선언해줌으로써 문제 해결
'알고리즘 > 백준' 카테고리의 다른 글
백준-14501-퇴사 (1) | 2024.07.14 |
---|---|
백준-2839-설탕 배달 (1) | 2024.07.03 |
백준-11497-통나무 건너뛰기 (0) | 2024.07.03 |
백준-14502-연구소 (1) | 2024.07.01 |
백준-14248-점프 점프 (0) | 2024.06.25 |