๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1052
๐ฎ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฌธ์ ์์ ๊ฐ์ ์์ด ๋ค์ด์๋ ๋ฌผ๋ณ๋ผ๋ฆฌ ํ๋๋ก ํฉ์น ์ ์๊ณ ์ฒ์์๋ ๋ชจ๋ ๋ฌผ๋ณ์๋ ๋ฌผ์ด 1L๊ฐ ๋ค์ด์๋ค๊ณ ์ ์๋์ด ์๋ค.
์ฒ์๋ถํฐ ๋ ๊ฐ์ ๋ฌผ๋ณ์ ํ ๊ฐ์ ๋ณ์ผ๋ก ํฉ์ณ๊ฐ๋ฉด, 2L → 4L → 8L ์ด๋ฐ์์ผ๋ก ์ฆ๊ฐํ ์ ๋ฐ์ ์๋ค.
์ด๋ ๋ฌผ๋ณ์ด 2์ ์ ๊ณฑ ๊ฐ์ด ๋์ด์ผ ๋ณ์ด ํ๋๋ก ํฉ์ณ์ง๋ ๊ฒ์ ์ ์ ์๋ค.
N๊ฐ์ ๋ฌผ๋ณ์ K๊ฐ์ ๋ฌผ๋ณ์ผ๋ก ํฉ์น๋ ๊ฒฝ์ฐ ์ต์ ๊ฐ์์ ๋ฌผ๋ณ์ ์ฌ๊ธฐ ์ํด์ ๋จ์ ๋ฌผ๋ณ(N) ๋ณด๋ค ์์ผ๋ฉด์ ๊ฐ์ฅ ํฐ 2์ ์ ๊ณฑ ๊ฐ์ ๋งค๋ฒ ๊ตฌํด ๋นผ์ฃผ๋ ์์ ์ K-1๋ฒ ํด์ฃผ๊ณ ,
๊ทธ๋๋ ๋ฌผ๋ณ์ด ๋จ์์๋ค๋ฉด ๋ง์ง๋ง(K๋ฒ์งธ)์๋ ๋จ์ ๋ฌผ๋ณ์ผ๋ก ํ ๋ณ์ ๋ง๋ค์ด์ผ ํ๋ฏ๋ก ๋จ์ ๋ฌผ๋ณ๋ณด๋ค ํฌ๋ฉด์ ๊ฐ์ฅ ์์ 2์ ์ ๊ณฑ๊ฐ์ ๊ตฌํด ๋นผ์ฃผ๋ฉด ์ฌ์ผํ๋ ๋ฌผ๋ณ์ด๋ค.
์๋ฅผ ๋ค์ด N์ด 43 K๊ฐ 3์ด๋ผ๋ฉด , 32๊ฐ๋ก 1๋ณ์ ๋ง๋ค๊ณ , ๋จ์ 11๊ฐ์ ๋ฌผ๋ณ์์ 8๊ฐ๋ก ๋ 1๋ณ์ ๋ง๋ ๋ค. (K-1๋ฒ ์งํ = 2๋ฒ)
๊ทธ๋ฆฌ๊ณ ๋จ์ 3๋ณ์ ํ ๊ฐ์ ๋ณ์ผ๋ก ํฉ์น๊ธฐ ์ํด์ 4๋ณ์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ฉด 1๋ณ์ผ๋ก ๋ง๋ค ์ ์๋ค. ๋ฐ๋ผ์ 4-3์ธ 1๋ณ์ ์ถ๊ฐ๋ก ๊ตฌ๋งคํด์ฃผ๋ฉด ๋๋ค. (๋จ์ 1๋ฒ ์งํ)
๋ง์ฝ K-1๋ฒ ๋ง๋๋ ๋์ค ๋จ์ ๋ฌผ๋ณ์ ๊ฐ์๊ฐ ์๋ ๊ฒฝ์ฐ K๊ฐ ๋ด์์ ๋ชจ๋ ๋ฌผ๋ณ์ ํฉ์น ์ ์๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์ถ๊ฐ๋ก ๊ตฌ๋งคํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ 0์ ๋ฆฌํดํ๋ค.
- K-1๋ฒ ๋ฐ๋ณตํ๋ฉด์ ๋จ์ ๋ฌผ๋ณ๋ณด๋ค ์๊ณ ๊ทธ ์ค ๊ฐ์ฅ ํฐ 2์ ์ ๊ณฑ ๊ฐ์ ๊ตฌํด ์ต๋ํ ๋ง์ ๋ฌผ๋ณ์ ์ด์ฉํด ํ๋์ ๋ฌผ๋ณ์ผ๋ก ๋ง๋ ๋ค.
- ๋ง์ฝ K-1๋ฒ ๋ฐ๋ณตํ๋ฉด์ ๋จ์ ๋ฌผ๋ณ์ด 0๊ฐ๋ผ๋ฉด ๋ชจ๋ ๋ฌผ๋ณ์ด K๊ฐ ์ด๋ด๋ก ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์ถ๊ฐ๊ตฌ๋งค๋ฅผ ํ ํ์๊ฐ ์๋ค. 0์ ๋ฆฌํดํ๋ค.
- ๋ฌผ๋ณ์ด ๋จ์์๋ ๊ฒฝ์ฐ K-1๊ฐ ๋ฌผ๋ณ์ ๋ง๋ค์์ผ๋ฏ๋ก, ๋ง์ง๋ง ๋ฌผ๋ณ์ ๋จ์ ๋ฌผ๋ณ๋ณด๋ค ํฌ๋ฉด์ ๊ฐ์ฅ ์์ 2์ ์ ๊ณฑ๊ฐ์ ๊ตฌํ ๋ค ๋จ์ ๋ฌผ๋ณ์ ๋นผ์ฃผ๋ฉด ๊ตฌ๋งคํด์ผ ํ๋ ๋ฌผ๋ณ ๊ฐ์์ด๋ค.
๐ฉ Java ์ฝ๋
package com.algorithm.Baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_1052_๋ฌผ๋ณ {
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 rst = buyBottle(N, K);
System.out.println(rst);
br.close();
}
private static int buyBottle(int n, int k) {
/**
* 1. K-1๋ฒ ๋๋ฉด์ ๋จ์ ๋ฌผ๋ณ ๋ณด๋ค ์์ 2์ base ์ ๊ณฑ ๊ฐ ๋นผ์ฃผ๊ธฐ (์ต๋ํ ๋ง์ ๋ฌผ๋ณ์ ์ด์ฉํด ํ๋๋ก ๋ง๋ค๊ธฐ)
* 2. ๋ง์ง๋ง์ ํด๋น ์๋ณด๋ค ํฐ 2์ base ์ ๊ณฑ ๊ฐ ๊ตฌํด์ ๋จ์ ๋ฌผ๋ณ ๋นผ์ฃผ๊ธฐ
*/
if(n <= k) return 0;
// 1. K-1๋ฒ ๋๋ฉด์ ๋จ์ ๋ฌผ๋ณ ๋ณด๋ค ์์ 2์ base ์ ๊ณฑ ๊ฐ ๋นผ์ฃผ๊ธฐ (์ต๋ํ ๋ง์ ๋ฌผ๋ณ์ ์ด์ฉํด ํ๋๋ก ๋ง๋ค๊ธฐ)
for (int loop = 0; loop < k - 1; loop++) {
int base = 0;
while (Math.pow(2, base) < n) {
base++;
}
n -= Math.pow(2, base - 1);
// ๋จ์ ๋ฌผ๋ณ์ด ์๋ ๊ฒฝ์ฐ ๋์ด์ ๋ฌผ๋ณ์ ์ด ํ์๊ฐ ์์ผ๋ฏ๋ก return 0
if(n == 0) return 0;
}
// 2. ๋ง์ง๋ง์ ํด๋น ์๋ณด๋ค ํฐ 2์ base ์ ๊ณฑ ๊ฐ ๊ตฌํด์ ๋จ์ ๋ฌผ๋ณ ๋นผ์ฃผ๊ธฐ
int base = 0;
while (Math.pow(2, base) < n) {
base++;
}
return (int) Math.pow(2, base) - n;
}
}
'Algorithm > ๊ทธ๋ฆฌ๋(Greedy)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค, Java] 5186๋ฒ : ํํฐ๋ฅผ ์ด์ด๋ผ!!! (0) | 2022.07.06 |
---|---|
[๋ฐฑ์ค, Java] 10775๋ฒ : ๊ณตํญ (0) | 2022.06.21 |
[ํ๋ก๊ทธ๋๋จธ์ค, Java] ๋จ์์นด๋ฉ๋ผ (0) | 2022.04.28 |
[ย ๋ฐฑ์ค, Java] 1339๋ฒ : ๋จ์ด ์ํ (0) | 2022.04.27 |
[๋ฐฑ์ค, Java] 16120๋ฒ : PPAP (0) | 2022.04.26 |