오늘도 함수를 풀고 그로 인해 배운 코드들을 기록하기 위해 글을 쓴다.
첫번째 문제는 배열의 평균값이었는데, 문제를 풀려고 해도 아는 코드가 거의 없으니 먼저 인터넷에 검색보았다. 그러다가 가장 먼저 해당 문제의 해답이 드러나 있는 블로그에 들어가 버려서, 이 문제에 대해서는 다른 방법으로도 풀어져 있는 해답을 탐구하고 배운 코드를 정리한다.
먼저 이전에 배운 for문으로 만들어진 해답이다.
function solution(numbers) {
var answer = 0;
let sum = 0;
for(let i=0; i<numbers.length; i++){
sum+=numbers[i]
}
return answer =sum/numbers.length;
}
내가 착각했던 것이 return에는 return =과 같은 문법을 사용하면 안 되는 줄 알았는데, 이 코드가 멀쩡하게 구동되는 것을 보고 아니라는 것을 깨달았다. 앞으로도 많은 문법 공부가 필요한 부분이다.
그리고 var answer=0과 let sum=0부분은 answer과 sum이라는 두 변수의 값을 초기화하고 선언하는 기능을 하여 필요했다.
그리고 새로 배운 코드 numbers.length은
numbers는 배열의 이름, length는 배열의 길이를 나타내어
. 앞에 오는 배열 이름에 대치하는 배열을 불러와 그 배열의 길이를 나타내는 코드이다.
이후 의아했던 것은 왜 조건문에 i<=이 아니라 i<이 들어갔냐는 것이었다. 하지만 다시 생각해보니 컴퓨터 언어는 숫자를 1이 아니라 0부터 세니
만약 배열의 길이가 3일 경우 for문에서 i<=numbers.length을 하면 0, 1, 2, 3까지 세게 되어 값이 존재하지 않는 원소가 끼어들게 되는 것 같다.
때문에 i<numbers.length를 입력하여 0,1,2까지 세게 해야 되는 것 같다.
그리고 +=을 사용해서 sum=0+[numbers 배열 내 숫자들]을 다 더하고 만들어진 합산 for문에 최종적으로 배열의 길이를 나누는 return을 정의하면 배열의 평균값을 구하는 함수가 완성되었다.
또 배열을 선언하는 2가지 방법에 대해서도 알게 되었다.
배열이름 = []를 통해서 선언하는 방법과
array()를 통해 선언하는 방법이다.
대괄호 안에 입력하기만 하면 되니 전자가 더 간결한 방법이지만
후자는 array.메소드를 통해 다른 곳에서 배열 속 원소를 불러오거나 array(10)과 같은 방법으로 배열의 길이를 정의할 수 있어서 다른 쓰임으로 잘 사용할 수 있을 것 같다. 내가 알게된 array 사용법은 array({length=10}, (_,i) => i+1)을 통해서 배열의 값을 1,2,3...10으로 정의하는 것이었다.
또 모르는 것이 나와서 _에 대해서 찾아보았지만 '식별자'라는 개념이 나왔는데 아마 이 코드와는 상관없고, 그냥 '임의의 존재하지 않는 값' 같은 개념인 것 같다.
추가로 =>는 함수를 간결하게 사용하는 문법이다.
다음은 같은 문제를 reduce 메소드를 사용해 풀이한 해답이다.
function solution(arr) {
return arr.reduce((sum, current) => sum + current) / arr.length;
}
reduce 메소드는 배열을 기반으로 하나의 값을 반환할 때 사용하는 함수로, for문을 이용해 하나의 값을 출력하는 위의 풀이의 for문과 비슷한 역할을 한다. 즉 하나의 값을 반환하는 반복문이다.
이 풀이에서는 arr자리에 numbers를 넣어서 대입하면 되는데,
numbers.reduce()를 통해 numbers 배열을 불러오고 뒤 괄호() 안에서 명시한 구조를 따라 numbers배열을 반복하고 최종적으로 하나의 값을 반환하게 된다.
해당 괄호 안((sum, current) => sum + current)에는 sum과 current라는 두 원소?코드?가 들어가 있는데,
sum은 그저 값이 없는 임의의 원소?로 앞에서 내가 궁금해한 '_'와 같은 개념으로 보면 될 것 같다.
중요한 건 current로 current란 현재의 값이라는 개념으로 reduce가 배열 내의 값을 차례로 반복할 때 해당 배열 내의 값이다.
수정) sum과 current 둘 다 그저 reduce 메소드 내에서의 값에 편의에 따라 임의의 이름을 붙여놓은 것이다. 이 두 이름은 위치에 따라 값이 결정 되며 sum은 누적값, current는 현재값을 의미한다.
즉 numbers=[1, 2, 3]일 때
numbers.reduce( (sum, current) => sum + current) 내의 값 current는 이 메소드가 순환할 때의 값 1이나 2, 혹은 3인 것이다.
즉 numbers.reduce( (sum, current) => sum + current )는 numbers.reduce( (0, [1,2,3]) => 0 + [1,2,3] )이며
reduce 메소드가 적용되면 0+1+0+2+0+3=6이 반환된다.
이 경우 numbers.length는 3이므로 6/3=2가 결과값이 된다.
수정)
즉 numbers=[1, 2, 3]일 때
numbers.reduce( (sum, current) => sum + current) 내의 값 (sum, current)는 첫번째 반복에서는 (1,2), 두번째 반복에서는 (3,3)의 값을 가지게 된다.
reduce 메소드의 반복이 끝나면 (1+2)+3=6이 반환된다.
이 경우 numbers.length는 3이므로 6/3=2가 결과값이 된다.
'배운 코드 정리' 카테고리의 다른 글
indexOf, sort (0) | 2024.07.09 |
---|---|
돌아온 정수 제곱근 판별 (0) | 2024.07.02 |
자연수 뒤집기 (0) | 2024.07.01 |
각도기 함수와 짝수 더하기 (0) | 2024.06.20 |
왕초보 1주차 (0) | 2024.06.18 |