Skip to content

Instantly share code, notes, and snippets.

@YongWanJin
Last active July 8, 2023 09:47
Show Gist options
  • Save YongWanJin/0ef86044f3b2674a06cd33e2d181d89a to your computer and use it in GitHub Desktop.
Save YongWanJin/0ef86044f3b2674a06cd33e2d181d89a to your computer and use it in GitHub Desktop.
제로베이스 백엔드 1주차 미니과제 6번
/*
진용완
제로베이스 백엔드 스쿨 15기
*/
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;
import java.util.stream.*;
class Election {
// [ 변수 ]
int allVoteNum; // 총 투표수(투표 참여 인원수)
int candNum; // 후보자(candidate) 인원수
ArrayList<String> names = new ArrayList<>(); // 후보자 이름 명단
ArrayList<Integer> voteNums = new ArrayList<>(); // 각 후보자가 받은 표의 수
int f = 10; // 매서드 electionStart()에서 한글이름 포멧팅을 위한 변수
// [ 메서드 ]
// # 입력 받는 메서드
public void getInfo(){
String name;
Scanner sc;
System.out.print("총 진행할 투표수를 입력해 주세요.");
sc = new Scanner(System.in);
allVoteNum = sc.nextInt();
System.out.print("가상 선거를 진행할 후보자 인원을 입력해 주세요.");
sc = new Scanner(System.in);
candNum = sc.nextInt();
for (int i = 0; i<candNum; i++) {
System.out.printf("%d번째 후보자 이름을 입력해주세요.", i+1);
sc = new Scanner(System.in);
name = sc.nextLine();
names.add(name);
// 이름 글자수에 따른 글자 간격 조정
if (name.length()>=5 & name.length()<7){
f = 14;
} else if(name.length()>=7){
f = 18;
}
}
// 후보자 인원 수에 맞게 리스트 voteNums 초기화
for (int i = 0; i<names.size(); i++){
voteNums.add(0);
}
System.out.println();
}
// # 모의 선거 실시하는 메서드
public void electionStart(){
Random random = new Random();
int vote; // 투표함에서 꺼낸 표가 몇 번 후보의 것인지 알려주는 변수
// 개표 진행 및 개표 상황 출력
for (int i = 0; i<allVoteNum; i++){
// 표 한장 개표
vote = random.nextInt(names.size()); // 이 표가 몇 번 후보자의 것인지 랜덤으로 지정
voteNums.set(vote, voteNums.get(vote)+1); // 해당 후보자 자리에 있는 수에, 1씩 합산
// 출력 포멧 지정 : 투표진행율
double ratio1 = (double)(i+1)/allVoteNum*100;
ratio1 = Math.round(ratio1*100)/100.0;
// 전체 진행 상황 출력
System.out.printf("[투표진행률]: %.2f%%, %d명 투표 => %s\n", ratio1, i+1, names.get(vote));
for(int j=0; j<names.size(); j++){
// 출력 포멧 지정 : 후보 이름
String n = names.get(j);
String format1 = n + ":" + " ".repeat(f - n.length()*2);
// 출력 포멧 지정 : 득표율
double ratio2 = (double)voteNums.get(j)/allVoteNum*100;
ratio2 = Math.round(ratio2*100)/100.0;
String format2 = ratio2 + "%";
// 각 후보자별 상황 출력
System.out.printf("[기호:%d] %s %-8s (투표수: %d)\n", j+1, format1, format2, voteNums.get(j));
}
System.out.println();
}
// 당선 결과 출력
IntStream voteNumsStream = voteNums.stream().flatMapToInt(IntStream::of);
int voteMax = voteNumsStream.max().getAsInt();
int voteMaxIndex = voteNums.indexOf(voteMax);
String winner = names.get(voteMaxIndex);
System.out.println("[투표결과] 당선인 : " + winner);
}
}
// 메인부
public class Mini6Vote {
public static void main(String[] args) {
Election election = new Election();
election.getInfo();
election.electionStart();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment