자료구조 및 알고리즘/JavaScript Practice

[프로그래머스] 숨어있는 숫자의 덧셈 (2)

Ryomi 2024. 12. 17. 22:46
728x90
반응형

24년 12월 16일
해결한 문제 갯수: 4

 

문제 설명

 

문제 분석

  • 문자열은 영문자, 숫자로만 구성됩니다.
  • 연속된 숫자는 하나의 숫자로 취급합니다.
  • '000123'과 같이 0이 선행하는 경우는 없습니다.
  • 숫자가 없는 경우 0을 반환합니다.

 

 

첫 번째 접근: Reduce를 이용한 처리

function solution(str) {
    return Array.from(str).reduce((a, c, i) => {
        if(Number(c) || c === '0'){
            a += c
        } else if(!Number.isNaN(Number(a.slice(-1)))) a += ' '
        
        return a
    }, '').split(' ').reduce((a, c) => {
        if(Number(c)) a += Number(c)
        return a
    }, 0)
}

1. 첫번째 reduce

- 문자열을 배열로 변환합니다.

- 현재 값이 숫자인 경우 누적합니다. 

- 현재 값이 문자인경우 이전값이 숫자일때, 공백을 추가합니다. 

2. 두 번째 reduce

- 공백으로 분리된 숫자를 합산합니다. 

 

두 번째 접근: map()을 이용한 처리

function solution(str) {
    return Array.from(str)
        .map(l => Number.isNaN(Number(l)) ? ' ': l)
        .join('')
        .trim()
        .split(' ')
        .reduce((a, c) => a += Number(c), 0)
}

개선사항

- 가독성 향상

 

세 번째 접근: 문자열 순회 * 1

function solution(str) {
    let answer = 0;
    let currentNumber = '';
    
    for(let char of str) {
        if(!isNaN(Number(char))) {
            currentNumber += char;
        } else if(currentNumber) {
            answer += Number(currentNumber);
            currentNumber = '';
        }
    }
    
    if(currentNumber) answer += Number(currentNumber);
    
    return answer;
}

개선사항

- 문자열 순회 횟수 최소화 및 메모리 사용 최소화(불필요한 배열 생성 및 중간 문자열 X)

 

728x90
반응형