백준 15650번 N과 M(2)

honeyricecake·2022년 2월 16일
0

백준

목록 보기
17/30

(1) 처음에 짠 코드

#include <stdio.h>

int main()
{
int N, M;
int i;
scanf("%d %d", &N, &M);
int array[10] = {0};
for (i = 0; i < M; i++)
{
array[i] = i + 1;// 8 4같은 경우 1234로 시작
}
int cur = M - 1;
while (1)
{
for (i = 0; i < M; i++) printf("%d ", array[i]);
printf("\n");
array[M - 1]++;//맨 마지막 칸 ++
while (1)
{
if (array[cur] == cur - M + N + 2) // cur이 M - 1이라 가정 array[cur]의 최댓값은 M - 1 - M + N + 1 즉 N이고 N + 1이면 그 전 칸 + 1로 초기화(?)해야 한다.
{
cur--;
if (cur == -1) break;//cur가 -1이면 break
array[cur]++; array의 특정 칸이 최댓값 + 1이면 그 전 칸들을 + 1
}
else break;
}
if (cur == -1) break;
cur = M - 1;//cur은 다시 M - 1로 초기화
for (i = 0; i < M; i++)
{
if (array[i] == i - M + N + 2)//그 칸의 최댓값 + 1이면
{
array[i] = array[i - 1] + 1;//그 전 칸 + 1로 바꾸기, 이건 맨 첫칸부터 시행하여야 한다.
}
}
}
return 0;
}

(2) 재귀를 이용한 코드

아이디어는 결국 반복문을 동적으로 짤 수는 없으니 재귀함수를 이용하자는 것이다.

#include <stdio.h>

int array[10];

void F(int x, int cur, int M, int N)
{
array[cur - 1] = x;//x값을 cur - 1에 저장
int i;
if (cur == M)//for문을 M회 반복하고 나면 출력
{
for (i = 0; i < M; i++) printf("%d ",array[i]);
printf("\n");
return;
}
else
{
for (i = 1; x + i <= N; i++)
{
F(x + i, cur + 1, M, N);//for문 단계를 하나 높이고 x값을 x + 1부터 N까지 증가
}
}
}

int main()
{
int N, M;
int i;
scanf("%d %d", &N, &M);
for (i = 1; i <= N - M + 1; i++) F(i, 1, M, N);
//N - M + 1 은 N - (M - 1)
return 0;
}

* for문을 동적으로 활용하기 위해 재귀함수를 활용하였다.

0개의 댓글