본문 바로가기
카테고리 없음

코딩테스트 : 문자열 다루기

by 이승보 2021. 8. 30.
728x90

https://programmers.co.kr/learn/courses/30/lessons/12918#

 

코딩테스트 연습 - 문자열 다루기 기본

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다. 제한 사항 s는 길이 1

programmers.co.kr

 

 

내 답안

function solution(s) {
    const numberS = parseInt(s)
    if((s.length === 4 || s.length === 6) && 
        !isNaN(numberS) && 
        numberS % 1 === 0 &&
        numberS.toString().length === s.length) 
            return true
    else 
            return false
}

 

정규식으로 간편하게 표현하는 방법들을 쓰신 분들이 있던데..나는 정규식은 모르는 코린이에다가 일단 직관적으로 보기 편한 방법을 사용했다. 

If문으로 점검하는 단계는 총 4단계로
1. 문자열 길이가 4 또는 6인지 체크
2. s를 Interger형으로 변환한 numberS 변수가 NaN인지 체크
3. numberS 변수가 정수인지 확인
4. numberS의 길이와 s의 길이가 동일한지 확인.

기존에는 굳이 parseInt 함수를 사용하지 않고 s*1 로 간단하게 숫자형식으로 비교를 하였는데, 계속해서 한개 문제에서 실패를 하길래 여러 케이스들을 추가하다보니 '모든 글자가 숫자여야 된다'라는 조건을 만족하기 위해서 3번과 4번을 추가하였고, parseInt함수를 사용했다. 테스트케이스로는 "1.23", "123.", ".123", "123e", "e123" 등을 사용했다. "123."의 경우 그냥 정수형으로 변환하면 123 이 나와버려서 숫자로 인식하지만 "."을 간과해서는 안됨!

할 때마다 찾아보는 아래의 내용은 나를 위한 정리.

 

typeof

피연산자의 자료형을 나타내는 문자열을 반환

typeof operand
typeof(operand)

//주의
typeof (typeof 1) === 'string'; 
typeof Infinity === 'number';
typeof NaN === 'number'; // Despite being "Not-A-Number"
typeof null === 'object';

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/typeof

 

isNaN()

주어진 값이 NaN이면 true, 아니면 false 반환한다.
null, undefined는 ==, === 으로 같음을 판별 할 수 있지만, NaN은 안 된다.
isNaN 함수의 인수가 Number형이 아닌 경우, 값은 먼저 숫자로 강제된다. 결과값은 그 뒤에 NaN인지 결정하기 위해 테스트한다.
ES2015에는 Number.isNaN()이 추가 되었으며, 상세 구분은 MDN 참고(사실 내가 무슨 말인지 이해가 안 되었음 ㅜ) 좀더 엄격한 버전이라고 생각하면 편할 듯?

isNaN(value)

//예시
const temp = NaN
console.log(temp === NaN) //false

isNaN('hello world'); // true
Number.isNaN('hello world'); // false

isNaN(NaN, undefined, {});       // true, true, true
isNaN(true, null, 37);  	     // false, false, false

isNaN("37", "37.37");      // false, false :숫자로 변환되어 판별
isNaN("123ABC");  // true : parseInt("123ABC")는 123이지만 Number("123ABC")는 NaN입니다
isNaN(""," ");        // false, false: 빈 문자열 또는 공백은 NaN이 아닌 0으로 변환됩니다

// dates
isNaN(new Date());                // 거짓
isNaN(new Date().toString());     // 참

// 이것이 허위 양성이고 isNaN이 완전히 신뢰할 수 없는 이유이다.
isNaN("blabla")   // 참: "blabla"는 숫자로 변환됩니다.
                  // 이것을 숫자롯 parsing 하는 것을 실패하고 NaN을 반환한다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/isNaN

참고 : NaN = Not A Number
NaN을 반환하는 연산에는 다섯 가지 종류가 있습니다.

  • 숫자로서 읽을 수 없음 (parseInt("어쩌구"), Number(undefined))
  • 결과가 허수인 수학 계산식 (Math.sqrt(-1))
  • 피연산자가 NaN (7 ** NaN)
  • 정의할 수 없는 계산식 (0 * Infinity)
  • 문자열을 포함하면서 덧셈이 아닌 계산식 ("가" / 3)

 

 

toString(), Number(), parseInt(), parseFloat()

obj.toString()
numObj.toString([radix])  //radix : 몇 진수로 나타낼 것인지 2~36


