알고리즘 풀이[L2] 2 x n 타일링, [L2] n진수 게임

이지예·2023년 2월 22일
0

Programmers

목록 보기
4/6

코드

function solution(n){
    return calculation(n);
}
const calculation=(n)=>{
    //dp를 위한 배열을 만들어 놓는다. 0으로 초기화 한다.
    const dp = new Array(n+1).fill(0);
    //0은 1로 그냥 설정 해 놓고. 계산 해 보니까 0인 경우 1이어야 값이 맞네,,
    dp[0]=1;
    //1은 어짜피 경우의 수가 1밖에 없으니까 1로 둔다.
    dp[1]=1;
    for(let i=2;i<=n;i++){
        //재귀함수 때부터 생각 했던건데
        //만약 가로로 눕혀진 게 채워진다면 n-1개를 시작점으로 보고 선택해야 하니까 i-1의 갯수를 선택해야 하고
        //선택한 애 때문에 1개가 못쓰일 수도 있으니까 i-2의 갯수를 선택하는 방법도 포함 돼야 한다.
        dp[i]=(dp[i-2]+dp[i-1])%1000000007;
    }
    //n개인 경우의 계산값을 return
    return dp[n];
}
solution(4);

회고

재귀함수 인 줄 알고 재귀로 풀었는데 모든 경우에서 시간 초과가 났다,,

알고보니 dp로 푸는 문제였다.

지금은 function안에 calculation을 호출해서 쓰는 구조인데, solution 안에서 바로 코드 실행하면 안되나 해서 calculation을 생략했더니 시간이 더 걸리게 되었다.

function solution(n){
    const dp = new Array(n+1).fill(0);
    dp[0]=1;
    dp[1]=1;
    for(let i=2;i<=n;i++){
        dp[i]=(dp[i-2]+dp[i-1])%1000000007;
    }
    return dp[n];
}

calculation을 생략 한 코드이다.

왜 시간이 더 걸리는지 아직 이유는 찾지 못함..


코드

function solution(n, t, m, p){
    let answer = '';
    let all='';
    let num=0;
    //toString함수 사용
    while(all.length<t*m){
        all+=num.toString(n);
        num+=1;
    }
    let ind=p-1;
    while(answer.length<t){
        answer+=all.charAt(ind);
        ind+=m;
    }
    return answer.toUpperCase();
}

회고

반복문으로 하나하나 숫자를 더하고 나눠가며 풀려고 하다가 혹시 유용한 함수가 있는지 찾아보니 toString함수가 있었다.

함수 인자로 숫자를 넣으면 해당 숫자의 진수로 글자를 반환한다.

하나하나 구현하는 연습도 해보면 좋겠지만, 멋진 함수가 있으면 그걸 공부해서 사용하는것도 좋을듯 하다.

0개의 댓글