Hi, There!
안녕하세요, 바오밥입니다.
목차
- 문제
- 풀이
문제
문제 내용
지난 연속된 n일 동안의 주식 가격이 순서대로 들어있는 리스트가 있습니다.
이때, 다음 규칙에 따라 주식을 사고 팔았을 때의 최대 수익을 구하려 합니다.
- n일 동안 주식을 단 한 번 살 수 있습니다.
- n일 동안 주식을 단 한 번 팔 수 있습니다.
- 주식을 산 날에 바로 팔 수는 없으며, 최소 하루가 지나야 팔 수 있습니다.
- 적어도 한 번은 주식을 사야하며, 한 번은 팔아야 합니다.
주식을 팔 때는 반드시 이전에 주식을 샀어야 하며, 최대 수익은 양수가 아닐 수도 있습니다.
연속된 n 일 동안의 주식 가격이 순서대로 들어있는 리스트 prices가 매개변수로 주어질 때, 주식을 규칙에 맞게 한 번만 사고 팔았을 때 얻을 수 있는 최대 수익을 return 하도록 solution 함수를 작성했습니다.
그러나, 코드 일부분이 잘못되어있기 때문에, 코드가 올바르게 동작하지 않습니다.
주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정해주세요.
매개변수 설명
- 연속된 n 일 동안의 주식 가격이 순서대로 들어있는 리스트 prices가 solution 함수의 매개변수로 주어집니다.
- prices의 길이는 2 이상 1,000,000 이하입니다.
- prices의 각 원소는 1 이상 1,000 이하의 자연수입니다.
return 값 설명
- 주식을 규칙에 맞게 한 번만 사고팔았을 때 얻을 수 있는 최대 수익을 return 해주세요.
예시
예시 설명
- 예시 #1 연속된 3일의 주가가 차례로 [1, 2, 3] 이며, 첫째 날에 주식을 사서 셋째 날에 팔면 수익은 2이고, 이때가 최대입니다.
- 예시 #2 문제에서 설명한 것처럼 무조건 한 번은 매수하고, 한 번은 매도해야 합니다. 첫째 날에 매수하여 둘째 날에 매도하는 방법밖에 없기 때문에 수익은 -2, 즉 2만큼 손실을 보게 됩니다.
풀이
풀이 코드 및 해설
def solution(prices):
INF = 1000000001;
tmp = INF # 1일차 가격을 최솟값으로 등록하기 위해 제일 큰 값을 선언
answer = -INF # 2일차 가격 - 1일차 가격을 answer로 등록하기 위해 제일 작은 값을 선언
for price in prices: # 날짜순으로 배치된 주식가격 순회
if tmp != INF: # tmp, INF가 같은 경우는 최초 순회 시 => 1일차 밖에 없음
answer = max(answer, price - tmp) # 첫 이익인 2일차-1일차 값을 answer에 저장
# 그 이후 순회하면서 이익이 더 큰 n일차 - n일차의 값이 저장됨.
tmp = min(tmp, price) # 1일차의 값을 tmp에 저장 => answer의 진짜 초깃값을 구하기 위함
# 그 이후 순회하면서 더 가격이 저렴한 n일차의 값이 저장됨.
return answer
# tmp 값은 1일차 값임 (1일차는 2일차와 비교를 위해 반드시 구해야하는 값임)
# answer 값은 2일차-1일차 값임 (2일차-1일차는 최초로 발생하는 이익임)
# 그러나 날짜순으로 배치된 주식가격을 순회하기 전에 값을 초기화해야 함
# => 따라서, tmp 및 INF 값을 문제에서 주어진 범위에 최소, 최대값으로 지정해야 함
'Certificate > Cert - Cos Pro 1급' 카테고리의 다른 글
[Cos Pro 1급] 기출문제 2회차, 지하철 기다리기 (0) | 2021.07.14 |
---|---|
[Cos Pro 1급] 기출문제 2회차, 도서 대여점 운영 (0) | 2021.07.14 |
[Cos Pro 1급] 기출문제 1회차, 계단 게임 (0) | 2021.07.13 |
[Cos Pro 1급] 기출문제 1회차, 누가 당선 되나요 (0) | 2021.07.13 |
[Cos Pro 1급] 기출문제 1회차, 병합 and 정렬 (0) | 2021.07.13 |