새소식

자바 스크립트

알고리즘 문제를 풀며 배운 것 1(0819~0820)

  • -
728x90

문자열은 immutable

1. 문자열은 불변하다

문자열의 위치를 인덱싱 하여 문자열을 바꿔주고 싶었는데 실패했다. 왜냐하면 문자열은 불변(immutable) 했기 때문이다. 왜그런지 살펴봤다. 만일 기존의 문자열을 직접 변경할 수 있다면 발생하는 문제점들이 있을것이다.

2. forEach 사용법을 익혔다.

함수 안에 배열 메소드중 하나인 forEach를 사용하여 문제를 풀었다. forEach는 배열의 각 요소에 대해 주어진 함수를 실행하는 메소드다. 괄호 안에 화살표 함수를 넣어서 위와 같이도 활용할 수 있었다. 현재 값, 인덱스, 배열(현재 호출된 배열) 세가지 인수를 받을 수 있다.

 

입력 예시 코드 (신기하게 콜백함수를 매개변수로 받는다. 나는 이를 화살표 함수로 했다)

const numbers = [1, 2, 3, 4, 5];

numbers.forEach(function(number, index, array) {
  console.log(`Value: ${number}, Index: ${index}, Array: ${array}`);
});

 

출력 예시 코드

Value: 1, Index: 0, Array: 1,2,3,4,5
Value: 2, Index: 1, Array: 1,2,3,4,5
...

 

참고 사항

- forEach는 배열을 변경하지 않으며, 반환값도 없다.

- 배열의 요소를 내부에서 변경할 수 있다.

- 반복을 멈출 수 없다.

 

 

3. 자연수 n의 자릿수를 더하는 문제로 수많은 메소드를 익히다.

function sumDigits(n){
 //자연수 n을 문자열로 만든다.
  let strN = String(n);
  
  //문자열을 분리해서 배열로 만든다.
  let arrN = strN.split('');
  
  //배열의 각 요소를 숫자로 변환
  let numArr = arrN.map(Number);
  
  //배열의 숫자를 모두 더한다
  var sum = numArr.reduce((sum, digit) => sum + digit, 0)
  
  return sum;

메소드를 공부할 방법이 없었고 자릿수를 더하는 문제가 낭로때마다, 해당 값을 문자로 바꿔 인덱싱 하여 더하는 방법을 사용했었다. 이번에는 메소드를 사용해보고 싶어 다른 방법을 알아보았다. 

 

문자열을 배열로 분리하는 방법인 split('')을 사용해볼 수 있었고,

map이 실제로 어디서 쓰이나 궁금했는데, 배열의 각 원소들을 숫자로 바꿀 때 사용할 수 있다는 점을 알 수 있었다. 

또한 reduce의 쓰임에 대해서 다시 한번 정확히 알 수 있었다.

 

reduce 메소드

- reduce 메소드는 배열의 각 요소에 대해 함수를 실행하여 단일 결과 값(누적 값)을 생성한다. 주로 배열의 값을 합하거나 하나의 객체로 합칠때 사용한다. 근데 여기서 이상한 점이 있다. 배열의 각 요소에 대해 함수를 실행한다는 내용이 forEach와 굉장히 유사하다. 무슨 차이점이 있을까?

 

forEach : 반환값이 없는 메소드

- 목적 : 배열의 각 요소에 대해 특정 작업을 수행하기 위해 사용.

- 중요성 : 배열의 요소를 순회하며 작업을 수행할 뿐, 그 결과를 추적하지 않는다.

 

reduce 메소드: 반환값이 있는 메소드

- 목적 : 배열의 요소를 하나의 값으로 누적하여 결합하기 위해 사용된다.

- 중요성 : reduce 는 배열의 요소를 결합하여 최종 결과를 도출해야 하므로, 누적 값이 반환되어야 한다. 이 반환값은 다른 곳에서도 활용할 수 있다는 차이점이 있다. 

 

 

이를 잘 이해하기 위해서 reduce의 기능과 매개변수를 자세히 보자

매개변수는 첫번째 매개변수로 forEach과 같이 콜백함수를 매개변수로 받는다. 두번째 매개변수는 초깃값을 받는다. 아래 예시 코드를 보자.

 

const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((total, currentValue) => acc + cur, 0);
console.log(sum); // 결과: 10

위를 보면 첫번째 매개변수로 화살표 함수로 현재값과 누적값을 구하는 화살표 함수가 작성되어 있다. 초깃값으로는 0을 받는다. 화살표 함수가 불친절 해서 나는 이해하는데에 꽤 걸렸다.

이를 풀어서 보자면, 아래와 같다.

const numbers = [1, 2, 3, 4];
const sum = numbers.reduce(function(total, currentValue) {
    return total + currentValue;
}, 0);
console.log(sum); // 결과: 10

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.