예꾸
개발자국
예꾸
전체 방문자
오늘
어제
  • 분류 전체보기 (111)
    • CS (6)
      • 데이터베이스 (5)
      • 운영체제 (0)
      • Computer Architecture (1)
    • 끄적끄적 (4)
    • 이론 (29)
      • 알고리즘 (18)
      • 자료구조 (4)
      • WEB (2)
      • JS (2)
      • Git (2)
      • Python (1)
    • 면접준비 (3)
      • Vue (1)
      • Design Pattern (1)
      • Frontend (1)
    • 개발기술 (20)
      • Git PUSH 자동화 (3)
      • VUE (1)
      • Linux (2)
      • MERN Stack (2)
      • React기반 Gatsby로 블로그 개발하기 (6)
      • Typescript (0)
      • 감정일기장(React) (3)
      • CI CD (3)
    • 코드트리 (6)
      • 블로그 챌린지 (3)
      • 모의시험 (3)
    • 취업준비 (3)
      • 코딩테스트 후기 (3)
    • 프로그래머스 (8)
      • SQL (7)
      • 알고리즘 (1)
    • 백준 (31)
      • 그리디(탐욕법) (6)
      • 구현 (5)
      • 그래프탐색(dfs, bfs) (5)
      • 완전탐색 (5)
      • 문자열 (5)
      • 누적합 (2)
      • DP(다이나믹 프로그래밍) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코드트리 추천
  • 프로그래머스 SQL
  • 코드트리
  • 알고리즘
  • 백준 그리디
  • 나만의공부노트
  • 자료구조
  • 백준 구현
  • javascript
  • 코딩테스트실력진단
  • 백준 문자열
  • JS
  • 컴퓨터 시스템의 구조
  • React
  • 백준 그래프탐색
  • gatsby
  • 백준 완전탐색
  • 운영체제
  • 프로그래머스
  • 코딩테스트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
예꾸

개발자국

[백준 20546] 기적의 매매법 - python
백준/구현

[백준 20546] 기적의 매매법 - python

2021. 6. 5. 21:49

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

 

20546번: 🐜 기적의 매매법 🐜

1월 14일 기준 준현이의 자산이 더 크다면 "BNP"를, 성민이의 자산이 더 크다면 "TIMING"을 출력한다. 둘의 자산이 같다면 "SAMESAME"을 출력한다. 모든 결과 따옴표를 제외하고 출력한다.

www.acmicpc.net

 

문제 풀이

  • 문제에 써있는대로 코드를 구현하려 노력했다
  • bnp 매매법은 현재 가지고 있는 돈보다 주식 가격이 낮은 경우 전량 매수 방법으로 코드를 짰다

bnp코드

# bnp
bnp_money = money
bnp_result = 0
for stock in stocks:
    if stock <= bnp_money:
        bnp += (bnp_money // stock)
        bnp_money -= (bnp_money // stock) * stock
        # print(bnp, bnp_money)

bnp_result = (stocks[13] * bnp) + bnp_money

 

  • timing 매매법이 좀 까다로웠는데 연속으로 주식 가격이 내려간날(down_count)과 주식 가격이 올라간날(up_count)를 세주면서 3일 이상 내려가거나 올라가면 매수, 매도가 이루어지도록 했다
  • for문은 1부터 시작했고, before_stock의 index를 i-1로 표현하여 now_stock(index = i)과 비교할 수 있도록 했다
  • 매수 : 주식 가격이 전 날에 비해 내려가면 down_count는 1씩 증가시키고 up_count는 0으로 초기화 할 수 있도록 했고, 3일 연속 주식 가격이 내려갔으면(down_count >= 3) 현재 가지고 있는 돈으로 주식을 전량 매수할 수 있도록 했다
  • 매도 : 주식 가격이 전 날에 비해 올라가면 up_count는 1씩 증가시키고 down_count는 0으로 초기화할 수 있도록 했고, 3일 연속 주식 가격이 올라갔으면 (up_count >= 3) 현재 가지고있는 주식을 전량 매도 할 수 있도록 했다
  • 현재 주식가격이 전날과 동일하면 up_count와 down_count를 0으로 초기화 시켰다

timing 코드

# timing
timing_money = money
timing_result = 0
for i in range(1, len(stocks)):
    before_stock = stocks[i-1]
    now_stock = stocks[i]
    # 매수
    if before_stock > now_stock:
        down_count += 1
        up_count = 0
        if down_count >= 3:
            timing += (timing_money // stocks[i])
            timing_money -= (timing_money // stocks[i]) * stocks[i]

    # 매도
    if before_stock < now_stock:
        up_count += 1
        down_count = 0
        if up_count >= 3:
            timing_money += timing * stocks[i] 
            timing = 0 
    
    # 초기화
    if before_stock == now_stock:
        down_count = 0
        up_count = 0

timing_result = (stocks[13] * timing) + timing_money

 

전체 코드

money = int(input())
stocks = list(map(int, input().split()))

bnp = 0 # bnp 주식개수
timing = 0 # timing 주식개수


# bnp
bnp_money = money
bnp_result = 0
for stock in stocks:
    if stock <= bnp_money:
        bnp += (bnp_money // stock)
        bnp_money -= (bnp_money // stock) * stock
        # print(bnp, bnp_money)

bnp_result = (stocks[13] * bnp) + bnp_money

down_count = 0 # 연속으로 내려간 날
up_count = 0 # 연속으로 올라간날 
before_stock = 0 # 현재 stock과 비교할 그 전날 stock
now_stock = 0 # 현재 stock


# timing
timing_money = money
timing_result = 0
for i in range(1, len(stocks)):
    before_stock = stocks[i-1]
    now_stock = stocks[i]
    # 매수
    if before_stock > now_stock:
        down_count += 1
        up_count = 0
        if down_count >= 3:
            timing += (timing_money // stocks[i])
            # print(timing_money // stocks[i])
            timing_money -= (timing_money // stocks[i]) * stocks[i]

    # 매도
    if before_stock < now_stock:
        up_count += 1
        down_count = 0
        if up_count >= 3:
            timing_money += timing * stocks[i] 
            timing = 0 
    
    # 초기화
    if before_stock == now_stock:
        down_count = 0
        up_count = 0
    # print(now_stock, up_count, down_count, timing, timing_money)

timing_result = (stocks[13] * timing) + timing_money
# print(bnp_result, timing_result)


if bnp_result > timing_result:
    print('BNP')
elif bnp_result < timing_result:
    print('TIMING')
else:
    print('SAMESAME')
 
 

 

 

    '백준/구현' 카테고리의 다른 글
    • [백준 5597] 과제 안 내신 분..? - python
    • [백준 20053] 최소, 최대 2
    • [백준 1212] 8진수 2진수 - python
    • [백준 1913] 달팽이 - python
    예꾸
    예꾸
    비전공자 옒의 개발이야기💻

    티스토리툴바