반응형
12-01 05:41
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 1094번 : 막대기 본문

Programming/백준

[백준] 1094번 : 막대기

조용한고라니 2021. 3. 25. 20:01
반응형
 

1094번: 막대기

지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대

www.acmicpc.net


[비트마스킹]

정수형 배열을 하나 준비한다. 사이즈는 대충 16이상이면 된다.

배열의 0 번째 원소에 1 << 6(64)를 넣어준다.

이제 인덱스를 1로 올려주고 while을 돌며 문제의 로직을 수행한다.

 

idx 미만의 루프를 돌며 배열 원소들의 합을 구한다.

그 합이 x와 같다면 그 때의 count를 result에 저장한다.

 

for루프를 빠져나와 idx를 증가시키고,

만약 sum > x라면 idx를 감소시킨다.

 

이제 비트 연산자를 이용해

            arr[idx] = (arr[idx-1] >> 1);
            arr[idx-1] = (arr[idx-1] >> 1);

idx번 째와 idx-1번째 원소를 idx-1번째에 있는 원소를 반으로 나눈 값으로 설정한다.

sum == x일 때 까지 반복

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int x = Integer.parseInt(br.readLine());

        int[] arr = new int[1 << 4];
        arr[0] = 1 << 6;

        int idx = 1, result = -1;
        while(true){
            boolean flag = false;

            int sum = 0, cnt = 0;
            for(int i=0; i<idx; i++){
                sum += arr[i];
                cnt++;
                if(sum == x){
                    result = cnt;
                    flag = true;
                }
            }
            if(flag) break;

            idx++;

            if(sum > x)
                idx--;

            arr[idx] = (arr[idx-1] >> 1);
            arr[idx-1] = (arr[idx-1] >> 1);
        }
        System.out.println(result);
    }
}
반응형
Comments