안녕하세요
백준 알고리즘 단계별로 풀어보기 5단계 평균을 풀어봤습니다
문제 자체는 어렵지 않았는데 문제를 이해하는게 좀 어려웠어요 ㅠ
한국어의 어려움이란 ㅎㄷㄷㄷㄷ
제가 풀었던 3가지 방식에 대해서 설명해보겠습니다!
문제
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
출력
첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
문제 풀이
제가 첫 번째로 정답을 맞춘 방식입니다
제일 무난한 방식으로 풀었다고 생각합니다 ㅎ
Arrays.sort를 사용해 최대값을 구해 총점을 계산하는 방식입니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;;
public class Main {
public static void main(String[] args) throws IOException {
// BufferdReader 선언 및 점수를 몇 번 입력할지 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 점수를 넣을 배열 및 StringTokenizer 선언
float[] array = new float[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// for문을 사용해서 배열에 점수 데이터를 입력
for(int i = 0; i < N; i++)
{
array[i] = Integer.parseInt(st.nextToken());
}
// Arrays.sort를 사용해서 정렬 -> 마지막 값이 최대값이 된다
Arrays.sort(array);
// 총점 변수 및 반복문을 사용해 점수 / 최대값 * 100을 해서 새로운 총점을 구한다
float sum = 0;
for(int i = 0; i < N; i++)
{
sum = (array[i] / array[N-1] * 100) + sum;
}
// 총점 / N = 결과 출력
System.out.print(sum / N);
}
}
두 번째 방식입니다
최대값을 구할 때 Arrays.sort를 사용하지 않고 반복문을 사용하여 Max값을 구해서 새로운 총점을 구한 방식입니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;;
public class Main {
public static void main(String[] args) throws IOException {
// BufferdReader 선언 및 점수를 몇 번 입력할지 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 점수를 넣을 배열 및 StringTokenizer 선언
float[] array = new float[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// for문을 사용해서 배열에 점수 데이터를 입력
for(int i = 0; i < N; i++)
{
array[i] = Integer.parseInt(st.nextToken());
}
// 최대값 변수 초기화 및 반복문을 사용해서 배열의 최대값을 구한다.
float Max = array[0];
for(int i = 1; i < N; i++)
{
if(Max < array[i])
Max = array[i];
}
// 총점 변수 선언 및 반복문을 사용해 점수 / 최대값 * 100을 해서 새로운 총점을 구한다
float sum = 0.0f;
for(int i = 0; i < N; i++)
{
sum = (array[i] / Max * 100) + sum;
}
// 총점 / N = 결과 출력
System.out.print(sum / N);
}
}
세 번째 방식입니다
아예 배열을 사용하지 않고 구했습니다
이건 제가 풀은 방식이 아니라 다른 사람이 풀은 것을 참고하여 작성했습니다;;
다른 사람이 푼 것을 보니 정말 깔끔하게 풀었더군요...
배열을 사용하지 않고 푸는 방식은 생각 못 했는데 하나 배웠습니다
그나마 다행인것은 속도는 제가 푼게 더 빠르게 나왔네요 하하핳
출처 : www.acmicpc.net/source/25677966
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;;
public class Main3 {
public static void main(String[] args) throws IOException {
// BufferdReader 선언 및 점수를 몇 번 입력할지 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
// 최대값 및 총점 변수 선언, StringTokenizer 선언
int max = -1;
float total = 0.0f;
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// while문을 사용해 Max값과 총점을 구한다
while(st.hasMoreTokens()){
int value = Integer.parseInt(st.nextToken());
if(value >max) {
max = value;
}
total += value;
}
// 총점 / 최대값 * 100 / N을 하여 새로운 총점을 구한다
System.out.println( ((total/max)*100.0)/num);
}
}
속도 비교
1번 : Arrays.sort로 최대값 구함 + 배열 사용
2번 : 반복문으로 최대값 구함 + 배열 사용
3번 : 배열 미사용
방식입니다
제일 시간이 짧은 것은 1번 방식이 제일 빠르게 나왔습니다
3번 방식이 제일 빠를 줄 알았는데 제 예상과 달라서 좀 놀랐;;
제일 메모리가 적게 들은 방식은 2번 방식이네요
이건 예상한대로 나왔네요 ㅎㅎ
여기까지 백준알고리즘 1546번 문제를 풀은 내용이었습니다
이 글이 알고리즘 공부를 하는 분들께 도움이 되었으면 좋겠습니다!!
다음 문제 : 2021.05.06 - [알고리즘/알고리즘JAVA] - [백준알고리즘/1차원 배열] 8958번 문제 : OX퀴즈(자바/JAVA)
이전 문제 : 2021.05.04 - [알고리즘/알고리즘JAVA] - [백준알고리즘/1차원 배열] 3052번 문제 : 나머지(자바/JAVA)
'알고리즘 > 알고리즘JAVA' 카테고리의 다른 글
[백준알고리즘/1차원 배열] 4344번 문제 : 평균은 넘겠지(자바/JAVA) (0) | 2021.05.07 |
---|---|
[백준알고리즘/1차원 배열] 8958번 문제 : OX퀴즈(자바/JAVA) (0) | 2021.05.06 |
[백준알고리즘/1차원 배열] 3052번 문제 : 나머지(자바/JAVA) (0) | 2021.05.04 |
[백준알고리즘/1차원 배열] 2477번 문제 : 숫자의 개수(자바/JAVA) (0) | 2021.05.03 |
[백준알고리즘/1차원 배열] 10818번 문제 : 최소, 최대(자바/JAVA) (0) | 2021.04.30 |