본문 바로가기

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


import java.util.*;

public class Solution {
    public int solution(int n) {
        int ans = 0;
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        while(true) {
            while(n%2==0) {n/=2;} //짝수인 동안에는 계속 2로 나눔
  
            if(n==1) {ans=list.size()+1;break;} //초기n이 2의 거듭제곱수면 지금까지 한 연산횟수+1을 저장
            else list.add(n); //초기n이 2의 거듭제곱수가 아니면 연산횟수를 list에 저장
        	n--; //짝수가 아니면 1을 빼 짝수로 만듬. **이 값을 '초기n'이라 하겠다.**
        }
        return ans;
    }
}

다른사람의 풀이 보니까 굳이 while문 2개랑 arraylist 안써도 풀수있는것 같았지만 코딩 1달차인 내가 스스로 떠올렸던 풀이는 이렇다.


n이 2의 거듭제곱이면 답이 무조건 1이므로 2의 거듭제곱수가 규칙의 기준이 됩니다.

 

<10>을 예로 들면 <5>에서 한번 텔포한 경우와 같습니다.

<5>를 살펴보면 4까지는 <4>와 일치하고 4->5에서 j를 합니다. ( ∴ ans(5)=2)

따라서 ans(10) = ans (5) =2입니다.

 

짝수라면 2 계속 나누고 홀수라면 1 뺀후 계속 나눠 2 거듭제곱수가 나올 때까지 반복합니다.

2의 거듭제곱수가 나오지 않은 경우 ArrayList list에 연산횟수를 저장해   list.size()+1을 반환합니다. 

내머내공 : 내 머리로 내가 공부했습니다

틀린 내용은 언제든지 알려주세요!!