본문 바로가기
ALGORITHM/푼 문제들&과정

[JAVA] 백준 4344번

by sjs_2215 2019. 2. 27.

문제:

https://www.acmicpc.net/problem/4344

첫 번째 시도:

입력받기->각 줄 평균 구하기->평균 넘는 학생 구하기->평균 넘는 학생 비율 구하기

이렇게 크게 4개로 쪼개어 생각 시작. 코딩시작

문제점:

각 줄 평균 구하는 것 되는데 각 줄 평균을 넘는 학생을 구하는데 배열 인덱스? 가 꼬여버림. 학생의 점수를 저장하는데 다차원 배열로 저장해야하나? 싶음.

package till;
import java.util.*;

public class Main {
private static final int[] Kaprekar = null;
public static void main(String[] args){

//입력받기
Scanner scan=new Scanner(System.in);
int t_case=scan.nextInt();
int[] score = new int[1000];//각 학생 점수 저장
int temp=0;//평균구할때 쓸 총합 변수
int[] average= new int[100];

for(int i=0;i<t_case;i++){
int student_num=scan.nextInt();
//int[] average = new int[student_num];//인덱스마다 케이스의 평균을 저장

for(int j=0;j<student_num;j++){
score[j]=scan.nextInt();
temp=temp+score[j];
}
average[i]=temp/student_num;//각 줄 평균 구하기
System.out.println(average[i]);
temp=0;


}

//평균 넘는 학생 구하기
for(int i=0;i<t_case;i++){

for(int j=0;j<score.length;j++){
if(average[i]<score[j]){
System.out.println("평균넘는애들: "+score[j]);
}
}
}



//평균 넘는 학생 비율 반올림하기


}
}


두 번째 시도: 첫 번째 시도에서 발생한 문제점은 생각한대로 다차원 배열로 하니까 풀림~

다차원 배열의 필요성,,

package till;
import java.util.*;

public class Main {
private static final int[] Kaprekar = null;
public static void main(String[] args){

//입력받기
Scanner scan=new Scanner(System.in);
int t_case=scan.nextInt();
int[][] score = new int[100][1000];//각 학생 점수 저장
int temp=0;//평균구할때 쓸 총합 변수
int[] average= new int[100];

for(int i=0;i<t_case;i++){
int student_num=scan.nextInt();
//int[] average = new int[student_num];//인덱스마다 케이스의 평균을 저장

for(int j=0;j<student_num;j++){
score[i][j]=scan.nextInt();
temp=temp+score[i][j];
}
average[i]=temp/student_num;//각 줄 평균 구하기
System.out.println(average[i]);
temp=0;


}

//평균 넘는 학생 구하기
for(int i=0;i<t_case;i++){

for(int j=0;j<score.length;j++){
if(average[i]<score[i][j]){
System.out.println("평균넘는애들: "+score[i][j]);
}
}
}



//평균 넘는 학생 비율 반올림하기


}
}


세 번째 시도:

문제점:

세 번째 자리 반올림 어떻게 하는지 모름

-> Math.round() 예제

double pie = 3.14159265358979;
System.out.println(Math.round(pie)); //결과 : 3
System.out.println(Math.round(pie*100)/100.0); //결과 : 3.14
System.out.println(Math.round(pie*1000)/1000.0); //결과 : 3.142


네 번째 시도:

문제점:

평균 보다 높은 애들의 수도 잘 구해짐.

그리고 각 케이스마다 아이들의 수도 잘 구해짐.

그리고 자바로 퍼센트 구하는 방법도 알게됨.

->비율 구하는 방법

그런데 결과값이 이상하게 나옴. 계속 0이 나옴.

package till;
import java.util.*;

public class Main {
private static final int[] Kaprekar = null;
public static void main(String[] args){

//입력받기
Scanner scan=new Scanner(System.in);
int t_case=scan.nextInt();
int[][] score = new int[100][1000];//각 학생 점수 저장
int[] score_num=new int[100];
int temp=0;//평균구할때 쓸 총합 변수
int[] average= new int[100];//인덱스마다 케이스의 평균을 저장하기 위해
int top=0;
double result=0;

for(int i=0;i<t_case;i++){
int student_num=scan.nextInt();
score_num[i]=student_num;
for(int j=0;j<student_num;j++){
score[i][j]=scan.nextInt();
temp+=score[i][j];
}
average[i]=temp/student_num;//각 줄 평균 구하기
System.out.println(average[i]);
temp=0;


}

//평균 넘는 학생 구하기
for(int i=0;i<t_case;i++){

for(int j=0;j<score_num[i];j++){
if(average[i]<score[i][j]){
System.out.println("평균넘는애들: "+score[i][j]);
top++;

}}result=((top/score_num[i])*100.0);
System.out.println("top은 "+top);
System.out.println("score_num은 "+score_num[i]);



top=0;
System.out.println("비율: "+Math.round(result*1000)/1000.0);;

}



//평균 넘는 학생 비율 반올림하기


}
}


