티스토리 뷰

반응형

백준 문제 보기

 

1546번: 평균

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

www.acmicpc.net

 

 

백준 문제 1546번

 

문제의 난이도가 딱히 어렵진 않았으나

이상한 실수 하나로

거의 모든 문장을 로그 찍어 확인하며

삽질하다 풀어서 조금은 짜증나는 문제였다ㅋㅋ

(이상한 삽질은 아래에서 공개..)

 

 

우선 바로 코드로 들어가보자.

 

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

public class Q1546 {
    public static void main(String[] args) throws IOException {
        // 점수 중 최댓값(M)선택
        // 모든 점수를 점수(score)/M*100으로 고침.
        // 위 방법으로 계산 후 새로운 평균 출력
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        double[] arr = new double[N];
        double M=0;
        double sum=0;
        double score = 0;
        for (int i = 0; i < N; i++) {
            score = Integer.parseInt(st.nextToken());
            if(score>M) {
                M=score;
            }
            arr[i]=score;
        }
        for(int i=0; i<N; i++) {

            double newNum = arr[i]/M*100;
            arr[i]=(newNum);
            sum += (double)(arr[i]);
        }
        System.out.println(sum/N);
    }
}

 

원래 코드 공유를 할 때, 

주석은 지우고 올리는 반면,

이번 문제는 내가 문제를 읽으며

생각하는 방식과 함께 설명하기 위해

주석도 첨부했다.

 

우선 나는 이 문제를 읽으면서 

바로 주석의 내용으로 문제를 정리했다.

 

문제 풀이 중 작성한 주석 내용

 

 

⭐ 내가 문제를 푸는 방식

먼저

우선 지정된 변수가 많아 

처음에 변수명을 이해하기 쉽도록 정리했다.

 

두 번째로 

문제에서 점수를 어떻게 수정하는 지

식으로 무조건 활용할 것 같아서

주석에서 바로 식으로 정리해두었다.

 

(문제를 이해하면서 바로 식으로 작성해두는 것은

시간 단축은 물론이고, 문제 이해 및

코드를 작성할 때도 방향을 잡을 수 있어서

추천하는 방법이다!)

 

세 번째

입력 데이터와 출력 데이터를

주석으로  정리해두고

문제의 흐름을 잡는다.

 

지금처럼 단순한 문제의 경우 

변수명이나 입 출력 값들이 

그렇게 많지 않지만,

나중에 어려운 문제를 풀다 보면

헷갈리는 경우가 분명히 발생할 것 같아

습관을 들이는 중이다.

 

 

자 이제 주석을 통해

문제에 대한 이해도를 높였으니

코드 해석을 해보자.

 

먼저 입력받은 N번만큼

for문을 돌면서 arr에 값을 하나씩 넣고,

최고 점수 값(M)을 찾자.

 

그다음 

두 번째 for 문을 돌면서

newNum 변수에 위에 주석으로 작성한

수식을 대입하자!

 

그러면 arr[]에는 수정한 점수 값이 들어갈 것이고,

sum 변수에는 수정한 점수값의 합이 들어갈 것이다.

 

최종적으로 출력해야 할 결과값은

수정한 점수들의 평균이므로,

sum/N을 출력해준다.

 

 

🤔 궁금하지 않을 수도 있지만 필자가 해맸던 부분은

분명 문제에 주어진 수식에서도 

새로 수정하는 점수의 식은 

score/M*100라고 말해줬는데,

자꾸 출력값에 오차가 생겼다.

 

처음에는 출력값만 double형으로

바꾸어 주면 되는 줄 알고

코드를 수정했는데,

여전히 평균(출력값)에 오차가 있길래

전체 문장을 로그로 찍어 확인해보니

멍청한 실수를 했다.

바로 score/M 부분이 둘 다 정수이다보니

무조건 0으로 찍힌것!

 

그래서 모든 변수를 double로 수정해 해결했다.

독자들은 필자처럼 멍청한 실수를 하지 않기를 바란다!

 

 

자 그럼 이제

실행결과를 보자.


실행결과

 

실행결과

 

 


이번 문제도 딱히 어렵진 않은 문제였다.

(필자의 멍청이 실수만 제외하면,,)

 

문제를 보다 이해가 안되거나 설명이 이상한 부분이 있으면 댓글을 활용해주길 바란다.

반응형