728x90
문제
문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
해결
function solution(my_string) {
const numbCollection = [];
let strTempo = '';
my_string.split('').forEach(el => {
if(Number(el) >= 0) {
strTempo += el
} else {
strTempo.length && numbCollection.push(strTempo);
strTempo = '';
}
})
if(strTempo.length) numbCollection.push(strTempo)
if(numbCollection.length === 0) return 0
const answer = Number(numbCollection.reduce((prev, cur) => Number(prev) + Number(cur)))
return answer
}
console.log(solution("asdfsaaf11"))
- 가장 처음으로 생각한 부분은 파라미터를 split(‘’) 메서드로 쪼개고
- forEach로 각 chr이 숫자인지 아닌지 구분한 뒤 숫자(양수)일 경우, strTempo에 계속 str으로 덧붙여서 숫자가 이어지도록 한다. 숫자가 아닐 경우, 지금까지 모아둔 strTempo를 numbCollection 어레이에 푸시하고 strTempo를 초기화 시킨다.
- strTempo를 numbCollection에 푸시하는 조건이 숫자가 아닌 경우에만 해당되는데, 만약 아규먼트의 마지막 chr가 숫자가 올 경우 numbCollection에 푸시되지 않는다. 즉, strTempo에는 저장이 되지만 이것이 어레이에 업데이트가 되지 않는다는 문제가 발생한다. 이를 해결하기 위해 strTempo에 데이터가 있는 경우 푸시하라는 코드를 하나 추가했다.
- 그다음 이제 반환값을 설정해주어야 했는데, 우선 컬렉션에 어떠한 숫자도 모이지 않았을 경우 0을 리턴해야 하므로 즉각 리턴하는 코드를 바로 붙여주었다.
- 그 아래에는 컬렉션에 숫자들이 모여있는 조건 하에 reduce로 숫자들을 모두 더해서 anwer 변수에 넣어주었다. 이때 각 요소들이 str형태이므로 Number() 메소드로 숫자로 만들어서 더해주었다.
회고
처음에 생각한 방향은 1)풀이한 방식과 같이 str을 split 메소드로 쪼개서 접근하거나, 2)정규식으로 접근하는 방식을 생각했다. 정규식에 대한 지식이 없어 어쩔 수 없이 전자의 방식으로 접근했다. 하지만 다른 사람들이 정규표현식으로 풀이한 방식을 보니 코드가 매우 간결했다. 정규표현식을 공부해야 겠다는 생각이 조금씩 든다.
레퍼런스
https://school.programmers.co.kr/learn/courses/30/lessons/120864
728x90
'Research > problems' 카테고리의 다른 글
LeetCode_283_Move Zeros (0) | 2022.11.24 |
---|---|
프로그래머스_lv0_영어가 싫어요 (0) | 2022.11.22 |
프로그래머스_lv0_이진수 더하기 (0) | 2022.11.16 |
프로그래머스_lv0_진료 순서 정하기 (0) | 2022.11.16 |
프로그래머스_lv0_한 번만 등장한 문자 (0) | 2022.11.16 |
댓글