다섯 번째 시도:

해결!

비율 구하는 부분에서

정수의 경우에는 (double) 로 실수화시키지 않으면 0.0 이라는 엉뚱한 값이 나옴. 맨 끝의 + "%" 이 부분은 공식의 일부가 아니라 퍼센트 기호 출력

실수를 double화 시켜야 했음!

문제점:

값이 깔끔하게 0으로 떨어질때 세번째 소수점까지 나오지 않는 문제가 있음 //System.out.println(Math.round(result*1000)/1000.0+"%");//평균 넘는 학생 비율 반올림하기

package till;
import java.util.*;

public class Main {
private static final int[] Kaprekar = null;
public static void main(String[] args){

//입력받기
Scanner scan=new Scanner(System.in);
int t_case=scan.nextInt();
int[][] score = new int[100][1000];//각 학생 점수 저장
int[] score_num=new int[100];
int temp=0;//평균구할때 쓸 총합 변수
int[] average= new int[100];//인덱스마다 케이스의 평균을 저장하기 위해
int top=0; //평균 넘는 학생 수를 저장
double result;

for(int i=0;i<t_case;i++){
int student_num=scan.nextInt();
score_num[i]=student_num;
for(int j=0;j<student_num;j++){
score[i][j]=scan.nextInt();
temp+=score[i][j];
}
average[i]=temp/student_num;//각 줄 평균 구하기
//System.out.println(average[i]);
temp=0;
}

//평균 넘는 학생 구하기
for(int i=0;i<t_case;i++){

for(int j=0;j<score_num[i];j++){
if(average[i]<score[i][j]){
top++;
}
}
//System.out.println("top은 "+top);
//System.out.println("score_num은 "+score_num[i]);
result=(double)top/(double)score_num[i]*100.0;//학생 수 중 비율 넘는 아이들의 퍼센트는?
//반올림해서 출력
System.out.println("반올림 비율: "+Math.round(result*1000)/1000.0);//평균 넘는 학생 비율 반올림하기
top=0;
}
}
}


여섯 번째 시도:

소수점 형식 지키는 다른 방법을 사용

package till;
import java.util.*;

public class Main {
private static final int[] Kaprekar = null;
public static void main(String[] args){

//입력받기
Scanner scan=new Scanner(System.in);
int t_case=scan.nextInt();
int[][] score = new int[100][1000];//각 학생 점수 저장
int[] score_num=new int[100];
int temp=0;//평균구할때 쓸 총합 변수
int[] average= new int[100];//인덱스마다 케이스의 평균을 저장하기 위해
int top=0; //평균 넘는 학생 수를 저장
double result;

for(int i=0;i<t_case;i++){
int student_num=scan.nextInt();
score_num[i]=student_num;
for(int j=0;j<student_num;j++){
score[i][j]=scan.nextInt();
temp+=score[i][j];
}
average[i]=temp/student_num;//각 줄 평균 구하기
//System.out.println(average[i]);
temp=0;
}

//평균 넘는 학생 구하기
for(int i=0;i<t_case;i++){

for(int j=0;j<score_num[i];j++){
if(average[i]<score[i][j]){
top++;
}
}
//System.out.println("top은 "+top);
//System.out.println("score_num은 "+score_num[i]);
result=(double)top/(double)score_num[i]*100.0;//학생 수 중 비율 넘는 아이들의 퍼센트는?
//반올림해서 출력-방법1-> 이건 값이 깔끔하게 0으로 떨어질때 세번째 소수점까지 나오지 않는 문제가 있음
//System.out.println(Math.round(result*1000)/1000.0+"%");//평균 넘는 학생 비율 반올림하기
//반올림해서 출력-방법2
System.out.printf("%.3f",result);
System.out.println("%");
top=0;
}
}
}


'ALGORITHM > 푼 문제들&과정' 카테고리의 다른 글

[JAVA] 백준 1110번  (0) 2019.03.03
[JAVA] 백준 1065번  (0) 2019.03.03
[JAVA] 백준 4673번  (0) 2019.02.26
[JAVA] 백준 10817번  (0) 2019.02.01
[JAVA] 백준 1924번  (0) 2019.01.31

Comments