본문 바로가기

자료구조알고리즘/코드스테이츠 Coplit

18_numberSearch

[ 문제 ]

문제를 천천히 읽어보자. 

문자열을 입력받는데 그 안에 숫자가 포함되어있다. 

그 숫자를 모두 찾아 더한 뒤, 그 값을 '숫자와 공백을 제외한' 나머지 문자열의 길이로 나눈 값을 정수로 반올림하여 반환하는 문제이다.

입출력 예시를 보자.

'Hello6 '이라는 문자열을 입력받았으면 여기서 숫자는 '6'이다.

6을 '숫자와 공백을 제외한' 나머지 문자열의 길이인 5로 나누면 1.2이다.

이 값을 반올림하면 1이라는 값이 나온다.

 

[ 풀이 ]

나의 로직은 다음과 같다.

1/ 반복문을 이용해 문자열에서 숫자를 모두 찾아 더한다.

2/ 공백, 숫자가 아니면 문자열이면 그 수를 더한다.

3/ 숫자의 합, 문자열길이를 구하면 숫자의 합을 문자열 길이로 나누어서 반올림한다.

 

function numberSearch(str) {

if(str === ""){ //1. 입력받은 str값이 빈 문자열이면
  return 0; //0값을 반환한다. 
}
let num = 0; //입력받은 문자열 중, 숫자일 경우 변수 num에 더한다.
let length = 0; //입력받은 문자열 중, 숫자, 공백이 아닌 문자열일 경우 length변수에 1씩 더한다.
for(let i = 0; i < str.length; i++){ //2. 반복문을 이용하여 입력받은 문자열이 숫자인지 아닌지 확인한다.
  if(isNaN(Number(str[i]))){ //Number함수에 넣어 NaN값이 나오면(즉, 공백도 숫자가 아니라면)
    length++; //length값에 1씩 더한다.
  } else { //Number함수에 넣어 숫자가 나오면(즉, 공백 또는 숫자라면)
    num = num + Number(str[i]); //num변수에 Number(str[i])값을 더한다.
  }
}
return Math.round(num/length); //반복문이 끝나면 숫자를 다 합친 num값을 length로 나누어서 반올림한 값을 반환한다.
}

이 문제를 풀면서 알게된 사실은

1/ NaN === NaN 값은 false라는 것. 즉 NaN값인지 알기 위해서는 isNaN이라는 함수를 이용해야한다.

2/ Number('a')의 값은 NaN이라는 것. 숫자로 만들어주는 함수인 Number에 문자열(ex:'a')을 넣어주면 NaN값이 나온다.

3/ Number(' ') 즉, Number함수에 공백을 넣으면 NaN이 아니라 0이라는 값이 나온다. 

4/ typeof NaN === 'number'라는 것.

 

 

[ 레퍼런스 ]

레퍼런스를 보고 로직이 정말 신박하다고 생각했다.

먼저 digits라는 변수에 0부터 9까지의 숫자를 넣고, 

반복문을 이용해 해당 문자열이 digits에 속하는지 확인하는 includes함수를 이용한다.

 

이렇게 풀 생각은 해본적이 없는데, 굉장히 좋은 아이디어인것 같다.

역시 레퍼런스를 보는건 큰 도움이 된다..!

'자료구조알고리즘 > 코드스테이츠 Coplit' 카테고리의 다른 글

16_isIsogram  (0) 2022.02.25
15_modulo  (0) 2022.02.24
14_superIncreasing  (0) 2022.02.22
11_removeExtremes  (0) 2022.02.18
10_insertDash  (0) 2022.02.18