코딩테스트/미니과제

가상 대선 시뮬레이션

여파고 2024. 1. 7. 00:32

가상의 대선 프로그램을 만들어보는 문제를 풀어보았다.

처음 푼 방식

public static void main(String[] args) {
        int vote;
        int c1 = 0; // 후보자(candidates)별 득표수를 선언해주었다
        int c2 = 0;
        int c3 = 0;
        int c4 = 0;
        
        //랜덤함수를 써서 각각 후보자별득표수 변수에 넣어주었다.
        //for문은 총투표수 10000번으로 해주었다.
            Random random = new Random(); 
        for (int i = 0; i < 10000; i++) {
            vote = (random.nextInt(4)+1);
            if (vote == 1) {
                c1 += 1;
            } else if (vote == 2) {
                c2 += 1;
            } else if (vote == 3) {
                c3 += 1;
            } else if (vote == 4) {
                c4 += 1;
            }
        }
        
        //득표율을 구하기위해 또 실수형 변수들을 선언해주고 초기화;
        double voteC1 = (c1 / 100.00);
        double voteC2 = (c2 / 100.00);
        double voteC3 = (c3 / 100.00);
        double voteC4 = (c4 / 100.00);
        
        //출력
        System.out.printf("[기호:1] 이재명: %.2f%%, (투표수: %d)\n", voteC1, c1);
        System.out.printf("[기호:2] 윤석열: %.2f%%, (투표수: %d)\n", voteC2, c2);
        System.out.printf("[기호:3] 심상정: %.2f%%, (투표수: %d)\n", voteC3, c3);
        System.out.printf("[기호:4] 안철수: %.2f%%, (투표수: %d)\n", voteC4, c4);
        
        //최다득표자를 찾기 위해 정수변수max를 선언해주고
        //득표수를 배열로 만들어서 비교해서 max에 값을 넣었다.
        int max = 0;
        int[] array = {c1, c2, c3, c4};
        for (int i = 0; i < 4; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        
        max가 해당 후보자별 득표수와 같을때 출력하는 조건문
        if (max == c1) {
            System.out.println("[투표결과] 당선인: 이재명");
        } else if (max == c2) {
            System.out.println("[투표결과] 당선인: 윤석열");
        } else if (max == c3) {
            System.out.println("[투표결과] 당선인: 심상정");
        } else if (max == c4) {
            System.out.println("[투표결과] 당선인: 안철수");
        }
    }

먼저 후보자별 투표수를 candidate라는 의미로 c1,c2,c3,c3의 정수형 변수로 선언을 해주고 0값을 넣어서 초기화를 해두었다.

랜덤투표번호를 받아줄 vote라는 정수형 변수를 선언했다.
random.nextInt(4)+1을 써서 1부터 4까지의 숫자를 무작위로 뽑도록 해서 int vote에 넣어주었고, if문을 써서 vote가 각각 1-4일때 c1-4에 1씩 더해주는 for문을 총 투표수 10000번 돌려주었다.

투표율을 따로 뽑으려고 후보자별 투표수인 c1-4변수를 100씩 나눠서 실수형변소 voteC1-4에 따로 넣어주었다.

그리고 최대 투표수를 얻은 당선자를 가려내기 위해
정수형 변수 max를 0을 넣어서 초기화해주었고
각 후보별 투표수를 array배열에 담아서 for문을 돌려서 비교를 통해 가장 큰 값을 max에 넣어주었다.

max값을 c1-4와 비교해서 max와 같은 c1-4를 찾아내서,
해당 변수에 해당하는 후보자의 당선을 알리는 출력문을 뽑게 하였다.

리팩토링을 해본 부분

내가 처음 짰던 코드에는
선언된 변수가 너무 많고 출력문도 많아서
코드가 길고 간결해보이지 않았다.
득표율을 구할 때, 그저 득표수/100 요런식으루 해가지고 이걸 변수화 시킬 필요도 있었다.

후보자별 투표수 c1,c2,c3,c4를 배열로 만들어볼 것
투표율을 구할때 변수 선언해서 조금 더 간략화
...아무튼 배열을 써서 전반적으로 더 깔끔하게 코드를 짜볼 것

 public static void main(String[] args) {
        double totalVotes = 10000;  //총 투표수 10000
        int[] candidates = new int[4]; //후보자별 득표수 배열
        String[] candiName = {"이재묭", "융석열", "상심정", "안찰스"}; //제**이스 저작권 걸릴까봐 이름 바꿈ㅎㅎ
        
        //득표수배열의 인덱스에 랜덤함수를 넣어주고 한번 호명(?)될 때 마다 배열값에 1을 더해주었다
        Random random = new Random();
        for (int i = 0; i < 10000; i++) {
            candidates[(random.nextInt(4) + 0)] += 1;
        }
        
        int max = 0; //최다득표자를 뽑기 위한 max
        int maxman = 0; //최다득표자 배열 인덱스를 위한 maxman
        for (int i = 0; i < 4; i++) {
            System.out.printf("[기호:%d] %s: %.2f%%, (투표수: %d)\n", i + 1, candiName[i], candidates[i] / totalVotes * 100.0, candidates[i]);
            if (candidates[i] > max) {
                max = candidates[i];
                maxman = i;
            }
        }
        
 //maxman에 들어있는 값이 무조건 최다득표자의 인덱스이기 때문에 여타 조건문이 필요없다.
          System.out.println("[투표결과] 당선인: " + candiName[maxman]);

        }
    }

우선 총 투표수를 double타입 totalVotes에 넣어주었다.
하나씩 변수로 만들었던 후보자별 득표수는
candidates배열로 만들어서 좀 더 깔끔해졌다(?)
candidates의 인덱스에 랜덤함수를 넣고 한번씩 나올때마다 값에 +=1씩을 해주는 for문을 썼다.
max부분은 비슷하게 했지만 비교를 맨 위에 만들어두었던 배열로만 바꾸었고,
maxman 변수를 하나 더 만들어서 최대값배열의 인덱스를 넣어주었다.

그리고 마지막에 조건문 쓸 필요없이 바로 candiName[maxman] 출력!

반응형