
문제를 꼼꼼히 읽어보고 사고의 흐름을 정리해보겠다.
1. 2차원 배열로 풀어야하나?
2. Scanner로 받아야하나 BufferedReader를 사용할까 고민이 됐다.
우선 Scanner로 받게 된다면 공백을 기준으로 데이터를 읽는 데 편리하여 코드가 직관적이고 이해하기 쉬우나 조금 느리다.
그래서 기왕 하는거 BufferedReader로 받고 split함수로 나눠야겠다! 싶었다. Tokenizer를 사용해서 nextToken을 했는데 잘 안 돼서 spilit을 쓰게 됐다..ㅎ
이때, 새롭게 알게된 점
이렇게 한 줄로 바꿀 수 있다!
String s = br.readLine();
String[] arr = s.split(" ");
String[] arr = br.readLine().split(" ");
그래서 접근 방식은
C를 먼저 입력을 받기 때문에 C를 입력 받고, C만큼의 반복을 해준다. 왜냐 문제에 그렇게 써있기 때문
그리고 for문 안에서 문자열을 받고, 공백을 기준으로 나누어 arr이라는 배열에 저장한다.
그리고 무조건 첫 번째 배열은 학생 수를 의미하기 때문에 빼야하지만 순회를 위해 다 저장시키고,
배열의 0번째 값이 들어있는 걸 빼준다. 이때 String타입의 배열이라 Integer.parseInt()로 형변환 시켜줬다.
그리고 그 배열 안에 있는 점수의 평균값을 구해주어야 하는데 전체 합을 학생수인 0번 배열로 나눠준다.
이때 float으로 형변환 하였는데 정밀한 소수 계산을 위해서는 double을 써야만 한다.
여기서부터 문제가 되어서 로직과 흐름은 정상이었으나 디버깅을 해보아도 문제가 무엇인지 알 수 없었다.
평균을 구했으니 이제 배열의 1번부터 마지막까지.
평균 이상인 개수를 구해서 전체 학생수로 나눠주어야된다. 그리고 그 값에 * 100
그리고 앞에 printf("%.3f", ~~)로 소수점 3자리까지 보여주게 만들었다.
조금 더 효율적인 방법이 있다면
System.out.printf("%.3f%%\n", ~~); 이렇게 하면 된다. %% 두 번 붙이게 되면 %가 나오게 된다.
package com.study;
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String arg[]) throws IOException{
Scanner sc = new Scanner(System.in);
int C = sc.nextInt();
for(int i = 0; i < C; i++) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// br.readLine()으로 한 줄 전체를 읽어와 's'에 저장합니다. "5 50 50 70 80 100"
String s = br.readLine();
// 문자열 's'를 공백을 기준으로 나누어 'arr' 배열에 저장합니다. ["5", "50", "50", "70", "80", "100"]
String[] arr = s.split(" ");
int sum = 0;
// 배열 'arr'의 모든 요소를 순회하며 합계를 구합니다.
// 이 루프는 학생 수를 나타내는 'arr[0]'까지 포함하여 모든 값을 더합니다.
for(int k = 0; k < arr.length; k++) {
sum += Integer.parseInt(arr[k]); // 문자열을 정수로 변환하여 'sum'에 더합니다.
}
// 'sum'에서 첫 번째 값(학생 수)을 뺀 값을 'result'에 저장합니다.
int result = sum - Integer.parseInt(arr[0]);
// 나머지 점수들의 합계('result')를 학생 수('arr[0]')로 나누어 평균을 구합니다.
// 여기서 float을 하니까 결과가 확달라짐 정교한 값을 위해서 double 사용
double average = (double)result / Integer.parseInt(arr[0]);
int flag = 0; // 평균을 넘는 학생 수를 세는 카운터 변수
// 배열의 인덱스 1부터 끝까지 순회합니다. (arr[0]은 제외)
for(int j = 1; j < arr.length; j++) {
if(average < Integer.parseInt(arr[j])) {
flag++;
}
}
System.out.printf("%.3f", (((float) flag / (arr.length - 1))) * 100);
System.out.println("%");
}
}
}'Algorithm > 백준' 카테고리의 다른 글
| [백준] 1929번 소수구하기 (0) | 2025.09.16 |
|---|---|
| [백준] 2609번 최대공약수와 최소공배수 (0) | 2025.09.14 |
| [백준] 11660번 구간 합 구하기 5 (0) | 2025.09.14 |