-
[백준 1052] 물병 (Kotlin 풀이)자료구조 & 알고리즘/BOJ 문제풀이 2022. 1. 5. 15:07
1.문제
지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번에 K개의 물병을 옮길 수 있다. 하지만, 지민이는 물을 낭비하기는 싫고, 이동을 한 번보다 많이 하기는 싫다. 따라서, 지민이는 물병의 물을 적절히 재분배해서, K개를 넘지 않는 비어있지 않은 물병을 만들려고 한다.
물은 다음과 같이 재분배 한다.
먼저 같은 양의 물이 들어있는 물병 두 개를 고른다. 그 다음에 한 개의 물병에 다른 한 쪽에 있는 물을 모두 붓는다. 이 방법을 필요한 만큼 계속 한다.
이런 제약 때문에, N개로 K개를 넘지않는 비어있지 않은 물병을 만드는 것이 불가능할 수도 있다. 다행히도, 새로운 물병을 살 수 있다. 상점에서 사는 물병은 물이 1리터 들어있다.
예를 들어, N=3이고, K=1일 때를 보면, 물병 3개로 1개를 만드는 것이 불가능하다. 한 병을 또다른 병에 부으면, 2리터가 들어있는 물병 하나와, 1리터가 들어있는 물병 하나가 남는다. 만약 상점에서 한 개의 물병을 산다면, 2리터가 들어있는 물병 두 개를 만들 수 있고, 마지막으로 4리터가 들어있는 물병 한 개를 만들 수 있다.
2. 입력
첫째 줄에 N과 K가 주어진다. N은 107보다 작거나 같은 자연수이고, K는 1,000보다 작거나 같은 자연수이다.
3. 출력
첫째 줄에 상점에서 사야하는 물병의 최솟값을 출력한다. 만약 정답이 없을 경우에는 -1을 출력한다.
4. 포인트
-
- 비트 마스킹 개념을 사용함
- count 함수 내부를 람다로 처리함 // 람다 및 코틀린에 대한 공부가 시급함을 다시 느겼다.
4. 문제 풀이
여러 방법중 비트마스킹으로 푸는 것이 간단했다. 처음 보는 유형이라 생소했지만 비트 마스킹 개념을 알게되어 비슷한 유형을 다시 만나면 잘 풀 수 있을 것 같다
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) { val st = StringTokenizer(readLine(), " ") var N = st.nextToken().toInt() var K = st.nextToken().toInt() var needBottle = 0 while (true) { val binArr = Integer.toBinaryString(N) val cnt = binArr.count { ele: Char -> ele == '1' } //println(cnt) if (cnt <= K) { break } N++ needBottle++ } println(needBottle) }
'자료구조 & 알고리즘 > BOJ 문제풀이' 카테고리의 다른 글
[백준 10757] 큰 수 A+B(Kotlin 풀이) (0) 2022.01.11 [백준 1406] 에디터 (Kotlin 풀이) (0) 2022.01.11 [백준 14888 ] 연산자 끼워넣기 (python 풀이) (0) 2021.10.19 [백준 12865] DP 유형 : 01타일(python 풀이)01타일 (0) 2021.10.04 [백준 1904] DP 유형 : 01타일(python 풀이)01타일 (0) 2021.09.29 -