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을 반환합니다.
'CodingTest' 카테고리의 다른 글
[Java] 프로그래머스 레벨 2 #n^2 배열 자르기 (0) | 2024.02.21 |
---|---|
[Java] 프로그래머스 레벨2 #괄호 회전하기 (0) | 2024.02.20 |
[Java] 프로그래머스 레벨 2 #연속 부분 수열 합의 개수 (0) | 2024.02.17 |
[Java] 프로그래머스 레벨 2 #귤 고르기 (getOrDefault 중복값 세기, 메소드 참조) (1) | 2024.02.15 |
[Java] 프로그래머스 레벨 2 #예상 대진표 (1) | 2024.02.07 |