[Python] 백준 #11501- 주식

2023. 9. 1. 22:25·코딩테스트/백준[Python]

문제


 

 

11501번: 주식

입력의 첫 줄에는 테스트케이스 수를 나타내는 자연수 T가 주어진다. 각 테스트케이스 별로 첫 줄에는 날의 수를 나타내는 자연수 N(2 ≤ N ≤ 1,000,000)이 주어지고, 둘째 줄에는 날 별 주가를 나타

www.acmicpc.net

코드


My answer(시간초과)

import sys
input=sys.stdin.readline

n=int(input())

for i in range(n):
    day=int(input())
    price=list(map(int,input().split()))
    profit,num=0,0
    for j in range(len(price)):
        if(price[j]==max(price[j:])):
            profit+=(num*price[j])
            num=0
        else:
            profit-=price[j]
            num+=1
    print(profit)

 

Another answer

import sys
input=sys.stdin.readline

n=int(input())

for i in range(n):
    day=int(input())
    price=list(map(int,input().split()))
    profit=0
    max_p=0
    for j in range(len(price)-1,-1,-1):
        if(price[j]>max_p):
            max_p=price[j]
        else:
            profit+=max_p-price[j]
    print(profit)
for i in range(n):
    day=int(input())
    price=list(map(int,input().split()))
    price.reverse()
    max = price[0]
    sum = 0

    for j in range(1, day):
        if max < price[j]:
            max = price[j]
            continue
        sum += max - price[j]
    print(sum)

풀이


우선 문제의 아이디어 자체는 구하기 쉬웠던 문제이다. 

가격이 낮을 때 사서 가장 비쌀 때 팔면 최대의 이익을 얻을 수 있었다.

그래서 내 코드를 보면, max(price[i:])가 오늘을 포함한 이후로 부터 가장 가격이 크면 현재 보유한 주식개수만큼 최고가에 팔고, 오늘보다 비싼날이 있으면 우선 주식을 사는 방식으로 작성하였다. 코드 자체는 맞았지만 max를 계속 계산하게되면서 시간초과가 발생하였다.

이에 다른 분들의 코드를 참조하니 해결법은 뒤에서부터 문제를 푸는 것이었다. 처음에는 뒤에서 풀면 뭐가 다르지? 생각했었는데 간단하게 이해했다.

 

1. 내 코드는 오늘이 최고가가 아니면, 주식을 사고(주식 개수를 누적해줘야함) 최고가인 날 그 최고가에 현재 보유주식을 파는 방식 -> 오늘을 포함한 다음날들중 최고가를 매번 확인해줘야 함.

EX) 3,5,9 입력 

  1. 3,5,9 중 최고가 9이므로 주식을 하나 사고(count+=1), 보유자산에서 3을 빼줌(profit-=3)
  2. 5,9 중 최고가 9이므로 주식을 하나 더 사고(count+=1) , 보유자산에서 5를 빼줌 (profit-=5)
  3. 9중 최고가 9이므로, 보유주식(현재 2)을 모두 9에 팔고 보유자산에 9*count(2)를 더해줌. 

2. 첫번째 다른 코드 

최고가를 0으로 초기화하고, 뒤에서부터 돌면서 가격이 오늘 가격이 최고가보다 크면 최고가를 갱신 후 pass 최고가보다 작으면 오늘가격에서 최고가에서 오늘가격을 뺌.

EX) 입력이 3,5,9 이면 최고값을 0으로 초기화하고 9,5,3순서로 돌기 시작함. 

  1. 최고가를 0으로 갱신, 리스트를 역순으로 돌림 9,5,3
  2. 9>0(최고가) 이므로 최고가 9로 갱신
  3. 9(최고가)>5 이므로 9-5=4 (역방향으로 하기 때문에 바로 빼면됨, 원래는 5에 사서 9에 판다는 의미)
  4. 9(최고가)>3 이므로 9-3=6 (위와 동일)

3. 두번째 다른 코드

위와 동일한 방법이나 단순 max를 초기값(입력값의 역순의 첫번째 값)을 최대로 설정하여 진행 

 

최종적으로 역순으로 돌면서 이익계산을 바로바로 진행하는 방식으로 하면 max()함수를 계속하여 쓰지않고 진행하므로 시간초과가 발생하지 않았다. 

728x90

'코딩테스트 > 백준[Python]' 카테고리의 다른 글

[Python] 백준 #2606 - 바이러스  (0) 2023.09.04
[Python] 백준 #2979 - 트럭 주차  (0) 2023.09.02
[Python] 백준 #21314- 민겸 수  (0) 2023.09.01
[Python] 백준 #20365- 블로그 2  (0) 2023.09.01
[Python] 백준 #1541- 잃어버린 괄호  (0) 2023.09.01
'코딩테스트/백준[Python]' 카테고리의 다른 글
  • [Python] 백준 #2606 - 바이러스
  • [Python] 백준 #2979 - 트럭 주차
  • [Python] 백준 #21314- 민겸 수
  • [Python] 백준 #20365- 블로그 2
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    그리디
    dp
    이코테
    BFS
    DFS
    파이썬
    나동빈
    백준
    이것이취업을위한코딩테스트다
    이분탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바