Today's algorithm : 각 자리수의 합

강지원·2021년 9월 27일
0
post-thumbnail

그 동안 공부했던 것을 바탕으로 시험해보는 시간을 가져봤다.

오늘 문제를 마구마구 풀어보다 막히는 문제들이
더러 나왔었다. 오늘 리뷰해보는 문제는 그 중 하나!

1. 오늘의 알고리즘 문제

1부터 20까지의(20을 포함) 모든 숫자를 일렬로 놓고
모든 자릿수의 총 합을 구하세요.

ex) 10부터 15까지의 모든 숫자를 일렬로 놓으면
101112131415이고 각 자리의 숫자를 더하면 21입니다.
(1+0+1+1+1+2+1+3+1+4+1+5 = 21)

2. 풀이 과정

먼저, 자기들끼리 친하다고 붙어있는 숫자들을 떼준다.
숫자로 붙어있는 것을 떼주기 위해 숫자를 문자로 바꿔주고
split()을 사용해 분리시켜줬다.

그런데 MDN을 참고해보니

주의: 구분자로 빈 문자열("")을 제공하면, 사용자가 인식하는 문자 하나(grapheme cluster) 또는 유니코드 문자(코드포인트) 하나씩으로 나누는 것이 아니라, UTF-16 코드유닛으로 나누게 되며 써로게이트 페어가 망가질 수 있습니다. 스택 오버플로우의 How do you get a string to a character array in JavaScript? 질문도 참고해 보세요.

라고 명시되어 있는 것을 보고 흠칫했다.

내가 MDN의 다른 설명은 못알아들어도 하지 말라는 말은 잘 듣는다.
그래서 split에 구분자로서 ''을 사용하는 방법을 제외한 다른 방법을 찾았다.
바로 스프레드 연산자였다.

ES6에서는 '...'라는 신 문법이 추가되었는데 이게 아주 유용했다.
기존에 배열을 묶을 때 사용했던 concat이라던가,
원본 배열에 영향을 주지 않고 복사하는 것이 가능하게 해줬다.
(이외에도 오지는 장점들이 있지만 여기까지만)

이제 남은 단계는 숫자를 더한 합계를 내는 것.
합계를 내는 방법으로 가장 많이 쓰인다는 reduce()를 이용해봤다.
이용을 해줬는데..

이게 뭐람? 왜 다시 원점으로 돌아와버렸지...? 이러면서 잠깐 멍해있었다.

(잠시지만 혼자서 못난 놈이라는 생각에 사로잡혔습니다..)

짧은 현타 후 내가 바보였다는 사실을 인지했다.
초반에 숫자를 문자로 바꿔줬는데 이 사실을 잊었던 것이다.
그래서 초반의 값을 Number()를 사용해 숫자로 바꿔줬다.
(또 다른 방법으로는 parseInt()를 사용해줄 수도 있었다.)

그런데 변함이 없었다.
난 뭘한걸까.
어떤 부분에서 놓치고 있을까를 생각을 해봤다.
아마 내가 잘 모르는 reduce()에서 문제가 발생하지 않았을까 하는
킹리적 갓심을 품고 욜씨미 구글링을 해봤다.

redece() syntax를 알아보러 떠나보자

역시나, 내가 놓치고 있었던 부분이 있었다.
initialValue 부분이 계속 언급이 되어 이리저리 찾아보고 대입해 본 결과, Number 뒷부분에 ,를 찍어줘서 initialValue라는 것을 넣어줘야
했었다.
(이 부분이 initialValue인지 확실하지 않습니다.
제 글을 봐주신다면 피드백 감사히 받아들이겠습니다! 지적해주세요!)

원하는 대로 21이라는 값을 얻었다.
reduce라는 개념을 처음 봐서 헤맸다는 건 변명이다.
내가 설명을 끝까지 안본거고, 그래서 해결하지 못한거다.

3. 마치며

시간이 걸리더라도 해결해야겠다는 문제는 무조건 해결해야겠다는
욕심이 생겼다.

또, 문제 해결 도중 개념을 공부할 땐 오늘처럼 대충 둘러보고 적용하기보단
개념 설명의 처음부터 끝까지 정독하고 적용하는 태도를 갖춰야겠다.

Reference
MDN
stackoverflow

profile
'Why' better than 'Yes'

0개의 댓글