[자료구조] 알고리즘

[프로그래머스] 점프와 순간이동 (DP_JAVA)

콩지연 2023. 11. 23. 21:04

문제를 보고 dp인줄은 생각하고 있었는데,

풀이과정이 안떠오르다가

노트에 끄적이니까 문득 떠올라서 푼 문제!

 

 


문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/12980

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 


설계

 

 

알고리즘 설계 [접근 방법] : DP 사용

이 경우는 dp로 풀었다.

처음에 풀이 방법은 모든 testcase를 맞추었지만, 시간초과와 메모리초과가 발생했다.

그래서 시간 단축과 메모리 단축을 계속 생각했고 2번째 풀이를 생각했다.

 

첫 번째풀이 : 메모리초과

1. 배열을 크키 n+1로 지정한 한다.

2. 인덱스가 짝수이면 인덱스/2한 값을 그대로 부여하고,

3. 인덱스가 홀수이면 인덱스/2한 값 +1을 배열 값에 부여한다.

4. 배열[n]값을 반환한다

: n 크기의 배열을 만들고 1부터 n까지 반복문을 실행하니 시간초과와 메모리 초과가 발생했다.

 

 

두 번째 풀이 : DP

1. n값이 2보다 작거나 같을 때까지 반복문을 실행한다.

2. n%2한 값이 0이라면 넘어가고,

3. n%2한 값이 1이라면 ans를 +1해준다.

4. ans 값을 반환한다.

: n/2를 하며 반복문을 진행하니 횟수가 크게 줄었고, 배열을 사용하지 않았다.

 

 


코드

 

[첫 번째 풀이]

import java.util.*;

public class Solution {
    public int solution(int n) {
        
        /*
        answer[1]은 무조건 점프를 해야하므로 1이다.
        answer[1]에서 1만큼 순간이동하면 되므로 answer[2]의 값도 1이 된다.
        */
        
        if(2<n) {
            int[] answer = new int[n+1];
        
            answer[1]=1;
            answer[2]=1;

            //3부터 n까지 반복문 실행
            for(int i=3; i<answer.length; i++){
                if(i%2==1) answer[i]=answer[(i/2)]+1;
                else answer[i]=answer[(i/2)];
            }

            int ans = answer[n];
            return ans;
        }
        
        //만약 n이 1과 2라면, 1반환
        return 1;
    }
}

 

 

[두번째 풀이]

import java.util.*;

public class Solution {
    public int solution(int n) {
        
        int ans=1;
        while(2<=n){
            if(n%2==1) ans+=1;
            n/=2;
        }

        return ans;
    }
}

 

 

(❁´◡`❁)

끝!