본문 바로가기
algorithm/Baekjoon

[1546] 평균

by 이쟝 2023. 11. 23.

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

 

1546번: 평균

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보

www.acmicpc.net

 

오랜만에 StringTokenizer로 풀려니 약간 헤맸다. 

  1. 점수를 배열에 저장한다음에
  2. 배열을 탐색하면서 최고 점수와 점수의 총합 구하고
  3. 총합*100/최고점수/과목의수를 계산하기

 

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main1546 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] score = new int[N];
        for(int i=0;i<N;i++) {
            score[i] = Integer.parseInt(st.nextToken());
        }
        System.out.println(solution(N, score));
    }

    public static Double solution(int N, int[] score) {
        Double answer = 0.0;
        long max = 0; // 최댓값
        long sum = 0; // 점수 평균
        for(int i=0;i<score.length;i++) {
            if (max < score[i]) max = score[i];
            sum += score[i];
        }
//        answer = (double) sum;
//        return answer*100/max/N;
        return sum*100.0/max/N;
    }
}

 

  • 옛날에 풀었던 문제를 보니 오름차순 정렬을 해서 최고점수를 구해서 풀었었다..!
  • 총합*100/최고점수/과목의 수가 나온 이유는 (각 과목/최고점수*100)을 과목의 수 만큼 나누기 한 것과 같기 때문!(수학적지식..필요..)
  • 주석처리된 부분 sum을 double형으로 바꿔주지 않아도, sum에 *100.0을 곱해주면 알아서 double형으로 변환..된다.(신기..)

새로운 풀이(updated by 23-11-23)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main1546 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int sum = 0;
        int max = 0;

        while (st.hasMoreTokens()) {
            String token = st.nextToken();
            int subjectValue = Integer.parseInt(token);
            max = Math.max(max, subjectValue);
            sum += subjectValue;
        }
        System.out.println(sum*100.0/max/N);
    }
}

 

  • for문 두 번 돌 필요 없이 그냥 st.hasMoreTokens( )로 while문 돌려서 안에서 int형으로 변환한 뒤에 값 구하기
  • 처음에는 split으로 짤랐는데, 확실히 StringTokenizer 쓰니까 더 빨리 된다..

'algorithm > Baekjoon' 카테고리의 다른 글

Do it 알고리즘 코딩테스트  (0) 2023.04.30
[11720] 숫자의 합  (0) 2023.04.30
[백준] 2750 수 정렬하기(Arrays.sort, 선택, 삽입, 퀵)  (0) 2022.10.13
[백준] 2908 상수  (0) 2022.10.11
[백준] 1157 단어 공부  (0) 2022.10.05