이노캠5주차(화) 알고리즘 문제풀기&isNaN,parseInt

rimhye·2023년 6월 20일
0

이노캠

목록 보기
18/39

1.문자열 내 P와 Y의 개수

[문제설명]
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
[제한사항]
-문자열 s의 길이 : 50 이하의 자연수
-문자열 s는 알파벳으로만 이루어져 있습니다.

📖문제풀이

function solution(s){
    var answer = true;
    let word= s.toUpperCase()
    let a=0
    let b=0
    
    // console.log(word)
    
    // 문자열은 유사 배열이므로 for 문으로 순회할 수 있다.
    for ( var i = 0; i <word.length; i++ ) {
	// 'l'이 아니면 현 시점에서 실행을 중단하고 반복문의 증감식으로 이동한다.
    if ( word[i] !== "P" ) continue;
        a++;
        // continue 문이 실행되면 이 문은 실행되지 않는다.
    }

    // console.log(a); 
    
    for ( var i = 0; i <word.length; i++ ) {
	// 'l'이 아니면 현 시점에서 실행을 중단하고 반복문의 증감식으로 이동한다.
    if ( word[i] !== "Y" ) continue;
        b++
        // continue 문이 실행되면 이 문은 실행되지 않는다.
    }

    // console.log(b); // 3
    
    if (a!==b){
        return false
    } else{
        return true
    }
}

참고사이트
[JS]대소 문자구분없이 문자비교하기
[JavaScript] 문자열에서 특정 문자의 개수를 세는 예

2.문자열 다루기 기본

[문제설명]
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
[제한 사항]
-s는 길이 1 이상, 길이 8 이하인 문자열입니다.
-s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

🔨시행착오

처음엔 Number()는 인자로 전달된 문자열이 숫자일 때 Number 객체가 리턴되고, 숫자가 아니면 NaN이 리턴하니 !!number()로 문자열이 숫자가 아닐때 false를 출력하게 해 false를, true시 true를 출력하도록 했다. 그러자 1/3정도 오류가 났다.

function solution(s) {
    if(s.length==4||s.length==6){
       if(!!Number(s)==false){ //오류많이 남->!isNaN으로 변경
           return false
       }else{
           return true
       }
    } else{
        return false
    }
}

그래서 Number()를 isNaN으로 바꿔 출력해보았다. isNaN()는 인자로 전달된 변수가 Number 타입이거나, 문자열이지만 숫자로만 구성되어있을 때 false를 리턴해서 !isNaN()가 true일 때, 변수는 숫자라고 판별할 수 있다. 그래서 if(!isNaN(s)===true)로 돌렸는데 오류 한 개가 잡히지 않았다.

function solution(s) {
    if(s.length===4||s.length==6){
       if(!isNaN(s)===true){ //1개 오류(아마 2e33뭐 이런 수였을듯)
           return true
       }else{
           return false
       }
    } else{
        return false
    }
}

관련 문제에 대해 서치해본 결과 isNaN()에선 숫자에 e가 붙으면 지수로 인식해서 숫자가 된다고 해서 블로거가 했던 방식으로 집어넣었더니 제대로 기동됐다.

 if(s.length === 4 || s.length === 6){
        return s.split("").every(c => !isNaN(c)) // 모든 요소가 number이면 true리턴
    } else {
        return false;
    }

문제는 해결됐지만 또다른 의문점. parseInt는 어째서 작동이 가능한 걸까? 조원분께서 공유해주신 아래의 코드는 또 잘 작동됐다.

function solution(s) {
var answer = true;
if ((s.length===4||s.length===6)&&s==parseInt(s)){
answer = true;
} else{
answer = false
}
return answer;
}

🤔의문점: parseInt()가 반환하는 경우의 수가 더 많은데 얘는 왜 괜찮지?

찾다보니 s==parseInt(s)로 식을 넣어서 된 것 같다. s 안에 e가 들어가면 s가 변형되고 문자가 있으면 오류가 나고 해서 이미 걸러주는 것 같다. 물론 +-기호가 있는 경우는 변형되는데, 문제에서는 0~9까지만 숫자를 제한했으니 문제없다. 도저히 모르겠으면 매니저님께 여쭤보려했는데 해결돼서 속이 너무 시원함!

참고사이트
parseInt()
Javascript프로그래머스-문자열-다루기-기본

✍️느낀점

솔직히 알고리즘 문제를 풀면서 쓰는 함수는 다 거기서 거기고, 비슷한 기능을 가진 함수는 그냥 스치듯 보기만 했는데 미묘하게 쓰임새가 다르다는 것을 알게 됐다. 그게 쫌 열받는 포인트이긴한데... 차이를 구분해서 잘 쓰면 활용하기 좋겠다는 생각이 들었다. 알고리즘 문제 풀때마다 킹받는데 확실히 도움이 돼서 뭔가 기분이 묘함😒😒

profile
개발자가 되고 싶어요

1개의 댓글

comment-user-thumbnail
2023년 6월 20일

시행착오를 겪으시면서 문제해결하시는게 대단하십니다!

답글 달기