티스토리 뷰

💻JAVA 코드 바로보기

 

문제 설명

1번부터 N번까지 후보에 대해서 투표를 진행했습니다. 예를 들어 투표 결과가 [1, 5, 4, 3, 2, 5, 2, 5, 5, 4]라면 순서대로 [1번, 5번, 4번, 3번, 2번, 5번, 2번, 5번, 5번, 4번] 후보에 투표했음을 나타냅니다. 이때, 가장 많은 표를 받은 후보의 번호를 구하려고 합니다.

주어진 solution 메소드는 후보의 수 N과 투표를 진행한 결과가 담긴 배열 votes가 매개변수로 주어졌을 때, 가장 많은 표를 받은 후보의 번호를 return 하는 메소드입니다. 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 _한 줄_만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.


매개변수 설명

후보의 수 N과 투표 결과가 들어있는 배열 votes가 solution 메소드의 매개변수로 주어집니다.

  • N은 1 이상 10 이하의 자연수입니다.
  • votes의 길이는 1 이상 100 이하입니다.
  • votes의 원소는 1 이상 N이하의 자연수입니다.

return 값 설명

가장 많은 표를 받은 후보의 번호를 배열에 담아 return 해주세요

  • 만약 가장 많은 표를 받은 후보가 2개 이상이라면, 그 후보들의 번호를 모두 배열에 담아 오름차순 정렬하여 return 해주세요.

예시

N votes return
5 [1,5,4,3,2,5,2,5,5,4] [5]
4 [1,3,2,3,2] [2,3]

 

예시 설명

#1
1번부터 5번까지 5개의 후보가 있으며, 투표 결과는 [1, 5, 4, 3, 2, 5, 2, 5, 5, 4]입니다. 각 후보의 득표수는 다음과 같습니다.

  • 1번 후보가 1표
  • 2번 후보가 2표
  • 3번 후보가 1표
  • 4번 후보가 2표
  • 5번 후보가 4표

이 경우 5번 후보가 4표로 가장 많은 표를 얻었습니다.

#2
1번 후보가 1표, 2번 후보가 2표, 3번 후보가 2표씩 받았습니다. 2번과 3번 후보가 공동으로 가장 많은 표를 받았기 때문에 [2, 3]을 오름차순 정렬하여 return 하면 됩니다.

 

 


 

 

주어진 코드

package Set01;

import java.util.*;

class Q5 {
    public int[] solution(int N, int[] votes) {
        int voteCounter[] = new int[11];
        for (int i = 0; i < votes.length; i++) {
            voteCounter[votes[i]] += 1;
        }
        int maxVal = 0;
        int cnt = 0;
        for (int i = 1; i <= N; i++) {
            if (maxVal < voteCounter[i]) {
                maxVal = voteCounter[i];
                cnt = 1;
            }
            else if(maxVal == voteCounter[i]){
                cnt += 1;
            }
        }
        int answer[] = new int[cnt];
        for (int i = 1, idx = 0; i <= N; i++){
            if (voteCounter[i] == maxVal) {
                answer[idx] = voteCounter[i];
                idx += 1;
            }
        }
        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) {
        Q5 sol = new Q5();
        int N1 = 5;
        int[] votes1 = {1,5,4,3,2,5,2,5,5,4};
        int[] ret1 = sol.solution(N1, votes1);

        // Press Run button to receive output.
        System.out.println("Solution: return value of the method is " + Arrays.toString(ret1) + " .");


        int N2 = 4;
        int[] votes2 = {1, 3, 2, 3, 2};
        int[] ret2 = sol.solution(N2, votes2);

        // Press Run button to receive output.
        System.out.println("Solution: return value of the method is " + Arrays.toString(ret2) + " .");
    }
}

 

 

코드 분석

package Set01;

import java.util.*;

class Q5 {
    public int[] solution(int N, int[] votes) {
        //각 후보에 대한 득표 수 세기 
        int voteCounter[] = new int[11];
        for (int i = 0; i < votes.length; i++) {
            voteCounter[votes[i]] += 1;
        }
        //가장 많은 표를 구함
        int maxVal = 0;
        //가장 많은 표(maxVal)를 받은 후보의 수
        int cnt = 0;
        for (int i = 1; i <= N; i++) {
            if (maxVal < voteCounter[i]) {
                maxVal = voteCounter[i];
                cnt = 1;
            }
            else if(maxVal == voteCounter[i]){
                cnt += 1;
            }
        }
        //최다득표한 후보의 수만큼 배열 생성 (return값)
        int answer[] = new int[cnt];
        //해당 후보의 번호를 answer에 저장
        for (int i = 1, idx = 0; i <= N; i++){
            if (voteCounter[i] == maxVal) {
                answer[idx] = voteCounter[i];
                idx += 1;
            }
        }
        return answer;
    }
}

voteCounter 출력 결과

코드를 분석하면서 조금 의아했던 점은 보통 배열은 index 0부터 채우는 것이 일반적인데,

주어진 코드는 후보 1번의 득표수는 인덱스 1에, 후보 2번의 득표수는 인덱스 2에 넣어 인덱스 0은 비워놓은 채로 득표수를 저장하고 있다.

이 부분 때문에 헷갈리기 쉬웠다.

우리가 집중해서 봐야할 부분은 아래 코드이다.

//최다득표한 후보의 수만큼 배열 생성 (return값)
int answer[] = new int[cnt];
//해당 후보의 번호를 answer에 저장
for (int i = 1, idx = 0; i <= N; i++){
    if (voteCounter[i] == maxVal) {
        answer[idx] = voteCounter[i];
        idx += 1;
        System.out.println(voteCounter[i]);
    }
}

분명 위에서 후보1 -> 인덱스1로 저장했기 때문에 answer[idx] = voteCounter[i]+1을 해줘야겠다고 생각했으나

for문에서 int i = 1으로 선언했으므로 문제가 없다.

진짜 문제는 예시 2였다.

잘못된 return값이 [2,2]를 나타냈기 떄문에 어떻게 i값이 증가하지 않을수가있지??라고 한참을 고민했으나

알고보니!!

우리가 원하는 return값은 최다득표의 값이 아니라 득표 수가 최다인 후보의 번호이다.

현재 answer배열에 할당하고 있는 voteCounter[i]값은 i번째 후보가 받은 투표의 수이므로 똑같은 2값이 나오는것이 당연한 것이었다.

따라서 anwer[idx] = i; 문으로 수정했다.

 

 

정답 코드(YBM과 동일)

package Set01;

import java.util.*;

class Q5 {
    public int[] solution(int N, int[] votes) {
        int voteCounter[] = new int[11];
        for (int i = 0; i < votes.length; i++) {
            voteCounter[votes[i]] += 1;
        }
        int maxVal = 0;
        int cnt = 0;
        for (int i = 1; i <= N; i++) {
            if (maxVal < voteCounter[i]) {
                maxVal = voteCounter[i];
                cnt = 1;
            }
            else if(maxVal == voteCounter[i]){
                cnt += 1;
            }
        }
        int answer[] = new int[cnt];
        for (int i = 1, idx = 0; i <= N; i++){
            if (voteCounter[i] == maxVal) {
                answer[idx] = i;          //수정
                idx += 1;
            }
        }
        return answer;
    }
}

 

 


 

 

 

 

KimSky904 - Overview

Department of New Media Software. KimSky904 has 27 repositories available. Follow their code on GitHub.

github.com

 

댓글