백준 1546 자바
평균
1. 배열을 사용해서 푼 경우
Int형 배열을 선언하고 거기에 맞춰서 문제를 푼 경우는 아래와 같다.
package Array;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Q1546 {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(bf.readLine());
double maxNum = 0.0;
double ans = 0;
StringTokenizer st = new StringTokenizer(bf.readLine()," ");
double[] data = new double[cnt];
for(int i=0; i<cnt; i++){
double tmp = Double.parseDouble(st.nextToken());
if(maxNum<tmp) maxNum = tmp;
data[i] = tmp;
}
for(int j=0; j<cnt; j++){
ans += (data[j] / maxNum) * 100;
}
ans = ans/cnt;
System.out.println(ans);
}
}
2. ArrayList를 사용해서 푼 경우
ArrayList 함수를 이용해서 푼 경우
package Array;
import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Q1546_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
ArrayList<Double> score = new ArrayList<>();
for(int i=0; i<cnt; i++){
score.add(Double.parseDouble(st.nextToken()));
}
Collections.sort(score);
double maxNum = score.get(cnt-1);
double ans = 0;
for (double d : score){
ans += (d/maxNum)*100;
}
System.out.print(ans/score.size());
}
}
백준 8958 자바
OX퀴즈
package Array;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Q8958 {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//StringTokenizer st = new StringTokenizer();
int caseCnt = Integer.parseInt(br.readLine());
int[] score = new int[caseCnt];
for(int i=0; i<caseCnt; i++){
int lineScore = 0;
int seqeunceScore = 0;
String line = new String();
line = br.readLine();
for(int j=0; j<line.length(); j++){
if(line.charAt(j)=='O') {
seqeunceScore++;
lineScore += seqeunceScore;
}
else {
seqeunceScore=0;
}
}
System.out.println(lineScore);
}
}
}
백준 4344 자바
평균은 넘겠지
package Array;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Q4344 {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cnt = Integer.parseInt(br.readLine());
for (int i=0; i < cnt; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int studentCnt = Integer.parseInt(st.nextToken());
int[] lineScore = new int[studentCnt];
double lineSum = 0.0;
double lineAvg = 0.0;
for(int j=0; j < studentCnt; j++){
int studentScore = Integer.parseInt(st.nextToken());
lineSum += studentScore;
lineScore[j] = studentScore;
}
lineAvg = lineSum / studentCnt;
double rateCnt = 0;
for(int s : lineScore){
if(lineAvg < s) rateCnt++;
}
System.out.println(String.format("%.3f",rateCnt/studentCnt*100)+"%");
}
}
}
이 문제에서는 반올림에 대해서 간단하게 설명하고 지나가자 !
자바에서는 반올림하는 방법으로 String으로 처리하는 방법 , Map 함수를 사용하는 방법 크게 2가지로 구분할 수 있다.
(1) String으로 처리하는 방법
String 클래스에 format 메서드를 사용하는 방법이다.
format 메서드는 문자열 형식을 지정하는 함수로, 이 함수는 Math.round() 함수와 같이 반올림을 String으로 나타낼 수 있다.
"%.(숫자)f" 로 String을 출력하는데 이때 숫자칸에는 반올림할 번째(자리)를 지정한다.
밑에서 예제와 같이 String 포맷 함수이기 때문에 3번째 자리를 기준으로 , . 를 연속으로 포맷할 수도 있다.
double num = 1.252525;
double ans = 4567.891
System,out.print(String.format("%.2f", num));
System.out.print(String.format("%.3f", num));
System.out.print(String.format("%,.3f", ans));
>> 3.14
>> 3.142
>> 4,424.243
(2) Math.round() 를 사용하여 처리하는 방법
Math 클래스의 round() 함수는 소수점 첫번째 자리를 반올림하여 정수로 리턴한다.
이를 응용하여 소수점 자리를 다르게 출력하는 것도 가능하다.
에를 들면 11.5555 를 round()함수를 사용하면 12.0 이 출력되지만
먼저 100을 곱한 뒤 ( 1155.555 ) round 함수를 사용하면 1156.0 이 계산된다.
그 뒤 다시 100을 나눠주면 11.56이 출력된다.
이는 11.5555를 소수점 2쨰 자리까지 반올림한 결과가 된다.
이렇게 사용하면서 원하는 소수점 자리를 반올림 할 수 있다.
( + 올림 : Math.cell() , 버림 : Math.floor() )
double num = 3.3456515;
System.out.println(Math.round(num));
System.out.println(Math.round(num*100) /100.0);
System.out.println(Math.round(num*1000) /1000.0);
>> 3
>> 3.34
>> 3.346
2가지 방법의 큰 차이
Math.round는 반올림 한 소수점 아래가 0일 경우 삭제하지만,
String.format()인 경우에는 그대로 리턴한다.
( 5000 vs 5000.000 )
'Code > baekjoon [ 단계별 ]' 카테고리의 다른 글
백준 단계별 (0) | 2022.02.21 |
---|---|
백준 단계별 문제 <함수> (0) | 2022.02.20 |
백준 단계별 문제 <1차원 배열> (0) | 2022.02.16 |
백준 단계별 문제 <for문> (0) | 2022.02.14 |
백준 단계별 문제 <if문 > (0) | 2022.01.20 |