코드 그라데이션

[Lv.1] 평균 구하기 본문

Java/알고리즘

[Lv.1] 평균 구하기

완벽한 장면 2023. 2. 2. 22:26

평균 구하기

문제 설명

정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

제한사항

  • arr은 길이 1 이상, 100 이하인 배열입니다.
  • arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

입출력 예

 

첫 번째 접근

- 배열의 모든 원소의 합을 구해야 할 것 같고, 그것을 배열의 길이로 나눠주면 될 것 같다.

 

풀이 순서(내가 작성한)

// 1. 배열의 모든 원소의 값을 더한다.
// 2. 이 합을 배열의 길이(전체 원소의 수)로 나눈다.
// 3. 평균값을 도출한다.

 

반복문에서는 반복되는 것을 다 더한다고 생각하면 됨.
그럼 무엇을 반복하는지를 틀만 생각해보면 되지

arr[0] + arr[1] + arr[2] ....

지금 arr[0] + ... / arr[1] +... 를 반복할 수 있는 방법은 없다.
우리는 
arr[0] + arr[1] + arr[2] .... 이것을 어떻게든
arr[0] + ; 
arr[1] + ; 
arr[2] + ; 이렇게 끊어야 한다.

그러면 이걸 가지고 틀을 잡아서 반복문에 넣을 수가 있게 된다는 것.

 

배열의 합은 물통으로 생각하자

컴퓨터는 기본적으로 두 가지 수 연산밖에 한번에 못한다. 그러니까 이 물을 다 더하고 싶으면, 
각각 계산해서 그 컵에 부어서 저장을 하는 방식을 사용하지.
모든 과정이 끝나면 이 컵에는 배열의 합이 담겨 있지.

즉, "배열의 합을 저장할 변수를 따로 선언하자!"

sum = arr[0];
sum = arr[1];
sum = arr[2]; ...

그런데 이때는 문제가...
sum = arr[0]; // 3
sum = arr[1]; // 4를 넣으면? 3이 날아가! 그냥 대입하는 것이니까.
sum = arr[2];

그럼 이런 문제를 어떻게 해결할까? 더하기 첨가!
sum += arr[0]; 
sum += arr[1];
sum += arr[2];

즉, sum = sum + arr[i]; 꼴로 만들어주는 것.

 

그래서 배열 원소의 모든 값을 더한다 부분을 구현해보면,

class Solution {
    public double solution(int[] arr) {
        double answer = 0;
        int sum = 0;
        
        for(int i = 0; i < arr.length; i++) {
            sum = sum + arr[i]; // 1단계 완료
            // sum += sum(arr[i]); 아니다! 이건 sum의 함수를 호출한 형태지.
	}
} 

여기까지 된 셈이지.

 

이 합을 배열의 길이(전체 원소의 수)로 나눈다.

이 합을 배열의 길이(전체 원소의 수)로 나눈다.

일단 출발은
sum / arr.length
class Solution {
    public double solution(int[] arr) {
        double answer = 0;
        int sum = 0;
        
        for(int i = 0; i < arr.length; i++) {
            sum = sum + arr[i]; // 1단계 완료
            // sum += sum(arr[i]); 아니다! 이건 sum의 함수를 호출한 형태지.
		}
		// answer을 위에서 선언은 해뒀으니까 따로 생성해주진 않아도 되고
        // 그런데, 자바는 정수/정수 = 정수 이다.
        // 평균은 소수점까지 구해야 하므로, 형변환이 필요해!
        answer = (double)sum/ arr.length;	// 형변환은 왼쪽에는 쓰면 안된당.

		return answer;
	}
}
그런데... 
answer = (double)(sum/ arr.length); 이렇게 하면 정답이 안 나온다?

왜일까...?
sum, arr.length는 이미 정수.
얘 둘을 나눗셈 연산을 하면 그 결과 자체가 이미 정수가 되어버린다.
이미 정수를 double로 바꾸면, 의미가 없다. 그래서 정답이 아니다.
즉 "이미 1인데 억지로 1.0으로 바꿀 수는 없다는 이야기"

따라서 연산 전에 double을 만들어놓고 연산을 해야 원하는 결과를 얻을 수 있다고 생각하면 된다.

 

최종 코드

class Solution {
    public double solution(int[] arr) {
        double answer = 0;
        int sum = 0;
        
        for(int i = 0; i < arr.length; i++) {
            sum = sum + arr[i]; // 1단계 완료       
        }
        answer = (double)sum/ arr.length; // 2단계 완료
             
        return answer; // 3단계 완료
    }
}

// 1. 배열의 모든 원소의 값을 더한다.
// 2. 이 합을 배열의 길이(전체 원소의 수)로 나눈다.
// 3. 평균값을 도출한다.
728x90

'Java > 알고리즘' 카테고리의 다른 글

[백준] 사분면 고르기  (0) 2023.03.18
[Lv.1] 문자열 내 p와 y의 개수  (1) 2023.02.03
[Lv.1] 행렬의 덧셈  (0) 2023.02.02
[lv.0] 배열의 평균값  (0) 2023.01.25
[lv.0] 나머지 구하기  (0) 2023.01.25
Comments