프로그래머스 0단계 - 숨어있는 숫자의 덧셈(2)

이종현·2024년 1월 4일
0

코딩테스트

목록 보기
4/24
post-thumbnail

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • 1 ≤ my_string 안의 자연수 ≤ 1000
  • 연속된 수는 하나의 숫자로 간주합니다.
  • 000123과 같이 0이 선행하는 경우는 없습니다.
  • 문자열에 자연수가 없는 경우 0을 return 해주세요.

입출력 예

my_stringresult
"aAb1B2cC34oOp"37
"1a2b3c4d123Z"133

1. 문제 이해하기

  • 숫자와 문자의 조합으로 이루어진 문자열에서 숫자만 추출해서 더하는 문제
  • 문자열의 길이는 10^3 이기 때문에 O(N^2)으로 문제를 풀어도 괜찮음

2. 접근 방법

  • 직관적으로 생각하기
    • 문자열을 배열로 변환한다.
    • 변환한 배열을 for문을 돌면서 다양한 케이스에 맞춰서 새로운 배열에 숫자를 push 한다.
    • 최종적으로 배열에 담겨잇는 숫자들을 더한다.

3. 코드 설계

  • 문자열을 스프레드로 배열로 변환한다. [… 문자열]
  • 새로운 배열 선언
  • 배열을 반복을 돌면서 다양한 케이스에 맞춰서 대응한다.
    • 현재 인덱스가 숫자이면서 앞 뒤 인덱스는 문자일때
    • 현재 인덱스가 숫자이면서 앞 인덱스는 숫자, 뒤 인덱스는 문자일 때…
    • 이런 방식으로 일일히 대응;;
  • 최종적으로 새로운 배열에 숫자를 담고 나면 reduce 함수로 더해서 마무리한다.

4. 코드 구현

실패한 코드

function solution(my_string) {
  const stringArr = [...my_string]
  const numberArr = []
  let numberString = ''

  for (let i = 0; i < stringArr.length; i++) {
    if (!isNaN(Number(stringArr[i]))) {
      if (isNaN(Number(stringArr[i + 1])) && isNaN(Number(stringArr[i - 1]))) {
        numberArr.push(Number(stringArr[i]))
      } else if (
        isNaN(Number(stringArr[i - 1])) &&
        !isNaN(Number(stringArr[i + 1]))
      ) {
        numberString = stringArr[i] + stringArr[i + 1]
      } else if (
        !isNaN(Number(stringArr[i - 1])) &&
        !isNaN(Number(stringArr[i + 1]))
      ) {
        numberString += stringArr[i + 1]
      } else if (i === 1 && !isNaN(Number(stringArr[i - 1]))) {
        numberArr.push(Number(stringArr[i - 1] + stringArr[i]))
      }
    }
  }
  numberArr.push(Number(numberString))

  return numberArr.reduce((a, b) => a + b)
}

const my_string = '11a2b3c4d1234Z'

다른 사람 풀이

function solution(my_string) {
  return my_string.split(/[a-zA-Z]/g).reduce((a, c) => +a + +c, 0)
}

회고

와, 오늘도 진짜 반성하게 된다. 너무 직관적으로만 문제를 풀려고 하는게 문제인 것 같다. 자꾸 for문을 이용해서만 문제를 풀려고 하는 것도 문제인 것 같다.

일단은 코드를 먼저 작성하려고 하기보다는 문제를 이해했으면 잠시 컴퓨터에서 떨어져서 어떻게 문제를 해결하면 좋을지 적어도 5분 정도는 생각한다음에 컴퓨터 앞에 앉아봐야겠다.

다른 사람풀이를 보면 정규표현식으로 간단하게 처리했다. 5분 정도 생각한다고 저런 풀이가 한 번에 생각이 나지는 않겠지만, 자꾸 먼저 코드로만 문제를 풀려고 하는 건 조금이나마 방지할 수 있을 거라 생각한다.

profile
데이터리터러시를 중요하게 생각하는 프론트엔드 개발자

0개의 댓글