[Step-4] 백준 1546번 평균

작성일     업데이트:

카테고리:

태그:

나의 첫번째 풀이

처음에는 배열과 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()를 이용하여 배열을 정렬시킨 후 바로 최대값을 가져왔다.
이렇게 하면 기본적으로 오름차순으로 정렬이 되고 최댓값은 배열의 마지막 원소가 된다.

댓글남기기