[BOJ] 20546: 기적의 매매법 (성공했지만 회고!)

아이엠강욱·2023년 4월 26일
0

코딩테스트

목록 보기
3/23

해당 문제는 아래 링크를 통해 확인해주세요!
(문제가 너무 길어서....ㅎㅎ)
https://www.acmicpc.net/problem/20546


이 문제는 백준의 구현문제에서 실버5정도 하는 문제라고 해서 실버5면 쉽겠지? 하고 풀었는데 왐마.... 생각보다 시간이 오래걸렸습니다... (망할놈의 성민이)

준현이는 진짜 간단해서 금방했는데 성민이 뭐 전날대비 3일동안 상승세 하락세 뭐시기 비교해서 매도, 매수 그냥 문제가 너무 복잡했다.. (국어를 못하는 1인)

이야기는 이쯤하고..! 그래도 나름 해결 잘했는데 왜 썼냐?
일단 코드부터 올려볼게요!

# 백준 20546번: 기적의 매매법
# https://www.acmicpc.net/problem/20546

credit = int(input())   # 준현이와 성민이에게 주어진 현금
stock = list(map(int, input().split())) # 1일부터 14일까지의 주가

# 준현이 계산 방법 함수
def method_j(stock):
    j_credit = credit   # 준현이 현금
    j_totalBuyCount = 0   # 준현이가 산 주식 개수

    for s in stock:
        if j_credit == 0:   # 현금이 0원이면 반복문 탈출 -> 매도를 못하니까
            break
        if j_credit >= s:
            j_totalBuyCount += (j_credit // s)   # 준현이가 산 최대 주식 개수 더해줌
            j_credit = j_credit % s   # 나머지 거스름돈으로 세팅
    
    return j_totalBuyCount, j_credit


# 성민이 계산 방법 함수
def method_s(stock):
    s_credit = credit   # 성민이 현금
    s_totalBuyCount = 0   # 성민이가 산 주식 개수

    for s in range(3, len(stock)):
        # bigCheck랑 smallCheck는 전일 대비 3일간 상승세인지 하향세인지 확인하기 위한 변수 세팅
        bigCheck = 0
        smallCheck = 0
        for j in range(s-1, s-3, -1):
            if stock[j] > stock[j-1]:   # 3일연속 가격이 상승하는지 확인 (매도)
                bigCheck += 1
                smallCheck += 0
            elif stock[j] < stock[j-1]:   # 3일연속 가격이 하락하는지 확인 (매수)
                smallCheck += 1
                bigCheck += 0
            else:
                break
        
        if smallCheck == 2:   # 전량 매수
            if s_credit == 0:   # 현금이 없으면 매수를 못함
                continue
            s_totalBuyCount += (s_credit // stock[s])   # 매수한 주식만큼 더해줌
            s_credit = s_credit % stock[s]   # 잔돈 세팅
        elif bigCheck == 2:   # 전량 매도
            if s_totalBuyCount == 0:   # 주식을 산게 없으면 매도를 못함
                continue
            s_credit += (s_totalBuyCount * stock[s])   # 당일 주식값에 산 주식만큼 곱해서 세팅
            s_totalBuyCount = 0   # 매도했기 때문에 가지고있는 주식은 없음
        else:
            continue
            
    return s_totalBuyCount, s_credit
            

j_totalBuyCount, j_credit = method_j(stock)
s_totalBuyCount, s_credit = method_s(stock)

# 1월 14일의 자산 = (현금 + 1월 14일의 주가 × 주식 수)
j_asset = j_credit + (stock[-1] * j_totalBuyCount)
s_asset = s_credit + (stock[-1] * s_totalBuyCount)

# 준현이 > 성민이
if j_asset > s_asset:
    print('BNP')
# 성민이 > 준현이
elif j_asset < s_asset:
    print('TIMING')
# 준현이 = 성민이
else:
    print('SAMESAME')

위의 코드에서 집중적으로 봐야할 부분은 성민이 계산함수 부분!
문제를 보면 3일 연속 가격이 전일 대비 상승/하락이라고 되어있는데 이부분이 가장 헷갈렸다.
나처럼 당일 포함안하고 전날부터 3일동안 비교한사람도 있고 당일까지 포함해서 4일동안 비교한사람도 있다. (근데 둘다 백준에서는 맞게 처리해줌)

나는 bigCheck랑 smallCheck라는 변수를 통해 상승세인지 하락세인지 비교를 해서 코드작성을 했는데...

stock[1] < stock[2] < stock[3] < stock[4]

이런식으로도 파이썬에서 코드가 작성이 가능하다고?????

이거때문에 사실 회고를 씀...ㅎㅎ
이렇게 회고라도 써야 이걸 기억할 거 같아서요!

그리구 이 문제는 해결 방법이 너무너무너무너무 많아서 다른 사람들 풀이법도 한번씩 보는것도 좋을듯요!

오늘은 간단하게 회고 끝!
감사합니당

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글