[Programmers #12918] - 문자열 다루기 기본

G_NooN·2024년 1월 18일
0

Algorithms

목록 보기
24/33
post-thumbnail

(Lv. 1) 문자열 다루기 기본 (문제 링크)

문제 설명

문자열 s가 주어졌을 때, s의 길이가 4 또는 6이고, 숫자로만 구성되어있는지 return하는 solution 함수를 완성하라.

제한 조건

  1. s의 길이는 1 이상 8 이하다.
  2. s는 영문 알파벳 대/소문자 또는 0부터 9까지의 숫자로 이루어져 있다.

입출력 예시


접근 방식

  1. 입력값 : 문자열 s / 출력값 : 조건의 만족 여부(True/False)
  2. s의 길이가 4 또는 6이 아니면 된다.
  3. s를 숫자로 변환한 값이 NaN이 아니면 된다.
  4. 두 조건을 합친다.

해결 방법

  1. s의 길이가 4 또는 6이 아니면 false를 return한다.
  2. s의 각 문자 중 숫자가 아닌 값이 있으면 false를 return한다.
  3. 결과를 출력한다.

코드

function solution(s) {
  let answer = true;

  if (s.length !== 4 && s.length !== 6) answer = false;

  for (let i = 0; i < s.length; i++) {
    if (isNaN(Number(s[i]))) answer = false;
  }

  return answer;
}

시행착오

초기 접근 방식

처음에는 단순하게 알파벳은 숫자로 변환이 되지 않는다는 생각에 아래의 코드를 사용했다.

if (isNaN(Number(s)) || (s.length !== 4 && s.length !== 6)) answer = false;

예시로 나온 입력값도 모두 문제 없이 처리가 됐다. 하지만..

딱 한 문제... 진짜 딱! 한 문제가 통과가 안된다!!!

원인을 알고 싶어서 다른 사람들이 해결한 코드를 찾아보았다.

숫자로 변환 가능한 문자열?

반례가 존재했다. "10e1"

세상에.... 아니.... 아....

솔직히 "저게 왜 돼?!" 하는 생각이 들면서도 한편으로는 "하긴.. 지수니까 숫자로 인식되는게 맞긴 하지ㅠㅠ" 하는 생각이 들었다.

그래서 코드를 전체 문자열 자체를 탐색하는 것에서 각 문자를 탐색하는 것으로 수정하였다.

// AS-IS
isNaN(Number(s)) answer = false;

// TO-BE
for (let i = 0; i < s.length; i++) {
  if (isNaN(Number(s[i]))) answer = false;
}

알고리즘은... 알면 알수록 쉽지 않다....


주요 개념

  • 지수 표기법도 숫자야 숫자!!
profile
쥐눈(Jin Hoon)

0개의 댓글