🔗 문제 내용
https://www.acmicpc.net/problem/1052
1052번: 물병
지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번
www.acmicpc.net
🌱 문제 풀이 방법
먼저 같은 양의 물이 들어있는 물병 두 개를 고른다. 가 이 문제의 포인트다.
같은 양의 물을 고르기 위해 N개의 물병을 두개로 나눈다.
만약, 이때 2로 안 나눠지다면 물병을 합칠 수 없기 때문에 옮겨야 하는 물병의 개수를 늘린다.
옮겨야 하는 물병이 옮길 수 있는 물병의 개수 K를 넘기면 한번에 옮길 수 없기 때문에 물병을 1개 추가 구매한다.
🤔 공부가 필요한 부분
문제를 이해하는데 시간이 매우 오래 걸렸다...
유연하게 생각하는 훈련이 많이 필요한 것 같다.
문제 푸는걸 도와준 익명의 고라니와 코치님께 감사 인사를 전한다.
+ 2진수로 푸는 방법도 있는데 고민해봐야겠다.
💻 코드
import java.util.*;
import java.io.*;
import java.lang.*;
public class Main {
static int N,K,cnt;
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
cnt = 0;
int temp = N;
boolean flag = true;
while(flag){
if(isBuy(N)) flag = false;
else N+=1;
}
if(N-temp>=0){
System.out.println(N-temp);}
else System.out.println("-1");
}
static boolean isBuy(int n){
int temp=0;
while(n>0){
if(n%2==1){
n/=2;
temp++;
}else n/=2;
}
if(temp<=K){
return true;
}else return false;
}
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[Java] 백준 16922 : 로마 숫자 만들기 (0) | 2023.07.05 |
---|---|
[Java] 백준 1563 : 개근상 (0) | 2023.01.28 |
[Java] 백준 10219 : Meats On The Grill (0) | 2023.01.28 |
[Java] 백준 3190 : 뱀 (0) | 2022.06.25 |
[Java] 백준 13460 : 구슬 탈출 2 (0) | 2022.06.25 |
댓글