본문 바로가기

코딩/백준 BOJ

[백준/C언어] 15652번 - N과 M (4)

백준 웹사이트 "15652번 - N과 M (4)" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

15652번: N과 M (4)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net


소스 코드

#include <stdio.h>

void search(int * arr, int count, int N, int M);

int main(void){
    int N, M;
    scanf("%d %d", &N, &M);

    int arr[M];
    search(arr, 0, N, M);
}

void search(int * arr, int count, int N, int M){
    if(count==M){
        //print arr
        for(int i=0; i<M; i++){
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
    else{
        int prev = 1;
        if(count>0)
            prev = arr[count-1];

        for(int i=prev; i<=N; i++){
            arr[count] = i;
            search(arr, count+1, N, M);
        }
    }
}

문제 풀이

  주어진 조건을 만족하는 수열을 모두 출력하는 문제입니다. 앞선 문제 15651번과 매우 비슷하지만, 고른 수열이 비내림차순이라는 조건이 추가되었습니다. 이에 따라 'search' 재귀함수의 실행문을 알맞게 수정합니다.

  'search' 재귀함수는 다음과 같이 정의합니다.

함수: search(int * arr, int count, int N, int M)

파라미터
- arr : 출력할 수열 (재귀를 통해 값들을 채움)
- count : 재귀 반복 횟수, 또는 배열 arr에 값을 채운 횟수
- N : 채우는 자연수의 범위 (1부터 N까지 자연수 중에서 고름)
- M : 출력할 수열의 길이

Base Case (기본 케이스)
- 조건문: count == M
- 실행문: 배열 arr 출력

Recursive Case (재귀 케이스)
- 조건문: count != M (count가 M보다 작을 경우)
- 실행문: 현재까지 배열 arr의 마지막 숫자 확인, 이보다 크거나 같은 자연수 중 범위 내 자연수가 있다면 선택하여 arr에 추가, 재귀
- 재귀: search(arr, count+1, N, M)

 

  아래는 백준 웹사이트 "15651번 - N과 M (3)" 문제풀이 링크입니다.

 

[백준/C언어] 15651번 - N과 M (3)

백준 웹사이트 "15651번 - N과 M (3)" 문제풀이입니다. 언어는 C언어입니다. (제출 언어: C99) 문제 15651번: N과 M (3) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러

loding.tistory.com

 

반응형