코드 그라데이션
[Lv.1] 평균 구하기 본문
평균 구하기
문제 설명
정수를 담고 있는 배열 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