수행 목적 : 조건문 및 반복문과 배열(or 컬렉션)을 통한 당선 시뮬레이션 로직 작성
간략 소개 : 민주주의에서 선거는 대단히 중요한 의사 표현입니다. 이런 선거를 미리 시뮬레이션을 통해서 진행하는 프로그램을 만들어 보고자 합니다. 전체 투표수와 후보자를 입력받아서 그 결과를 미리 확인하는 선거 및 당선 시뮬레이션 프로그램을 만들어 보세요.
필수 준수사항
- 총 투표를 진행할 투표수를 입력 받음
- 선거를 진행할 후보자 수를 입력 받고, 이에 대한 이름을 입력 받음
- 각 입력받은 후보자는 순서대로 기호1, 기호2, 기호3... 형식으로 기호번호 부여함
- 각 투표수의 결과는 선거를 진행할 후보자를 동일한 비율로 랜덤하게 발생
- 임의번호는 Random함수의 nextInt()함수를 통해서 생성
- 1표에 대한 투표한 결과에 대해서 투표자와 이에 대한 결과를 화면 출력해야 함
아래 내용은 전제조건으로 진행
- 투표수는 1 ~ 10000 사이의 값을 입력하며, 그외 값 입력에 대한 예외는 없다고 가정함.
- 후보자 인원은 2 ~ 10 사이의 값을 입력 받으면, 그외 값 입력에 대한 예외는 없다고 가정함.
- 후보자이름은 한글로 입력하며, 10자 미만으로 입력함. (역시, 그외 입력에 대한 예외는 없다고 가정함.)
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
/**
* 가상 선거 및 당선 시뮬레이션 프로그램
*/
public class VotingProgram {
/**
* 투표하기 및 결과출력
*
* @param map 기호번호, 후보자로 구성된 맵
* @param voteCnt 총 투표 수
*/
public static void voteAndPrint(HashMap<Integer, Candidate> map, int voteCnt) {
// 뽑을 후보자 번호
int voteNum = 0;
// 후보자
Candidate candidate;
// 최다 득표 후보자
Candidate maxVoteCandidate;
// 최다 득표자 수
int maxVoteCandidateCnt = 0;
Random randomVote = new Random();
for (int i = 1; i <= voteCnt; i++) {
// nextInt()로 생성된 임의번호로 기호?번 후보자에게 투표
voteNum = randomVote.nextInt(map.size()) + 1;
// 투표 받은 후보자 호출 및 득표수 + 1
candidate = map.get(voteNum);
candidate.plusCnt();
// 투표진행률 출력 (투표 받은 후보자)
System.out.printf("[투표진행률]: %.2f%%, %d명 투표 => %s\n", ((double) i / (double) voteCnt * 100.0), i, candidate.name);
// 투표현황 출력 (모든 후보자)
for (int j = 1; j <= map.size(); j++) {
candidate = map.get(j);
if (candidate.curVoteCnt > 0) {
System.out.printf("[기호:%d] %s:\t%.2f%%\t(투표수: %d)\n", j, candidate.name, ((double) candidate.curVoteCnt / (double) voteCnt * 100.0), candidate.curVoteCnt);
} else {
System.out.printf("[기호:%d] %s:\t0.00%%\t(투표수: %d)\n", j, candidate.name, candidate.curVoteCnt);
}
}
System.out.println();
}
// 최다득표자 찾기
maxVoteCandidate = new Candidate(map.get(1).name, map.get(1).curVoteCnt);
for (int i = 2; i <= map.size(); i++) {
if (maxVoteCandidate.curVoteCnt < map.get(i).curVoteCnt) {
maxVoteCandidate = new Candidate(map.get(i).name, map.get(i).curVoteCnt);
}
}
// 최다득표자 수 구하기
for (int i = 1; i <= map.size(); i++) {
if (maxVoteCandidate.curVoteCnt == map.get(i).curVoteCnt) {
maxVoteCandidateCnt++;
}
}
// 결과 출력
// 최다득표자가 1명이면 당선인 출력
// 2명 이상이면 재투표 멘트와 최다득표자 모두 출력
if (maxVoteCandidateCnt == 1) {
System.out.printf("[투표결과] 당선인 : %s", maxVoteCandidate.name);
} else {
System.out.println("[투표결과] 최다 득표자 2인 이상 발생. 재투표 진행해주세요.");
for (int i = 1; i <= map.size(); i++) {
if (maxVoteCandidate.curVoteCnt == map.get(i).curVoteCnt) {
System.out.printf("[투표결과] 최다득표자 : %s\t(투표수: %d)\n", map.get(i).name, map.get(i).curVoteCnt);
}
}
}
}
/**
* 후보자 클래스
*/
public static class Candidate {
String name;
int curVoteCnt;
public Candidate() {}
public Candidate(String name, int curVoteCnt) {
this.name = name;
this.curVoteCnt = curVoteCnt;
}
public void plusCnt() {
curVoteCnt++;
}
}
public static void main(String[] args) {
// 총 투표 수
int voteCnt = 0;
// 후보자 수
int candidateCnt = 0;
// 후보자 번호
int candidateNum = 1;
HashMap<Integer, Candidate> map = new HashMap<>();
Scanner sc = new Scanner(System.in);
System.out.print("총 진행할 투표수를 입력해 주세요.");
voteCnt = sc.nextInt();
System.out.print("가상 선거를 진행할 후보자 인원을 입력해 주세요.");
candidateCnt = sc.nextInt();
// 후보자 이름 입력 시 후보자 클래스 생성 후 map에 추가
// 후보자 수 - map.size()가 0보다 클 때 까지만 후보자 생성
while (candidateCnt - map.size() > 0) {
System.out.print(candidateNum + "번째 후보자이름을 입력해 주세요.");
Candidate candidate = new Candidate(sc.next(), 0);
map.put(candidateNum, candidate);
candidateNum++;
}
System.out.println();
voteAndPrint(map, voteCnt);
sc.close();
}
}
Scanner를 통해 총 투표수를 입력받아 int voteCnt에 저장
후보자 인원을 입력 받아 int candidateCnt에 저장
HashMap<Integer, Candidate>로 후보자 저장 및 관리
Integer 값은 후보자의 번호로 1부터 시작해서 후보자 인원 수 만큼 증가하며 map에 저장되며
Candidate는 후보자이름과, 현재투표수(0)로 저장
임의번호로 기호 n번 후보자에게 투표하기 위해
Random randomVote = new Random();
randomVote.nextInt(map.size()) + 1;을 이용해서 진행
전제조건에 최다득표자가 2인 이상 발생하는 조건에 대한 예외가 없기 때문에
최다득표자 수를 구한 뒤에 최다득표자 수가 최다득표자가 2인 이상일 경우
'[투표결과] 최다 득표자 2인 이상 발생. 재투표 진행해주세요.' 멘트 출력
실행결과
2024.04.12 - [Zero-base] - 달력 출력 프로그램 제로베이스 백엔드 스쿨 미니과제 5
2024.04.12 - [Zero-base] - 주민등록번호 생성 프로그램 제로베이스 백엔드 스쿨 미니과제 4
2024.04.11 - [Zero-base] - 놀이동산 입장권 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 3
2024.04.11 - [Zero-base] - 결제 금액 캐시백 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 2
2024.04.10 - [Zero-base] - 콘솔 화면에 구구단 출력하기 제로베이스 백엔드 스쿨 미니과제 1
'📌Zero-base' 카테고리의 다른 글
연소득 과세금액 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 8 (0) | 2024.04.14 |
---|---|
로또 당첨 프로그램 제로베이스 백엔드 스쿨 미니과제 7 (0) | 2024.04.14 |
달력 출력 프로그램 제로베이스 백엔드 스쿨 미니과제 5 (0) | 2024.04.12 |
주민등록번호 생성 프로그램 제로베이스 백엔드 스쿨 미니과제 4 (0) | 2024.04.12 |
놀이동산 입장권 계산 프로그램 제로베이스 백엔드 스쿨 미니과제 3 (0) | 2024.04.11 |