문제 지문 #7
지난 연속된 n일 동안의 주식 가격이 순서대로 들어있는 배열이 있습니다. 이때, 다음 규칙에 따라 주식을 사고팔았을 때의 최대 수익을 구하려 합니다.
- n일 동안 주식을 단 한 번 살 수 있습니다.
- n일 동안 주식을 단 한 번 팔 수 있습니다.
- 주식을 산 날에 바로 팔 수는 없으며, 최소 하루가 지나야 팔 수 있습니다.
- 적어도 한 번은 주식을 사야 하며, 한 번은 팔아야 합니다.
주식을 팔 때는 반드시 이전에 주식을 샀어야 하며, 최대 수익은 양수가 아닐 수도 있습니다.
연속된 n 일 동안의 주식 가격이 순서대로 들어있는 배열 prices가 매개변수로 주어질 때, 주식을 규칙에 맞게 한 번만 사고팔았을 때 얻을 수 있는 최대 수익을 return 하도록 solution 메서드를 작성했습니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 코드가 올바르게 동작하지 않습니다. 주어진 코드에서 _한 줄_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정해주세요.
매개변수 설명
연속된 n 일 동안의 주식 가격이 순서대로 들어있는 배열 prices가 solution 메서드의 매개변수로 주어집니다.
- prices의 길이는 2 이상 1,000,000 이하입니다.
- prices의 각 원소는 1 이상 1,000 이하의 자연수입니다.
return 값 설명
주식을 규칙에 맞게 한 번만 사고팔았을 때 얻을 수 있는 최대 수익을 return 해주세요.
예시
prices | return |
[1,2,3] | 2 |
[3,1] | -2 |
예시 설명
예시 #1
연속된 3일의 주가가 차례로 [1, 2, 3]이며, 첫째 날에 주식을 사서 셋째 날에 팔면 수익은 2이고, 이때가 최대입니다.
예시 #2
문제에서 설명한 것처럼 무조건 한 번은 매수하고, 한 번은 매도해야 합니다. 첫째 날에 매수하여 둘째 날에 매도하는 방법밖에 없기 때문에 수익은 -2, 즉 2만큼 손실을 보게 됩니다.
혼자 풀이
이번 문제도 한줄을 고치는 문제입니다. 수익은 매도 가격 - 매수 가격 이므로 이 부분 수정해 주었습니다.
역시 고치는 문제가 제일 쉽네요. 이것도 10분 안쪽으로 걸렸습니다.
/*================================================
1차 7번 1차 1급 주식 매매 시 최대 이익 찾기
=================================================*/
class MySolution {
int solution(int[] prices){
int INF = 1000000001;
int tmp = INF;
int answer = -INF;
for(int price : prices){
if(tmp != INF)
//answer = Math.max(answer, tmp - price);
answer = Math.max(answer, price-tmp); //주식을 산 가격(tmp)와 파는 시점(price)의 차이가 가장 큰 값을 찾는 것
tmp = Math.min(tmp, price);
}
return answer;
}
// The following is main method to output testcase. The main method is correct and you shall correct solution method.
public static void main(String[] args) {
MySolution sol = new MySolution();
int[] prices1 = {1, 2, 3};
int ret1 = sol.solution(prices1);
// Press Run button to receive output.
System.out.println("MySolution: return value of the method is " + ret1 + " .");
int[] prices2 = {3, 1};
int ret2 = sol.solution(prices2);
// Press Run button to receive output.
System.out.println("MySolution: return value of the method is " + ret2 + " .");
}
}
정답
정답은 한 줄 고치라더니 몇 줄 더 고쳤네요. 비슷한 다른 문제가 있는게 아닐까 싶습니다.
class CorrectSolution {
int solution(int[] prices){
int inf = 1000000001;
int mn = inf;
int ans = -inf;
for(int price : prices){
if(mn != inf) ans = Math.max(ans, price - mn);
mn = Math.min(mn, price);
}
return ans;
}
}
# 첨부 파일
프로젝트 파일 전체를 첨부합니다.
Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.
'Programming > Cos Pro 1급' 카테고리의 다른 글
Cos Pro 1급 - 샘플 문제 풀이 1차 9번 (0) | 2022.10.07 |
---|---|
Cos Pro 1급 - 샘플 문제 풀이 1차 8번 (0) | 2022.10.07 |
Cos Pro 1급 - 샘플 문제 풀이 1차 6번 (1) | 2022.10.07 |
Cos Pro 1급 - 샘플 문제 풀이 1차 5번 (배열의 원소의 갯수 세기) (0) | 2022.10.06 |
Cos Pro 1급 - 샘플 문제 풀이 1차 4번 (배열 가지고 놀기) (0) | 2022.10.06 |
댓글