가상의 대선 프로그램을 만들어보는 문제를 풀어보았다.
처음 푼 방식
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] 출력!
'코딩테스트 > 미니과제' 카테고리의 다른 글
상품 관리 애플리케이션 (Spring MVC) (0) | 2024.03.16 |
---|---|
게시판 프로그램(데이터베이스 연동) (0) | 2024.02.05 |
간이 로또 추첨 (0) | 2024.01.07 |