Problem_Solving

백준(BOJ) 1094 : 막대기 (실버5) / 자바(Java) 풀이

CONCAT 2024. 5. 9. 13:37
728x90

문제

https://www.acmicpc.net/problem/1094

3줄 요약

  1. 막대의 길이 X를 입력받고, 초기 막대의 길이를 64cm로 설정합니다.
  2. 현재 막대의 길이가 X보다 작거나 같으면 막대를 사용하고 count를 증가시키고, 비트 연산자 >>=를 사용하여 막대의 길이를 반으로 줄이는 과정을 X가 0이 될 때까지 반복합니다. (비트 연산자 >>=는 오른쪽 시프트 연산으로, 비트를 오른쪽으로 이동시켜 값을 반으로 줄이는 역할을 합니다. 이는 2의 거듭제곱 형태인 막대의 길이를 효율적으로 처리할 수 있습니다.)
  3. 최종적으로 사용된 막대의 개수 count를 출력합니다. 이 문제에서는 비트마스킹을 활용하여 막대의 길이를 반으로 줄이는 과정을 간단히 구현할 수 있습니다.

코드

package boj1094;

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // 입력 파일에서 데이터 읽기 (테스트용)
        System.setIn(new FileInputStream("src/input.txt"));
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 만들어야 할 막대의 길이 X 입력받기
        int X = Integer.parseInt(br.readLine());
        
        br.close();
        
        // 초기 막대의 길이 (64cm)
        int bar = 64;
        
        // 막대의 개수를 저장할 변수
        int count = 0;
        
        // 막대를 자르면서 X와 같은 길이를 만들 때까지 반복
        while (X > 0) {
            // 현재 막대의 길이가 X보다 작거나 같으면 막대를 사용하고 count 증가
            if (bar <= X) {
                X -= bar;
                count++;
            }
            
            // 막대의 길이를 반으로 줄임 (비트 연산자 사용)
            bar >>= 1;
        }
        
        // 결과 출력
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(Integer.toString(count));
        bw.flush();
        bw.close();
    }
}