알고리즘/백준

1094_막대기

베리영young 2024. 10. 24. 00:31

사용 알고리즘: 구..현?

사용 언어: java

 

package week21;

import java.util.*;
import java.io.*;
public class Main_bj_1094_막대기 {
	static int[] powerOf2 = new int[7]; //2^6 = 64

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int x = sc.nextInt(); //만들어야 하는 막대 길이
		
		int ans = 0;
		if(x > 64)
			System.out.println(-1);
		else {
			for(int i=6; i>=0; i--) {
				powerOf2[i] = (int) Math.pow(2, 6-i);
			}
			//System.out.println(Arrays.toString(powerOf2));
			
			int lastIdx = 6;
			while(x > 0) {
				while(true) {
					if(x >= (int) Math.pow(2, lastIdx) && powerOf2[lastIdx] > 0)
						break;
					lastIdx--;
				}
				
				x -= (int) Math.pow(2, lastIdx);
				ans++;
			}
			
			System.out.println(ans);
		}
	}

}

 

64 =>1개
32 32 =>2개
16 16 16 16 =>4개
8 8 => 8개
4 4 => 16개
2 2 => 32개
1 => 64개

7사이즈의 배열: 0~6인덱스

48 = 32 + 16
23 = 16 + 4+2 + 1

 

==> 이 문제를 읽어보면 결국, 64 이하의 수를 이진수를 표현해 나타내는 것이고, 이진수로 표현했을 떄 1의 개수를 구하는 것이다.