백준 1546번 자바
https://www.acmicpc.net/problem/1546
문제 내용을 바로 보고싶으면 아래 더보기를 누르면 된다.
알고리즘
첫째 줄에 점수 개수 N이 주어진다.
둘째 줄에 N개의 점수들이 공백을 기준으로 주어진다.
이 때 N개의 점수 각각에 점수 / M * 100 공식을 대입하여 고친다.
그렇게 나온 점수들을 합쳐서 평균을 낸다.
일단 점수를 val 이라고 생각해보자.
함수를 만드는데 val을 넣었을때 val / M * 100 공식으로 값이 반환된다고 만들자.
그렇다면 순서는 다음과 같다.
1. 함수를 만든다.
2. 점수 개수 N을 입력받는다.
3. N 길이의 int 배열을 만든다.
4. N개의 점수들을 입력받는다.
5. N번만큼 반복문을 돌린다.
5-1. 한 줄로 점수를 받았으므로 공백을 기준으로 나눈 뒤 값을 하나 꺼낸다.
5-2. 꺼낸 점수 val을 만들어놓은 함수에 넣고, 반환값은 int 배열에 넣는다.
6. N번만큼 반복문을 돌린다.
6-1. 배열들의 값들을 꺼내서 int sum에 더한다.
7. sum을 N개로 나눠서 평균값을 구해 출력한다.
풀이1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class No_1546 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 갯수 입력받기
int N = Integer.parseInt(br.readLine());
// 갯수만큼 배열만들기
float[] arr = new float[N];
// 점수를 공백을 기준으로 나눠서 받아야하므로 StringTokenizer 만들기
StringTokenizer st = new StringTokenizer(br.readLine());
// 갯수만큼 돌려서 배열에 값넣기
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
// 배열의 값들을 정렬하여 최댓값이 맨 마지막으로 오게하기
Arrays.sort(arr);
// 점수를 전부 합칠 변수 만들기
float sum = 0;
for (int i = 0; i < N; i++) {
sum += grade(arr[i], arr[(N - 1)]);
}
System.out.println(sum / N);
}
// 값 구하는 함수 만들기
public static float grade(float v, float max) {
return v / max * 100;
}
}
알고리즘대로 풀어서 썼는데 다시 생각해보니 굳이 함수를 만들 필요없이 바로 계산해도 괜찮을거 같다.
그래서 풀이1번에서 함수를 없애고 바로 돌려보았는데 메모리와 시간 성능이 똑같았다.
그리고 3개의 점수가 들어갔다고 생각하고 만들어보았는데 다음과 같은 생각이 들었다.
그래서 이 방법을 토대로 풀이2를 만들어보았다.
풀이2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class No_1546 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 갯수 입력받기
int N = Integer.parseInt(br.readLine());
// 점수를 공백을 기준으로 나눠서 받아야하므로 StringTokenizer 만들기
StringTokenizer st = new StringTokenizer(br.readLine());
// 최댓값을 구할 변수 만들기
int max = 0;
// 점수를 합칠 변수 만들기
double sum = 0;
for (int i = 0; i < N; i++) {
int value = Integer.parseInt(st.nextToken());
if (max < value) max = value;
sum += value;
}
System.out.println(((sum / max) * 100)/N);
}
}
풀이1 보다는 훨씬 깔끔해진 것 같다.
하지만 성능은 비슷하다.
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 4344번 - Java(자바) (0) | 2022.01.30 |
---|---|
[백준] 8958번 - Java(자바) (0) | 2022.01.28 |
[백준] 3052번 - Java(자바) (0) | 2022.01.25 |
[백준] 2577번 - Java(자바) (0) | 2022.01.23 |
[백준] 2562번 - Java(자바) (0) | 2022.01.18 |