다오의 개발일지

프로그래머스 LV.0 최댓값 만들기 (1) 본문

코딩테스트

프로그래머스 LV.0 최댓값 만들기 (1)

다오__ 2023. 5. 26. 11:29

https://school.programmers.co.kr/learn/courses/30/lessons/120847

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

LV.0 문제를 풀다가 쉬워보였지만 중간에 막히는 문제가 발생해서 작성하게 되었다.

 

이 문제는 파라미터로 넘어오는 배열에서 순서대로 최대값 2개를 서로 곱하여 리턴하는 함수이다.

numbers = {1,2,3,4,5}인 경우

최대값 2개인 5와 4를 곱해 20이라는 값을 리턴하는 방식이다.

 

우선 문제 해결에 다가가기 위해 아래의 순서대로 작성했다.

  1. numbers배열에서 max값을 뽑는다
  2. numbers2배열을 만들어 max값을 제외한 값을 삽입한다.
  3. numbers2배열에서 max2값을 뽑는다.
  4. 두 값의 곱을 구한다.

조금 절차가 길지만 해결만 할 수 있다면야...

import java.util.*;
class Solution {
    public int solution(int[] numbers) {
        // numbers배열에서 max값을 뽑는다
        // numbers2배열을 만들어 max값을 제외한 값을 넣는다.
        // numbers2배열에서 max2값을 뽑는다.
        // 두 값의 곱을 구한다.

        Arrays.sort(numbers);

        int[] numbers2 = new int[numbers.length-1];
        int answer = 0;

        int max = 0;
        int max2 = 0;

        //max값 구하기
        for(int i=0; i<numbers.length; i++){
            if(max < numbers[i]){
                max = numbers[i];
            }
        }   

        //max값을 제외한 numbers2배열 생성
        for(int i=0; i<numbers.length-1; i++){

            if(max != numbers[i])
                numbers2[i] = numbers[i];
            }

        //numbers2배열에서 max2값 구하기
        for(int i=0; i<numbers2.length; i++){
            if(max2 < numbers2[i]){
                max2 = numbers2[i];
                }
            }

        //두개의 max값 곱하기
        answer = max * max2;


        return answer;
    }
}

테스트도 성공했지만....

 

결과 채점에서 한개의 케이스에서 자꾸 틀리게 나왔다...

아무리 생각해봐도 모르겠어서 질문하기로 들어가보니 아니나 다를까. 나와 같은 테스트4번에서 실패한다는 글들이 많았다.

 

원인은 간단했다.
numbers = {1,3,4,5,5} 의 경우

즉 반례로 최대값이 같은 값이 나오는 경우 실패한다는 것이다.

 

 

어떻게 해야할까 하는 중
2번째 절차, numbers2에 max값을 제외한 배열을 넣을 때. if문에 !=을 넣으면 최대값과 같은 값은 들어가지 않아버려 1,3,4만 들어가게 된다.

 

그래서 if문을 max >= 로 수정해 작거나 같은 값을 배열에 넣게끔 수정하니 결과 채점을 통과 할 수 있었다.

작성코드

import java.util.*;
class Solution {
    public int solution(int[] numbers) {
        // numbers배열에서 max값을 뽑는다
        // numbers2배열을 만들어 max값을 제외한 값을 넣는다.
        // numbers2배열에서 max2값을 뽑는다.
        // 두 값의 곱을 구한다.

        Arrays.sort(numbers);

        int[] numbers2 = new int[numbers.length-1];
        int answer = 0;

        int max = 0;
        int max2 = 0;

        //max값 구하기
        for(int i=0; i<numbers.length; i++){
            if(max < numbers[i]){
                max = numbers[i];
            }
        }   

        //max값을 제외한 numbers2배열 생성
        for(int i=0; i<numbers.length-1; i++){

            if(max >= numbers[i])
                numbers2[i] = numbers[i];
            }

        //numbers2배열에서 max2값 구하기
        for(int i=0; i<numbers2.length; i++){
            if(max2 < numbers2[i]){
                max2 = numbers2[i];
                }
            }

        //두개의 max값 곱하기
        answer = max * max2;


        return answer;
    }
}

 

다른 사람의 문제풀이를 보니 참 돌고돌아 풀었다는 생각이 든다.