본문 바로가기
코딩테스트

[백준] 1052번 '물병' - Java

by CuckooBird 2024. 8. 27.

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


문제


풀이

n을 비트로 나타내어 1의 개수가 하나의 병이라고 보면 됩니다.

만약 13이라고 한다면, 

1101 이니 3개의 병에 담겨 있겠죠. k=2 이므로 1의 개수가 2 이하이어야 합니다.

n을 1씩 더하여 비트 1의 개수가 k보다 작거나 같다면 수행을 중지시켜서 cnt를 알아냅니다.

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		
		int ans = solution(n, k);
		System.out.println(ans);
	}
	
	public static int solution(int n, int k) {
		int ans = 0;
		while(Integer.bitCount(n) > k) {
			n ++;
			ans ++;
		}
		return ans;
	}
}

 

https://github.com/kwakminjung/BOJ/commit/b26366532054ec06098bf492f04ae8a674530277

 

✨feat: [골드5] 물병 1052번 : 수학, 그리디 알고리즘, 비트마스킹 · kwakminjung/BOJ@b263665

백준 1052번 : 물병 (골드5) 알고리즘 분류 : 수학, 그리디 알고리즘, 비트마스킹 풀이 : https://cuckoobird.tistory.com/208 결과 : 맞았습니다 (메모리 14308KB | 시간 108ms)

github.com

 


회고

-1 예외 처리를 안 했는데 맞는 걸 보면 예외적인 경우가 없는 걸까요? 나중에 재체점 될 것 같기도..