new Number(value);
var a = new Number('123'); // a === 123은 false
var b = Number('123'); // b === 123은 true
a instanceof Number; // true
b instanceof Number; // false
Number('123')     // 123
Number('12.3')    // 12.3
Number('123e-1')  // 12.3
Number('')        // 0
Number(null)      // 0
Number('0x11')    // 17
Number('0b11')    // 3
Number('0o11')    // 9
Number('foo')     // NaN
Number('100a')    // NaN


Number.parseInt(string,[ radix])
parseInt(string, radix);

Number형을 String으로 변환시킬 수도 있지만, Object 타입에서 함수호출해서 문자열을 반환하는 것도 가능하다. 이 때 재정의를 해서 다른 방식으로 문자열 반환도 가능.
Number.toString() 은 Obj.toString() 을 오버라이딩 한 것임.
radix를 정의하지 않으면 10진수로 가정하게 되며, 음수일 경우 -부호 유지하고, 정수가 아니라면 점(.)은 소수 자리와 분리하기 위해 사용됨.

Number 객체는 Number() 생성자(new)를 사용해서 만들고, 원시 숫자 자료형은 Number() 함수를 사용해서 생성한다.
인수를 숫자로 변환할 수 없으면 NaN을 리턴하며, 생성자(new)를 사용하지 않으면 형변환을 할 수 있다.(ex. String to Number)

parseInt의 첫 번째 인자(string)이 문자열이 아니면 문자열로 변환(toString이 사용됨)한 후에 함수 진행함. 이 때 문자열의 선행 공백은 무시함. string에서 특정 진수의 숫자가 아닌 글자를 마주하게 되면, 전부 무시하고 파싱된 정수값만 리턴함.
radix는 진법수(2~36)이며 이 때 기본값음 10 아니다(?!)
만약 radix  undefined 이거나 0이라면, (또는 없다면), JavaScript 는 아래와 같이 임의 처리합니다. :

  1. 인풋 값 string 이 "0x" 나 "0X"로 시작한다면, radix 는 16(16진)이며, 나머지 문자열은 파싱됩니다.
  2. 인풋 값 string 이 "0"으로 시작한다면, radix 는 8(8진)이거나, 10(십진)입니다. 정확히 이 선택된 radix 는 구현 의존적적입니다. ECMAScript 5 는 10(십진)이 사용되는 것을 명시하지만, 모든 브라우저가 아직 이렇게 되지 않습니다. 이러한 이유로 항상 parseInt를 사용할 때는 radix 값을 명시해야 합니다.
  3. 인풋 값 string 이 다른 값으로 시작 된다면, radix 는 10(십진)입니다.

Number.parseInt() 메서드는 전역 parseInt() 함수와 같은 기능을 가지고 있습니다.
아래의 경우에는 NaN을 반환합니다

  • radix가 2보다 작거나 36보다 큰 경우
  • 첫번째 non-whitespace 문자가 숫자로 변환되지 않는 경우

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/toString

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/parseInt

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/parseInt

 

 

함수 외에

Javascript에서 숫자 자릿수 구하기

const num = 12345
const strNum = num.toString()

// 1. String 형 변환해서 length 속성 이용
console.log(strNum.length) //5

// 2. String 형 변환해서 idx번째에 값이 있는지 확인
let idx = 0
while(strNum[idx]) idx++
console.log(idx) //5

 

Javascript에서 숫자가 정수인지, 실수인지 확인하는 방법

// 1.나머지 구하는 연산자 '%' 활용

function checkInteger(num){
	return num % 1 === 0
}

console.log(checkInteger(123))	//true
console.log(checkInteger(0))	//true
console.log(checkInteger(-123))	//true
console.log(checkInteger(12.3))	//false : 0.3


// 2.Number.isIneger() 함수
console.log(Number.isInteger(123)) //true
console.log(Number.isInteger(0)) //true
console.log(Number.isInteger(-123)) //true
console.log(Number.isInteger(12.3)) //false

 

 

여태까지는 제대로 알지 못한 채 
toString을 쓰면 숫자가 문자열이 되겠거니, Number를 쓰면 숫자형이 되겠거니,
parseInt를 쓰면 문자열에서 정수만 쏙 뽑아주겠거니 했었는데... MDN이라도 한 번 정독하고 나니...더 공부하고 익숙해져서 알아둬야 할 게 많구나라는 걸 느끼게 되었다...후..
이렇게 하나씩 정리하면서 보다보면 되겠지...

728x90
반응형

댓글