[프로그래머스] 숨어있는 숫자 찾기 (2)

이아현·2023년 6월 3일
0

코딩테스트

목록 보기
10/31
post-thumbnail

✅ 문제 설명

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

✅ 제한 사항

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

👩‍💻 첫 번째 풀이 (실패)

function solution(my_string) {
  var answer = 0;

  var my_num = my_string.split("");

  var check = "";
  for (let i = 0; i < my_num.length; i++) {
    if (parseInt(my_num[i]) > 0) {
      check += my_num[i];
    } else {
      if (parseInt(check) > 0) {
        answer += parseInt(check);
        check = "";
      }
    }
  }

  return answer;
}
  • 풀이방법
  1. my_stringsplitmy_num배열을 만든다.
  2. my_num배열을 순환하면서 숫자화시켰을 때 해당 값이 0보다 크면 check문자열에 값을 넣는다.
  3. 숫자가 아니면서 check문자열을 숫자화시킨 값이 0보다 크면 answerparseInt(check)값을 더하고 check를 초기화 한다.
  • 이렇게 풀었을 때 두 가지의 edge case가 생긴다.
  1. "a1b23" : 마지막에 숫자가 오는 경우 check에 23이라는 값을 담지만 for문이 끝나버려서 answer에 더해지지 않는다.
  2. "a10b23" : 0이 들어가는 숫자가 나오는 경우 0을 인식하지 못하고 0을 뺀 숫자가 answer에 더해진다.

👩‍💻 두 번째 풀이 (성공)

function solution(my_string) {
  var answer = 0;

  var my_num = my_string.split("");

  var check = "";
  for (let i = 0; i < my_num.length+1; i++) {
    if (parseInt(my_num[i]) >= 0) {
      check += my_num[i];
    } else {
      if (parseInt(check) > 0) {
        answer += parseInt(check);
        check = "";
      }
    }
  }

  return answer;
}
  • edge case 해결방법
  1. for문을 돌릴 때 한 번 더 돌아서 check에 담긴 값이 더해질 수 있도록 한다.
  2. parseInt(my_num[i])값이 0일 수도 있기 때문에 0보다 크거나 같을 때로 조건을 변경한다.

📃 회고

  • 이번 문제를 풀면서 내가 엣지 케이스 해결능력이 부족하다는 생각이 들었다.
  • 앞으로는 어떤 엣지 케이스가 있을 수 있는지 많은 고민을 해볼 것 같다.
  • 초반에 12처럼 숫자가 붙어있다고 생각을 하지 않았을 때 숫자화한 문자의 타입이 number면 되지 않을까? 하는 생각으로 문제에 접근했었다. 어떻게 접근했는지 기록을 남겨두려고 한다!
    var my_num = my_string.split("").filter(word => typeof(parseInt(word) == Number));
profile
PM을 지향하는 FE 개발자 이아현입니다 :)

0개의 댓글