[Rules_규칙]
주식 가격의 변동을 시간 순서대로 분석하여 주식 투자의 최대 손실을 계산합니다.
한 시점(t0)에서 주식을 사고 다른 시점(t1)에서 주식을 팔았다면 손실 금액은 두 시점의 주식 가격 차(t1-t0)와 동일합니다.
손해를 보지 않았다면 손실은 0입니다.
- 2줄의 입력을 받습니다.
- 첫 번째 입력 값: 주식 변동 개수 n
- 두 번째 입력 값: 주식 가격을 시간 순서에 따라 v1 시점부터 vn 시점까지 차례대로 입력받습니다.
- 출력 값: 최대 손실을 출력합니다. 손실은 음수로 표현하고. 손실이 없으면 0을 출력합니다.
[문제]
https://www.codingame.com/training/medium/stock-exchange-losses
Practice Arrays and Loops with the exercise "Stock Exchange Losses"
Want to practice Arrays and loops? Try to solve the coding challenge "Stock Exchange Losses".
www.codingame.com
[난이도]
[학습 개념]
[풀이]
이 문제를 그냥 머릿속으로 생각해서 처음으로 풀면 어떤 경우 최대 손실이 일어나는지 감이 안 잡힐 수 있는데 문제에서 친절히 예제 차트를 줘서 이걸 토대로 차분히 생각해 볼 수 있었습니다.
Step1_
v1에서는 주식 구매만 할 수 있습니다.
물론 판매도 할 수 있겠지만 같은 가격에 사서 같은 가격에 팔면 의미가 없습니다.
현재 주식 최고가와 최저가 모두 3, 최대 손실은 0입니다.
Step2_
v1에서 주식을 구매해서 v2에서 판매하면 -1 손실이 발생합니다.
사례가 v2 까지라면 정답은 -1이 될 것입니다. 하지만 뒤의 사례가 더 있으니 계속 봐야 합니다.
또한, v2에서 주식을 사면 v1에서 사는 것보다 기대 손실이 적기 때문에 v2에서 주식을 사는 것은 의미가 없습니다.
현재 주식 최고가는 3, 최저가는 2, 최대 손실은 -1입니다.
Step3_
v3에서는 주식 가격이 상승했습니다.
v2는 사면 기대 손실 값이 적어 이미 제외되었으므로 v1과 v3 만 비교하면 됩니다.
v1 또는 v3에서 주식을 구매해서 나중에 가격이 떨어질 때를 생각해 보면 v3에서 주식을 사는 것이 더 큰 손해를 보게 되어있습니다. 그러므로 주식을 사는 기준가는 v3로 변경하는 것이 좋습니다.
여기에서 유의할 점은 v3에서 주식을 구매한 이후 주식 가격이 떨어지지 않거나 v1~v2 구간에서 발생한 손실보다 적은 손실이 발생할 수 있기 때문에 기존의 최대 손실 값은 유지해야 합니다.
Step4_
다 왔습니다. 위의 이야기를 보면 알고 있어야 되는 값이 나왔습니다.
바로 주식 최대 값과 손실 최대 값이 중요합니다. 최저가는 항상 최고가 이후 시점이 되어야 하는데 이를 구현하기도 쉽지 않고, 의미도 없습니다. 중요한 것은 최저가가 얼마인지 아는 것이 아니라 최대 손실이 얼마나 커졌는지 비교하는 것이니까요. 그리고 그 비교는 최고가와 최대 손실 값을 비교하는 것으로 충분히 알 수 있습니다.
[소스 코드]
using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
class Solution
{
static void Main(string[] args)
{
// 첫 번째 입력으로 정수 n을 받아들임
int n = int.Parse(Console.ReadLine());
// 두 번째 입력으로 n개의 정수를 포함하는 문자열 inputs를 받아들임
string[] inputs = Console.ReadLine().Split(' ');
// 입력에서 읽은 n 개의 정수를 stock_price 배열에 저장함
int[] stock_price = new int[n];
for (int i = 0; i < n; i++)
{
stock_price[i] = int.Parse(inputs[i]);
}
// 최대 주식 가격과 최대 손실을 초기화 함
int highest_price = 0, highest_loss = 0;
// 주식 가격 배열을 반복하면서 최대 손실을 계산함
foreach (int current_price in stock_price)
{
// 현재 가격이 highest_price보다 크면 highest_price를 현재 가격으로 업데이트함
if (current_price > highest_price)
{
highest_price = current_price;
}
// 현재 가격에서 highest_price를 뺀 값이 highest_loss보다 작으면 highest_loss를 해당 값으로 업데이트함
if (current_price - highest_price < highest_loss)
{
highest_loss = current_price - highest_price;
}
}
// 최대 손실을 출력함
Console.WriteLine(highest_loss);
}
}
위의 코드는 제가 고민하여 만든 코드입니다.
[새롭게 알게 된 점]
문제 분석 능력이 중요하다는 걸 다시 한번 더 깨닫게 되었습니다.
저는 처음에 무슨 변수가 필요한지 먼저 생각하는 버릇이 있습니다.
그래서 당연히 최고가와 최저가 그리고 최대 손실 값 3가지 변수를 적고 나서 어떻게 풀을까 고민했습니다.
하지만 문제를 풀다 보니 먼가 점점 산으로 가고 문제 풀이에서 멀어지게 되었습니다.
그래서 문제와 차트를 다시 고심해서 보게 되었고 풀이와 같이 생각하게 되었습니다.
시간이 좀 많이 걸리고 노트에 적으면서 생각하는데 뇌가 잘 안 굴러가고 딴생각도 많이 했지만 결국 해냈습니다.
해낸 게 중요한 거 아니겠습니까?! ꉂꉂ(ᴖᗜᴖ*)
'알고리즘 공부 > codingame 사이트 문제' 카테고리의 다른 글
[CodinGame] SHADOWS OF THE KNIGHT(이진 탐색으로 폭탄 찾기) (0) | 2023.05.08 |
---|---|
[CodinGame] SCRABBLE(해시맵으로 단어 만들기) (0) | 2023.05.04 |
[CodinGame] WAR(카드 게임 알고리즘-Queue) (0) | 2023.05.03 |
[CodinGame] THERE IS NO SPOON - EPISODE 1(2차원 노드 찾기) (0) | 2023.04.19 |
[CodinGame] Unary(단항) (0) | 2023.04.18 |