문제
출처 : www.acmicpc.net/problem/1052
지민이는 N개의 물병을 갖고있다. 각 물병에는 물을 무한대로 부을 수 있는데, 처음에 모든 물병에는 물이 1리터씩있다. 지민이는 N개의 물병을 적절히 합쳐 K개이하의 물병으로 만들려하는데, 물병을 합칠때 는 다음 규칙에 따라 합칠수있다.
- 같은 물이 들어있는 물병만 합칠수있다.
이때, 물병을 더 이상 합칠수없다면, 1리터의 물이 들어있는 물병을 추가할수있다. K개 이하의 물병을 만들기위해 추가해야할 최소한의 물병의 개수를 출력하는 문제다.
풀이
시뮬레이션으로 풀리는 문제다.
처음에는 2차원 queue를 선언해서 물병을 하나하나 합쳐서 다음 idx로 넘겨주는 방식으로 구현했는데, 시간초과를 맞았다. 따라서 합치는 과정을 하나하나 합치는게아닌 한번에 해줘야한다.
xL를 담고있는 물병의 갯수를 표현하는 1차원 배열을 만들어준다.
ex)
arr[1] = 3 // 1리터의 물을 담고있는 물병의 갯수가 3개
이때, 물병의 합치는 연산과, 남은 물병 계산은 나누기와 나머지연산으로 가능한데,
같은 L의 물병의 /2 만큼 합쳐서 다음 L로 넘겨줄수있으므로,
1. 합치는 연산 = arr[L+1] += arr[L]/2;
이때, 합치고 남은 물병은 /2로 나누고 남은 나머지 이므로,
2. 남은 물병 계산 = arr[L] %= 2;
이 된다.
위 연산을 사용해서 구현하면되는데,
1. 합칠수있는 물병을 1L ~ NL 까지 전부 합쳐준다.
2. 이때, 남아있는 물병의 수가 K개 이하라면, 출력하고 종료한다.
3. 아니라면, 1L물병을 하나 늘려주고 다시 1번으로 돌아간다.
위 과정을 남아있는 물병의 수가 K개 이하일때까지 반복하면 답이다.
소스코드
https://github.com/devxb/JJUNalgo/blob/master/1052%20%EB%AC%BC%EB%B3%91/main.cpp
'알고리즘 (2020 : 08 : 10 ~ ) > 구현, 시뮬' 카테고리의 다른 글
[백준 / BOJ] 1248 맞춰봐 (0) | 2021.04.04 |
---|---|
[백준 / BOJ] 10875 뱀 (0) | 2021.04.03 |
[백준 / BOJ] 1035 조각 움직이기 (0) | 2021.01.28 |
[백준 / BOJ] 10830 행렬 제곱 (0) | 2021.01.27 |
[백준 / BOJ] 17144 미세먼지 안녕! (0) | 2021.01.25 |