저장을 습관화

프로그래머스 LV.1 자릿수 더하기 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.1 자릿수 더하기

ctrs 2023. 8. 7. 22:32

프로그래머스 LV.1 자릿수 더하기

https://school.programmers.co.kr/learn/courses/30/lessons/12931

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 명

자릿수 더하기


2. 문제 설명

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.


3. 제한 사항

N의 범위 : 100,000,000 이하의 자연수


4. 예시

N answer
123 6
987 24


5. 기본 제공 코드

function solution(n)
{
    var answer = 0;

    // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    console.log('Hello Javascript')

    return answer;
}


6. 제출한 내 답

const solution = (n) => {
  let answer = 0;

  a = n.toString();
  for (i = 0; i < a.length; i++) {
    b = Number(a[i]);
    answer += b;
  }

  return answer;
};

 

6-2. VSC에 작성한 내용

const solution = (n) => {
  let answer = 0;

  a = n.toString();
  for (i = 0; i < a.length; i++) {
    b = Number(a[i]);
    answer += b;
  }

  return answer;
};

// 테스트
console.log(solution(123));
console.log(solution(987));


7. 특이사항

어떻게 접근해야할지 몰라서...

let a = 987654;

b = a.toString();
console.log(b);
console.log(b.length);
console.log(b[1]);

대충 이런거 끄적거리고 있었는데...

어 뭔가 되는것 같더라고..

 

그래서 다시 이렇게 하고...

let a = 987654;

b = a.toString();
console.log(b); // 987654 // string
console.log(b.length); // 6 // number
c = b[1]; // 8 // string

d = Number(c);
console.log(d); // 8 //number

이거에 반복문을 사용한게 내 답


8. 다른 사람이 작성한 답

8-1. 반복문을 사용해 10으로 나눠가면서, 소숫점은 버린다음, 더함

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int n) {
    int answer = 0;
    while(n){
        answer += n%10;
        n /=10;
    }
    return answer;
}

아 이거 C네?

뭐 아무튼

 

8-2. 자바스크립트 버전 10으로 나눠가면서 소숫점 버리고 더하기

function solution(n){
    // 문자 풀이
    // return (n+"").split("").reduce((acc, curr) => acc + parseInt(curr), 0)

    // 숫자풀이
    var sum = 0;

    do {
        sum += n%10;
        n = Math.floor(n/10);
    } while(n > 0);

    return sum;
}

 

8-3. 매개변수+""

function solution(n)
{
    var a = (n + '').split('');
    var b = 0;
    for(var i = 0; i < a.length; ++i) {
        b += parseInt(a[i]);
    }
    return b;
    //return n.toString().split('').reduce((a, b) => (a * 1) + (b * 1));
}

var a = (n + "') 부분이 잘 이해가 안갔었다.

 

저게 무슨 의미지? split("")은 빈 문자로 쪼갠다는건 알겠는데

저러면 a는 그냥 n이 나오는거 아닌가? 

매개변수가 123이면 그냥 그대로 문자열 123 나오는거 아니야? 라고 생각했었다.

 

챗지피티한테 물어보니까 

n+""는 number + string

즉 정수 매개변수 n을 문자열로 바꾸는 방법이라고,

n.toString()과 같은 의미이고 같은 결과라고 하더라

 

1차 무릎 탁

 

다만 n+""와 n.toString()의 차이는

전자는 자바스크립트의 기본 규칙 "숫자와 문자열을 더하면 그 결과는 문자열이 된다"을 사용한 것이고

후자는 메서드를 호출했단 것

 

따라서 따지고보면 전자가 더 간단하단 것

 

2차 무릎 탁

 

그리고 그 결과를, 예를들어 매개변수 n이 123이라고 한다면 split() 메소드를 사용해서

123.split("") 공백을 기준으로 쪼개기 때문에 

이 결과는 배열 [ '1', '2', '3' ] 이 된다는 것

 

감탄

 

그러면 또, Number()와 parseInt() 부분

둘 모두 문자열을 숫자로 변환하는 함수임은 같지만 

차이점으로는

 

1) NaN 처리

parseInt

문자열(abc)과 섞여있다면 숫자 부분만 변환하고 나머지 문자는 무시한다.

만약 숫자로 시작하지 않는다면 NaN을 반환한다.

 

Number

문자열(abc)과 섞여있다면 NaN이 나온다.

let a = parseInt("123abc"); // (문자열의 숫자 부분만 변환)
console.log(a); // 123

let b = parseInt("1a2b3c");
console.log(b); // 1

let c = parseInt("abc123");
console.log(c); // NaN

let d = Number("123abc"); // (문자열 전체 변환, 변환 불가능한 문자 포함)
console.log(d); // NaN

 

2) 정수와 부동소수점 변환

parseInt

소수점 이하는 무시한다.

 

Number

정수와 소숫점까지 숫자 타입으로 변환한다.

let a = "123.123";

let b = parseInt(a); // (정수 변환)
console.log(b); // 123

let c = Number(a); //  (부동소수점 변환)
console.log(c); // 123.123

 

3) 진수 변환 지원

parseInt는 진수 변환을 지원해주나

Number는 그런거 없다.

// 2진수 -> 10진수
console.log(parseInt("1000", 2)); // 8
console.log(parseInt("1001", 2)); // 9 
console.log(parseInt("1010", 2)); // 10

// 16진수 -> 10진수
console.log(parseInt("2a", 16)); // 출력: 42