상세 컨텐츠

본문 제목

[JavaScript] 프로그래머스 하샤드 수 문제, Array.from() 함수 이용해서 풀어보기

JavaScript

by Jjiveloper 2021. 10. 14. 01:20

본문

728x90

오늘 갑자기 프로그래머스에 꽂혀서 이것 저것 풀어봤다. (풀어본 문제 5문제도 안되는 코테린이임...)

다른 사람의 풀이를 보고 배우는 것도 좋지만, 문제를 해결하기 전 검색 능력을 키우는 것이 목적이라 풀이를 검색하기 보단 내가 원하는 기능을 검색해서 찾아보고 적용하는 것에 의의를 두었댜.

그래서 풀이가 비효율적일 수도 있다는 점 양해부탁드려욥...

 

우선 동일한 Array.from()함수를 이용해 푼 모습을 보자.

 

버전 1이다.

function solution(number) {
    let number_arr = Array.from(number.toString(), Number); //각 자리 수의 배열 생성
    let final_sum = number_arr.reduce((sum, single_digit) => sum += single_digit);  //자리 수 끼리 덧셈
    
    return number%final_sum === 0;  // 나머지 수가 0인지 비교연산자 이용
}

1. solution함수의 입력받은 숫자를 문자로 변환 후, 해당 문자열을 잘라서 숫자 타입의 배열로 변환해준다.

2. 배열.reduce()함수를 이용해 각 자리수를 더해준다.

3. 입력받았던 숫자를 각 자리수를 더한 합계로 나누었을 때 나머지가 0이면 true를 아니라면 false를 반환한다.

 

결과


뭔가 reduce()함수를 또 써줘야하는 것이 마음에 안들어서 다시 짜봤다.

Array.from을 사용하는 것은 동일하나, 얘를 활용해보려고 한다. (아직 완벽히 이해는 못함 ㅠㅠ)

 

버전 2

function solution(number) {
    let sum = 0;
    Array.from(String(number), val => sum+=Number(val));
    
    return number % sum === 0;
}

1. 각 자리의 수를 합산하여 저장할 sum 변수 생성. 초기 값은 0이다.

2. Array.from()함수를 이용하여 number의 값을 문자열로 변환 후 1글자씩 잘라서 배열로 만든다.

3. 배열의 각 요소를 꺼내서 연산을 한다.

    3-1. val에는 배열의 요소 1개가 들어있다.

    3-2. sum에다가 val을 숫자로 치환해준 값을 더해준다.

4. 비교연산자 이용

    4-1. number를 sum으로 나누었을 때 나머지가 (number % sum) 0과 동일하다면, true가 반환된다.

    4-2. 0과 동일하지 않다면 false가 반환된다.


Array.from() 사용하기

우선 함수는 모질라 재단의 설명을 보고 참고했다. 역시 이런 공적인 문서는 나같은 초보가 이해하기에 살짝 어려움이 있으므로 나중에 다른 분 정리글 보고 공부해야겠다..

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from

 

우선 Array.from()은 유사 배열객체나 반복이 가능한 값이 들어있는 객체를 얕은 복사를 이용해 새로운 배열을 만드는 것이라고 한다. 설명 왤케 어려워....

 

1. 문자열 입력 시

우선 문자열을 넣으면 문자열을 한 글자씩 잘라서 배열로 반환해준다.

2. 숫자 입력 시

아쉽게도 그냥 숫자는 배열로 반환해주지 않는다...ㅠㅠ 그래서 내가 숫자를 문자로 변환해서 매개변수로 넣어준 것

3. 숫자를 문자로 형변환 시

그렇다고 문자열로 변환한 숫자가 자동으로 숫자배열로 변환되진 않는다.

 

그래서 추가한 것이 2번째 옵션!

 

* 숫자를 한 글자씩 잘라 배열로 만들기

모질라 페이지의 설명을 보면 두번째 매개변수로 만들어진 배열에 적용할 함수를 넣으면 된다고 하였다.

Number 형변환 방법 1.

궁금한 것은 Number만 넣었는데도 적용되는 이유... 그냥 모든 배열 요소에 대해 Number로 바꾸겠다는 의미인 것인가....

Number 형변환 방법 2.

두번째 매개변수를 함수 형식으로 바꾸어도 결과는 동일하다!! 요부분은 차차 알게되겠지...

이렇게 두번째 매개변수에 함수를 넣어보았다. "123"을 배열로 쪼갠 ["1", "2", "3"]의 각 요소를 val이라는 변수를 이용해 반복문을 돌린다.

val을 console로 찍어보면 다음과 같이 출력된다.

1

2

3

그런데 최종 배열에는 아무것도 들어있지 않다... 각 배열의 요소를 꺼내 콘솔만 찍고 끝냈기 때문인가보당

이렇게 각 요소를 출력하고나서 다시 return해서 돌려줬더니 이쁘게 들어있다 ㅋㅋㅋㅋ

 

Array.from() 간단하게 활용

각 배열의 요소를 꺼낸 후 지혼자 더해서 배열에 담아둔다.

val => val + val을 실행할 때

1+1 => 2 넣어주고 2+2 => 4 넣어주고... 이런 식으로해서 2,4,6이 나옴

 

Array.from() 함수에서 인덱스 확인

이렇게 두번째 매개변수를 만들어준다.

val에는 기존의 배열 값, i에는 해당 val의 인덱스가 찍힘


Array.from() 함수에 객체 넣어보기

객체도 넣을 수 있다길래 넣어봤는데 key값에 무조건 length를 적어줘야 해당 길이만큼 반복하나보다...

이렇게 길이를 5로 지정해두면 반복문이 5번 도는 것을 볼 수 있다.

하지만 val에는 아무런 값도 들어있지않다...

이렇게 num이라는 key를 이용해 객체를 넣어줬을 땐 아무런 것도 출력이 되지 않는 것이 확인되었다ㅠㅠ

페이징 처리같은 것 할때 쓰면 되려나...

활용하기 좋은 곳이 나타나면 Array.from()함수를 머리속에서 끄집어내서 사용해봐야겠다!


나의 풀이에는 버전1이 채택된 것을 보면 저게 더 속도가 빠른가보다...속상

728x90
반응형

관련글 더보기