728x90
개요
문제 링크
골드 5, Greedy
배열에 K씩 더해서 1부터 N까지 구성 가능한지 여부 출력하기
접근
그리디한 인간이 되어보자. 우선 1부터 N까지의 수의 개수를 세어주는 것이 필요하다. 그리고 모든 수의 개수가 1이 되면 1을 출력해주면 된다.
K를 더한다 라고 생각하기보다 자신보다 K작은 수를 하나 뺏어온다 생각하자. 만약 없다면? 2K작은 수를 뺏어온다. 이렇게 위에서부터 찾아보며 2번 이상 등장한 값이 있으면 뺏어오면 된다.
이게 왜 그리디한 최적이냐?하면 아래 예시를 보자.
7 1 1 2 3 3 5 5 7 -> 1 2 3 5 5 6 7 (X) -> 1 2 3 3 5 6 7 (O)
만약 6이 3을 뺏어서 6을 만들어 버리면 4가 가져올 것이 없다. 대신 5를 하나 뺏어와야 배열을 구성할 수 있다.
Pseudo code
count = 숫자갯수
for (i = n~1)
if (count[i] = 0)
for (j = n-k ~ 1)
if (count[j] > 1)
// 하나 뺏어온다.
count[j]--, count[i]++
Source code
#include <iostream>
using namespace std;
int a[51], n,k,x;
bool check() {
for (int i=1; i<=n; i++)
if (a[i]!=1)
return 0;
return 1;
}
int main() {
cin>>n>>k;
for (int i=0; i<n; i++)
cin>>x, a[x]++;
for (int i=n; i>k; i--)
if (!a[i])
for (int j=i-k; j>=1; j-=k)
if (a[j]>1) {
a[j]--, a[i]++;
break;
}
cout << check();
}
728x90
'백준브실골 > Greedy' 카테고리의 다른 글
백준 25091, Chain Reactions (0) | 2023.06.22 |
---|---|
백준 16207, 직사각형 (2) | 2023.05.10 |
백준 27192, Pick a Pair (0) | 2023.05.04 |
백준 18513, 샘터 (0) | 2023.04.05 |
백준 1036, 36진수 (0) | 2023.02.20 |
백준 7775, 최종 순위 (0) | 2023.02.19 |
백준 2812, 크게 만들기 (0) | 2023.02.11 |
백준 1132, 합 (0) | 2023.02.11 |
댓글