고양이와 코딩

[프로그래머스] 12월26일 ~ 12월30일 본문

javascript

[프로그래머스] 12월26일 ~ 12월30일

ovovvvvv 2023. 12. 26. 20:25
728x90

12월26일

숫자의 표현

 

내 풀이

function solution(n) {
    let answer = 0;
    let start = 1; 
    let sum = 0;

    while (start <= n) {
        for (let i = start; ; i++) {
            sum += i;
            if (sum === n) {
                answer++;
                break;
            } else if (sum > n) {
                break;
            }
        }
        sum = 0;
        start++;
    }

    return answer;
}

이렇게 제출했는데.. 시간 초과가 납니다.. ㅠㅠ 다른 방법을 찾아봐야겠네요

 

 

12월27일

다음 큰 숫자

 

내 풀이

function solution(n) {
    const nBinaryString = n.toString(2).replace(/0/g, ' ');
    const oneCount = nBinaryString.replace(/\s/g, '').length;
    
    for (let i = n + 1; ; i++){
        const iBinaryString = i.toString(2).replace(/0/g, ' ');
        const oneCountI = iBinaryString.replace(/\s/g, '').length;
        
        if(oneCount === oneCountI) {
            return i;
        }
    }        
}

 

 

피보나치 수

 

첫 번째 풀이

function solution(n) {
    const fibonacci = (n) => {
        if (n === 0) {
            return 0;
        } else if (n === 1) {
            return 1;
        }

        return fibonacci(n - 1) + fibonacci(n - 2);
    }

    return fibonacci(n) % 1234567;
}

이렇게 풀었더니 테스트케이스 7번부터 무한로딩이 되었다... 뭐가 문제인지 찾아보았다!

 

너무 딱 맞춰서 머쓱할정도 ㅎㅎ ^^;; 재귀 호출을 하면 런타임 에러가 나나보다. 반복문으로 고쳐보자

 

function solution(n) {
    if (n === 0) {
        return 0;
    } else if (n === 1) {
        return 1;
    }

    let a = 0;
    let b = 1;
    let result = a + b;
    let count = 2;
    
    while (count <= n){
        result = a + b;
        a = b;
        b = result;
        count++
    }
     

    return result % 1234567;
}

이건 틀렸습니다! 가 뜨네요.....ㅠㅠ...

 

최종 코드

function solution(n) {
    if (n === 0) {
        return 0;
    } else if (n === 1) {
        return 1;
    }

    let a = 0;
    let b = 1;
    let result = 0;
    let count = 2;

    while (count <= n) {
        result = (a + b) % 1234567;
        a = b;
        b = result;
        count++;
    }

    return result;
}

 

 

12월28일

문자열 내 p와 y의 개수

 

내 풀이

function solution(s){
    let UpperS = s.toUpperCase().split('');
    let foundP = 0;
    let foundY = 0;
    
    for(let i = 0; i < UpperS.length; i++){
        if(UpperS[i] === "P"){
            foundP++;
        } else if (UpperS[i] === "Y"){
            foundY++;
        }
    }
   
    return foundP === foundY ? true : false;
}

 

다른 사람의 풀이

function numPY(s){
    return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}

........

 

12월29일

x만큼 간격이 있는 n개의 숫자

 

처음 풀이

function solution(x, n) {
    var answer = [];
    
    for (let i = x; i <= x * n; i+=x){
        answer.push(i);
    }
    return answer;
}

이 경우는 x가 음수인 경우를 고려하지 못한다. (+= x 라고 해도 -4 + (-4)니까 괜찮을거라고 생각함..)

 

제출 코드

function solution(x, n) {
    const answer = [];

    for (let i = 0; i < n; i++) {
        answer.push(x + x * i);
    }

    return answer;
}

 

자릿수 더하기

 

내 풀이

function solution(n){
    let sum = 0;
    let arrN = n.toString().split('');
    
    arrN.forEach((value) => {
        sum += Number(value);
    })
    return sum;
}

 

다른 사람의 풀이

function solution(n){
    // 쉬운방법
    return (n+"").split("").reduce((acc, curr) => acc + parseInt(curr), 0)
}

reduce를 사용했고, 자바스크립트의 형변환을 이용해서 n + "" 을 사용하셨다! 

 

 

12월30일

자연수 뒤집어 배열로 만들기

 

내 풀이

function solution(n) {
    const answer = [];
    const reversed_n = n.toString().split('').reverse();
    
    reversed_n.forEach((value, index) => {
        answer.push(Number(value));
    })
    
    return answer;
}

아 나도 한줄풀이!! 할 수 있을 것 같았는데 ...ㅠㅅ ㅜ...

 

다른 사람의 풀이

function solution(n) {
    return (n + '').split('').reverse().map(n => parseInt(n));
}

 

 

정수 제곱근 판별

 

내 풀이

function solution(n) {
    const number = Math.sqrt(n);
    
    return Number.isInteger(number) ? (number + 1) ** 2 : -1;
}

return문에서 조건을 판별할때 Math.sqrt(n) 이렇게만 사용하면 0이 아닌 모든 숫자에 대해 참으로 간주되기 때문에

정수임을 판별하는 Number.isInteger 함수를 사용 해 줘야한다. 제곱근이 정수인 경우에 그 제곱근 값이 무조건 정수가 되기 때문에 ㅎㅎ