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

Cos Pro 1급 - 샘플 문제 풀이 2차 4번 (배열에서 중복없이 추출하기)

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

K의 배수가 되도록 세 개의 숫자 고르기

문제 지문 #4

자연수가 중복 없이 들어있는 배열이 있습니다. 이 배열에서 합이 K의 배수가 되도록 서로 다른 숫자 세 개를 고르는 방법은 몇 가지인지 세려고 합니다.

자연수가 들어있는 배열 arr가 매개변수로 주어질 때, 이 배열에서 합이 K의 배수가 되도록 서로 다른 숫자 세 개를 고르는 방법의 가짓수를 return 하도록 solution 메서드를 완성해주세요.


매개변수 설명

자연수가 들어있는 배열 arr가 solution 메소드의 매개변수로 주어집니다.

  • arr의 길이는 3 이상 100 이하입니다.
  • arr에는 1 이상 1,000 이하의 자연수가 중복 없이 들어있습니다.
  • K는 1 이상 10 이하의 자연수입니다.

return 값 설명

배열에서 합이 K의 배수가 되도록 서로 다른 숫자 세개를 고르는 방법의 가짓수를 return 해주세요.

  • 그러한 방법이 없다면 0을 return 하면 됩니다.

예시

arr K return
[1, 2, 3, 4, 5] 3 4

예시 설명

다음과 같이 4가지 방법이 있습니다.

  • 1 + 2 + 3 = 6
  • 1 + 3 + 5 = 9
  • 2 + 3 + 4 = 9
  • 3 + 4 + 5 = 12

 

혼자 풀이

메소드 전체를 완성하는 문제입니다. 20분 정도 걸렸습니다. 
처음에는 배열을 ArrayList로 변경한 후에 첫 번째 수를 remove로 제거하고 나머지에서 또 하나를 remove로 제거하는 식으로 하나씩 숫자를 추출하려고 했는데, 잘 안되었습니다.
 그런데, 그렇게 하려고 하다보니, 어차피 순서 상관없고 중복 없이 추출하면 된다는 걸 알게 되어서 for문 세 개를 순차적으로 돌리는 것으로 코딩을 했습니다.

/***********************************************
    2차 4번 K의 배수가 되도록 숫자 세 개 고르기
 ***********************************************/
// 다음과 같이 import를 사용할 수 있습니다.
class MySolution {
    public int solution(int[] arr, int K) {
        // 여기에 코드를 작성해주세요.
        int answer = 0;
        //배열에서 3개의 숫자를 중복없이 추출하여 합을 구한다.
        for(int i=0;i<arr.length-2;i++){    // 뒤에 두자리를 남겨야 하므로 -2를 한다.
            for(int j=i+1;j<arr.length-1;j++){  //뒤에 한자리를 남겨야 하므로 -1을 한다.
                for(int k=j+1;k<arr.length;k++){
                    if((arr[i]+arr[j]+arr[k])%K==0){
                        answer++;
                    }
                }
            }
        }
        //그 합을 K로 나누었을때 나머지가 0인 경우가 몇개인지 구한다.

        return answer;
    }

    // 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
    public static void main(String[] args) {
        MySolution sol = new MySolution();
        int[] arr = {1, 2, 3, 4, 5};
        int K = 3;
        int ret = sol.solution(arr, K);


        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 " + ret + " 입니다.");
    }
}

정답

코드가 참 간결하네요. 저는 for문이 index를 벗어나지 않도록 i에서 -2, j에서 -1을 해주었는데,
정답처럼 증가를 먼저 해주면 되는 거였네요. 그리고 arr.length를 별도 변수로 빼서 계산을 간결하게 해준것도 깔끔합니다.

class CorrectSolution {
    public int solution(int[] arr, int K) {
        int n = arr.length;
        int count = 0;
        for(int i = 0; i < n; ++i)
            for(int j = i + 1; j < n; ++j)
                for(int k = j + 1; k < n; ++k)
                    if((arr[i]+arr[j]+arr[k])%K == 0)
                        count += 1;
        return count;
    }
}

# 첨부 파일

프로젝트 파일 전체를 첨부합니다.
Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.

SecontQuestion4.zip
0.01MB

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

728x90

댓글