알고리즘 및 자료구조/백준(BackJoon)

백준 - 1546번

지팡구 2022. 8. 7. 22:51

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

 

1546번: 평균

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

www.acmicpc.net

 

설명 : 

첫 줄에는 과목의 수 N를 입력받고, 두 번째줄에는 현재의 성적을 입력받는데, 입력된 성적은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다. 

 

자신이 입력한 점수 중 최댓값을 M, 모든 점수를  점수/M*100으로 고쳐서 계산 후 평균을 구하는 문제

 

이 문제의 핵심

이 문제를 풀면서 형 변환에 대해 생각을 안 했었는데, 결과값이 내가 의도한 방법과 다르게 나오자 형변환을 떠올렸고, 그 결과 정답은 형변환에 있었다.

 

이 문제를 접근하기에 있어 형변환에 대해 알아야 한다. 내가 이 전에도 계속해서 형 변환 메소드를 사용하긴 했다...

 

형변환은 말 그대로 변수나 리터럴의 타입을 다른 타입으로 변환하는 것이다.

이 문제에서 핵심은 바로 이 형변환이라 생각한다. 

 

예시 코드

double d = 3.14;
int score = (int)d;

System.out.println(d);
System.out.println(score);

 

예시 코드를 확인해보면 double형 d를 3.14로 값을 주었고, score을 int 형 d로 주었는데, 이를 출력해 결과를 확인해보면 이 문제의 핵심을 알 수 있을 것이다.

 

정수, 실수등 형변환을 하지않고 계산을 하게된다면 분명히 값 손실이 있을 것이다.  나는 이 부분을 캐치해내지 못했다. 

 

문제 해결은 간단하다. 배열을 선언받아 입력된 값을 저장하고, 최대값을 찾은 후 평균을 구하면 된다.

 

내가 작성한 코드는 다음과 같다.

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(), " ");
        double max = -100;
        
        for(int i=0; i<arr.length; i++){
            arr[i]=Integer.parseInt(st.nextToken());
            if(arr[i]>max){
                max = arr[i];
            }
        }
        double sum=0;
        for(int a=0; a<arr.length; a++){
            sum = sum+((arr[a]/max)*100);
        }
        System.out.println(sum/ arr.length);
    }
}

double형 배열을 선언하고, 입력한 값의 크기로 배열의 크기를 지정해주었다.

" " 를 통해 토큰을 구분하고, 과거 사용했던 max의 방법을 이용해 double형 max 변수를 선언했다.

 

그렇게 한 후 배열 속에 요소를 넣고, max를 이용해 최대값을 찾고, 문제에서 요구한 것처럼 점수를 변환하는 과정, 마지막으로 평균을 구하는 과정까지 도달해 원하는 결과값을 얻을 수 있었다.

 

 

윗 방법 외에도 sort를 이용해 문제를 해결할 수 있었다.

 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]=Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        double sum=0;
        for(int a=0; a<arr.length; a++){
            sum +=((arr[a]/arr[arr.length-1])*100);
        }
        System.out.println(sum/arr.length);

sort는 말 그대로 정렬이라는 뜻인데, sort 메소드를 이용해서 더욱 간결하게 코드를 작성할 수 있었고, 조건문을 이용하는 방법이 아닌 sort를 이용해 정렬하게 되면 배열의 맨 마지막 요소가 결국 최댓값일테니 그 요소의 위치를 이용하는 방법이 되겠다.

 

결과를 보면 sort를 사용해 문제를 해결한 것이 속도가 4초가 더 빨랐다.

 

'알고리즘 및 자료구조 > 백준(BackJoon)' 카테고리의 다른 글

백준 - 8958 번  (0) 2022.08.09
백준 - 3052번  (0) 2022.08.08
백준 - 2577번  (0) 2022.08.05
백준 -2562번  (0) 2022.08.05
백준 - 10818번  (0) 2022.08.05