mocha00
34
2021-03-17 19:25:01 작성 2021-03-17 19:33:14 수정됨
6
735

자바스크립트 알고리즘 질문 ㅠㅠ(쉬움)


안녕하세요.


알고리즘 문제 출처:

https://www.testdome.com/questions/javascript/check-digit/17555



주어진 숫자가 1자리 숫자가 될 때까지 각 자리 숫자를 합치는 함수를 만들려고 합니다.

한자리 숫자가 됐을 때,

console.log로 찍으면 원하는 숫자가 나오는데

return을 하면 undefined라고 뜹니다..

왜 그럴까요?

function createCheckDigit(membershipId) {
  let len = `${membershipId}`.length;

  if (len === 1) {
    console.log(membershipId); // 7
    return membershipId; // undefined
  } else {
    let arr = membershipId
      .toString()
      .split('')
      .map((item) => parseInt(item, 10));

    let sum = arr.reduce((prev, curr) => prev + curr, 0);
    createCheckDigit(sum);
  }
}



아래처럼 푸니 풀리네요..

근데 length를 반복해서 안좋은 코드같아서 마음이 좀 그런데;

위에건 안되고 아래건 되는 이유가 궁금하네요..


function createCheckDigit(membershipId) {
  let len = `${membershipId}`.length;
  if (len == 1) {
    return membershipId;
  } else {
    let arr = membershipId
      .toString()
      .split('')
      .map((item) => parseInt(item, 10));

    let sum = arr.reduce((prev, curr) => prev + curr, 0);

    let lenth = `${sum}`.length;
    if (lenth >= 2) return createCheckDigit(sum);
    if (lenth === 1) return sum;
  }
}

console.log(createCheckDigit('27686'));
0
  • 답변 6

  • mocha00
    34
    2021-03-17 19:56:21

    @코딩독학

    네 안그래도자바스크립트 책 읽으면서 알고리즘 문제 풀고있습니다.

    어디서 기초가 부족한걸 느꼈는지 여쭤봐도 될까요? 그부분 공부를 좀 더 하게요.

  • Frudy
    7k
    2021-03-17 19:56:25 작성 2021-03-17 20:14:17 수정됨

    음.. 저는 공부방법은 사람마다 다 다르다고는 생각해요.

    이렇게 부딪혀보면서 다시 기본서 찾아보게되지않을까요? 


    우선~


    질문주신 내용 답변을 드리자면,

    createCheckDigit(sum);

    첫번째 캡쳐 else 가장 마지막인 이부분이 문제입니다.


    반환을 안했습니다. 그렇죠?

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

    함수는 값을 명시적으로 반환하지 않으면 undefined를 반환합니다.


    그리고 부분적으로 맞게 고친 코드는 아래와 같습니다.

    function createCheckDigit(membershipId) {
    let len = `${membershipId}`.length;

    if (len === 1) {
    return Number(membershipId);
    } else {
    let arr = membershipId
    .toString()
    .split('')
    .map((item) => parseInt(item, 10));

    let sum = arr.reduce((prev, curr) => prev + curr, 0);
    return createCheckDigit(sum.toString());
    }
    }


    1. 함수의 return type은 number여야 합니다. (문제조건)

    그러므로 if문에서 반환할때는 number타입으로 형변환을 해야합니다.

    기존 코드는 그냥 반환했었죠? 그러면 string타입으로 반환하게되는거라 안됩니다.


    2. 재귀함수로 또 호출할때는 같은 이유로 string타입으로 다시 형변환해야합니다.

    createCheckDigit(sum);

    return createCheckDigit(sum.toString());


    위가 질문자님의 코드고, 아래가 저의 코드입니다.


    sum의 타입은 number입니다.

    그래서 재귀함수로 호출할 때 매개변수의 타입은 string으로 맞춰주셔야합니다.


    왜냐하면 이 함수의 parameter의 타입은 string이기 때문입니다. (문제조건)


    javascript는 타입이 없어서 왜 sum의 타입이 number인지 한눈에 보기 힘드시죠?

    그래서 typescript를 배우기를 적-극 권장합니다.

    약파는거 아니에요. 한번 배워두면 절대로 두번다시 javascript로 돌아오시지못할겁니다.


    https://github.com/developer-choi/coding-test-playground/blob/master/src/recursion/digit.ts

    제 코드도 올려드리고 가겠습니다. typescript로 구현되어있습니다.

    function solution(membershipId: string): number {
    const sum = membershipId.split('').reduce((a, b) => a + Number(b), 0);
    if (sum >= 10) {
    return solution(sum.toString());
    } else {
    return sum;
    }
    }

    이건 저의 스타일입니다. 참고해주세요~


  • mocha00
    34
    2021-03-17 20:03:57

    @Frudy

    오오.. 덕분에 제 문제점도 알게되었습니다. 정말 감사합니다.

  • Frudy
    7k
    2021-03-17 20:06:38 작성 2021-03-17 20:08:00 수정됨

    음 딱히 부처라기보다는,..


    제 답변이 영양가가 있었으면 좋겠어요.

    (이후 이 글을 다른사람들도 보게 될 예정이니까요,)


    그리고 저도 비전공자다보니 힘든시절 다 겪어봐서

    이렇게 도움드릴 수 있다는게 좋기도 하구요~


    저도 제 답변의 근거를 찾기위해 MDN한번 찾아보는것도 다 저한테 기초 도움되는거같기도 해요!

  • yeori
    4k
    2021-03-17 21:34:51

    저런 엉터리 문제는 풀지 마세요

    1. 입력의 범위가 제시되지 않음(id 최소 최대 길이)

    2. 입력에 등장하는 문자열에 대한 스펙이 없음(공백이 있을 수 있는지 등)

    3. 출력의 타입을 명확히 밝히지 않음. 답이 7이면 문자열 '7'도 허용되는지 아니면 반드시 숫자 타입이어야 하는지...

    사람 골탕 먹이는 나쁜 문제입니다.


  • Frudy
    7k
    2021-03-17 21:51:33

    For example, for the membership ID "55555" the sum of all digits is 25. Because this is not a single-digit number, 2 and 5 would be added, and the result, 7, would be the check digit.



    저는 이부분 보고나서 return type이 number여야하는구나 싶었는데 아닌가요???

    입력값은 친절하게 " "로 감싸서 문자열이라고 표기하길래..

  • 로그인을 하시면 답변을 등록할 수 있습니다.