알고리즘/백준

백준-20546-기적의 매매법

hong2943 2024. 7. 12. 00:09

구현

문제에서 주어진 준현이와 성민이의 매매법을 정리하면 아래와 같다.

  • 준현이의 매매법
- 한번산 주식을 절대 팔지 않는다.
- 주식을 살 수 있다면 최대한 많이산다. 그리고 이후에 주식을 살 수 있다면 즉시 매수한다.

 

  • 성민이의 매매법
- 모든 거래는 전량 매수와 전량 매도  :: (현금 < 주가) -> 주식 살 수 없다.  (현금 > 주가) -> 최대의 수로 산다.
- 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