본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 풀이 1차 7번

by 우공80 2022. 10. 7.
728x90

주식 매매 시 최대 이익 찾기

문제 지문 #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..." 메뉴에서 불러다 쓰시면 됩니다.

FirstQuestion7.zip
0.01MB

출처: https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp

728x90

댓글