티스토리 뷰
💻JAVA 코드 바로보기
문제 설명
지난 연속된 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만큼 손실을 보게 됩니다.
주어진 코드
package Set01;
class Q7{
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);
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) {
Q7 sol = new Q7();
int[] prices1 = {1, 2, 3};
int ret1 = sol.solution(prices1);
// Press Run button to receive output.
System.out.println("Solution: 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("Solution: return value of the method is " + ret2 + " .");
}
}
코드 분석
int solution(int[] prices){
int INF = 1000000001;
int tmp = INF;
//최대 이익 저장
int answer = -INF;
for(int price : prices){
if(tmp != INF)
//tmp에 변동이 있고 이익이 기존보다 큰 경우
// answer = 판 금액 - 산 금액
answer = Math.max(answer, tmp-price);
//더 싼 가격에 사기 위함
tmp = Math.min(tmp, price);
}
return answer;
}
answer에 필요한 값은 최대 이익이다.
이때 이익은 판 금액에서 산 금액을 뺀 값이므로
price : 산 금액, tmp : 판 금액일 때
answer = Math.max( answer, price-tmp ); 가 되어야 한다.
정답 코드(YBM과 동일)
int solution(int[] prices){
int INF = 1000000001;
int tmp = INF;
int answer = -INF;
for(int price : prices){
if(tmp != INF)
answer = Math.max(answer, price-tmp);
tmp = Math.min(tmp, price);
}
return answer;
}
실행 결과
KimSky904 - Overview
Department of New Media Software. KimSky904 has 28 repositories available. Follow their code on GitHub.
github.com
'[코테] > [YBM-sample]' 카테고리의 다른 글
[Cospro Java 1급] 1차 9번_해밍 거리 구하기 (0) | 2022.01.22 |
---|---|
[Cospro Java 1급] 1차 8번_배달서비스 구현하기 (0) | 2022.01.21 |
[Cospro Java 1급] 1차 6번_계단 올라가기 (0) | 2022.01.19 |
[Cospro Java 1급] 1차 5번_가장 많이 득표한 후보 (0) | 2022.01.18 |
[Cospro Java 1급] 1차 4번_두개의 오름차순 배열 합치기 (0) | 2022.01.17 |
- 알고리즘
- lv2
- cospro기출
- 배열활용문제
- C++
- COSPRO 2급
- 코스프로
- 자바
- groom
- c언어 기출문제
- c언어
- 구름 기출문제
- lv1
- C
- 구름에듀
- YBM
- CosPro
- 구름에듀 기출문제
- Cos Pro
- 프로그래머스
- 연습문제
- 기출문제
- Java
- 배열
- cospro기출문제
- 코딩테스트
- YBM기출
- 1급
- programmers
- groomedu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |