[BOJ] 백준 1546 평균

ho's·2022년 3월 23일
0

https://www.acmicpc.net/problem/1546

위 문제를 풀기 위해서 3가지를 중점으로 보았다.
1. 최대값을 구하기
2. 최대값보다 작은 점수들을 위의 문제와 같이 계산된 식으로 바꾸어 저장하기
3. 수정된 배열의 평균값을 구하기

위와 같이 3단계로 크게 나누었는데, 내가 할 수 있는건 1단계 최대값 구하는 코드까지 였다.

package baekjoon.solution;
import java.util.Scanner;

public class Baekjoon_1546 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int cnt = scan.nextInt();
        int score[] = new int[cnt];
        double changing[] = new double[cnt];
        double avg;
        int max = score[0];

        for(int i=0;i<score.length;i++){
            score[i] = scan.nextInt();
            // 입력한 cnt만큼 점수 입력하는 코드
            if(max < score[i]){
                max = score[i];
            }
            // 배열의 최대값 구하는 코드
        }

       for(int i=0;i<score.length;i++)
           System.out.println(score[i]);
        // max값과 score[i]가 잘 저장되었는지 확인하는 코드.

        for(int i=0;i<score.length;i++){
            if(score[i] < max) {
                changing[i] = (score[i]/max) * 100);
            }

            System.out.println(changing[i]);
        }
    }
}

위와 같은 코드를 작성하고 돌려보면 max값과 입력된 배열은 입력이 잘 되지만, 변경된 값들이 저장이 되지 않는다!

여러 블로그를 찾아본 결과, 타입캐스팅에 관련된 문제였다.

타입캐스팅에 관련된 개념은 다음에 개념정리포스팅을 해야겠다!

public class Baekjoon_1546 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int cnt = scan.nextInt();
        int score[] = new int[cnt];
        double scoreChanging[] = new double[cnt];
        double sum = 0;
        int max = score[0];

        for (int i = 0; i < score.length; i++) {
            score[i] = scan.nextInt();
            // 입력한 cnt만큼 점수 입력하는 코드
            if (max < score[i]) {
                max = score[i];
            }
            // 배열의 최대값 구하는 코드
        }

        for (int i = 0; i < score.length; i++) {
            scoreChanging[i] = (double) score[i] / (double) max * 100;

            sum = sum + scoreChanging[i];
        }


        double avg = sum / cnt;
        System.out.println(avg);
    }
}

위와 같이 해결은 되었으나, 메모리문제, 시간문제에 관련된 부분에 대해서는 고려하지 못 한것같다. 다른 분들의 코드를 보면 훨씬 간결하고 깔끔한 코드였다.

https://rightbellboy.tistory.com/34
위의 블로거분이 쓰신 코드인데, 직관적이고 깔끔하다.

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int total = 0;
		int max = 0;
		int score;
		for (int i = 0; i < n; ++i) {
			score = sc.nextInt();
			total += score;
			if (score > max) {
				max = score;
			}
		}
		sc.close();
		
		double avg = 0;
		avg = 100.0 * total / max / n;
		System.out.printf("%.2f", avg);
	}
}

위 문제를 푸는데 시간이 많이 소요되었지만, 풀었다는 것에 의미를 둔다!

profile
그래야만 한다

0개의 댓글