나의 첫번째 풀이
처음에는 배열과 for문을 사용하는 방식으로 접근했었다.
-> 첫번째 for문
- 점수들을 비교해 그중 max(가장큰) 점수 값을 구한다
- 점수 저장용 배열에 본래 점수값을 하나하나 넣어서 저장시킨다
-> 두번째 for문
- 점수들을 저장해두었던 배열에서 하나하나 점수를 꺼내 (점수/max)*100을 한다
- 위에서 도출된 값을 또다른 double 변수에 더해서 총 합을 저장시킨다
-> 마지막
- 모든 값이 더해진 double 변수에 점수들의 총 갯수를 나눠 평균값을 출력한다
이렇게 접근했었는데 너무 시간소모가 컸는지 런타임 오류가 발생해서 다른 방법을 찾아야만 했다.
나의 두번째 풀이
이번엔 문제 자체를 좀 더 주의깊게 생각해보았다.
(점수/max)*100라는 식에서 max 부분이 되는 최대점수 값만 따로 구해놓으면 그 외에는 원래의 점수값만 변화하고 딱히 큰 틀이 변하는 곳은 없다.
그렇다면 for문을 돌며 점수를 하나하나 계산해 배열에 저장시키지 말고, 전체 점수값을 먼저 더해버린 뒤 max값만 따로 구해서 그걸로 한번에 나눠버리면 안될까?
예를들어 점수 3, 11이 있다면
첫번째 : ( (3/11)*100 + (11/11)*100 )/2
두번째 : ( ((3+11) /11)*100 )/2
첫번째 방식과 두번째 방식 모두 같은 값을 도출한다는 것이다.
그래서 이번에는 두번째 방식으로 풀어보기 위해 아래처럼 로직을 짜보았다.
-> while문
- 점수들의 총 합을 구한다
- 점수들을 비교해 그중 max(가장큰) 점수 값을 구한다
-> 마지막
- (총합/max)*100 한 값에 총 점수 갯수를 나눠 출력한다
[코드보기]
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int max = 0;
double all = 0;
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
while(st.hasMoreTokens()) {
int score = Integer.parseInt(st.nextToken());
all += score;
if (score > max) {
max = score;
}
}
System.out.print((all/max*100)/n);
}
}
이번엔 런타임 오류가 발생하지 않고 제대로 넘어가졌다.
배열을 사용하지 않고 넘어가는 방식으로 풀이한 셈이다.
다른사람의 풀이
나와는 다르게 제대로 배열을 사용한 풀이가 있는지 찾아보다가 Arrays.sort()
를 사용한 풀이를 발견했다.
[코드보기]
import java.util.Arrays;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double arr[] = new double[Integer.parseInt(br.readLine())];
StringTokenizer st = new StringTokenizer(br.readLine()," ");
for(int i = 0; i < arr.length; i++) {
arr[i] = Double.parseDouble(st.nextToken());
}
double sum = 0;
Arrays.sort(arr);
for(int i = 0; i < arr.length; i++) {
sum += ((arr[i] / arr[arr.length - 1]) * 100);
}
System.out.print(sum / arr.length);
}
}
여기서는 처음 내가 했던 것처럼 for문으로 일일이 비교해서 최대점수값을 구하지 않고 sort()
를 이용하여 배열을 정렬시킨 후 바로 최대값을 가져왔다.
이렇게 하면 기본적으로 오름차순으로 정렬이 되고 최댓값은 배열의 마지막 원소가 된다.
댓글남기기