ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 문제집] N과 M (시리즈)
    C 프로그래밍/BOJ 2022. 9. 8. 23:15
    728x90

    https://www.acmicpc.net/workbook/view/2052

     

    문제집: N과 M (시리즈)

     

    www.acmicpc.net

    [백준 15649] N과 M (1) 

    // 순열
    #include <cstdio>
    int N, M;
    bool flag[8 + 2];
    int choice[8 + 2];
    
    void Permu(int n)
    {
    	if (n == M) {
    		for (int i = 0; i < M; i++) printf("%d ", choice[i]);
    		printf("\n");
    		return;
    	}
    	for (int i = 1; i <= N; i++) {
    		if (flag[i]) continue;
    		choice[n] = i;
    		flag[i] = true;
    		Permu(n + 1);
    		flag[i] = false;
    	}
    }
    
    
    int main()
    {
    	scanf("%d %d", &N, &M);
    	Permu(0);
    	return 0;
    }

     

    [백준 15650] N과 M (2) 

    // 조합
    #include <cstdio>
    int N, M;
    int choice[8 + 2];
    
    void Combi(int n, int s)
    {
    	if (n == M) {
    		for (int i = 0; i < M; i++) printf("%d ", choice[i]);
    		printf("\n");
    		return;
    	}
    	for (int i = s; i <= N; i++) {
    		choice[n] = i;
    		Combi(n + 1, i + 1);
    	}
    }
    
    int main()
    {
    	scanf("%d %d", &N, &M);
    	Combi(0, 1);	//0번째 뎁스, 1부터 시작
    	return 0;
    }

     

    [백준 15651] N과 M (3) 

    #include <cstdio>
    int N, M;
    int choice[7 + 2];
    
    void Rep_Permu(int n)
    {
    	if (n == M) {
    		for (int i = 0; i < M; i++) printf("%d ", choice[i]);
    		printf("\n");
    		return;
    	}
    	for (int i = 1; i <= N; i++) {
    		choice[n] = i;
    		Rep_Permu(n + 1);
    	}
    }
    
    
    int main()
    {
    	scanf("%d %d", &N, &M);
    	Rep_Permu(0);
    	return 0;
    }

     

    [백준 15652] N과 M (4) 

    // 중복조합
    #include <cstdio>
    int N, M;
    int choice[8 + 2];
    
    void Rep_Combi(int n, int s)
    {
    	if (n == M) {
    		for (int i = 0; i < M; i++) printf("%d ", choice[i]);
    		printf("\n");
    		return;
    	}
    	for (int i = s; i <= N; i++) {
    		choice[n] = i;
    		Rep_Combi(n + 1, i);
    	}
    }
    
    int main()
    {
    	scanf("%d %d", &N, &M);
    	Rep_Combi(0, 1);	// 0번째 뎁스, 1번 부터 고른다
    	return 0;
    }

     

    [백준 15654] N과 M (5) 

    // 순열
    #include <cstdio>
    #include <algorithm>
    int N, M;
    int num[8 + 2];
    int choice[8 + 2];
    bool flag[8 + 2];
    
    void input(void)
    {
    	scanf("%d %d", &N, &M);
    	for (int i = 0; i < N; i++) scanf("%d", &num[i]);
    
    	// 오름차순 정렬
    	std::sort(num, num + N);
    }
    
    
    void Permu(int n)
    {
    	if (n == M) {
    		for (int i = 0; i < M; i++) printf("%d ", choice[i]);
    		printf("\n");
    		return;
    	}
    
    	for (int i = 0; i < N; i++) {
    		if (flag[i]) continue;
    		choice[n] = num[i];
    		flag[i] = true;
    		Permu(n + 1);
    		flag[i] = false;
    	}
    
    }
    
    
    
    int main()
    {
    	input();
    	Permu(0);
    	return 0;
    }

     

    [백준 15655] N과 M (6) 

    // 조합
    #include <cstdio>
    #include <algorithm>
    int N, M;
    int num[8 + 2];
    int choice[8 + 2];
    
    void input(void)
    {
    	scanf("%d %d", &N, &M);
    	for (int i = 0; i < N; i++) scanf("%d", &num[i]);
    	
    	// 오름차순 정렬
    	std::sort(num, num + N);
    }
    
    void Combi(int n, int s)
    {
    	if (n == M) {
    		for (int i = 0; i < M; i++) printf("%d ", choice[i]);
    		printf("\n");
    		return;
    	}
    	for (int i = s; i < N; i++) {
    		choice[n] = num[i];
    		Combi(n + 1, i + 1);
    	}
    }
    
    
    int main()
    {
    	input();
    	Combi(0, 0);	// 0번째 뎁스, 0번째 인덱스
    	return 0;
    }

     

    [백준 15656] N과 M (7) 

    // 중복순열
    #include <cstdio>
    #include <algorithm>
    int N, M;
    int num[7 + 2];
    int choice[7 + 2];
    
    void input(void)
    {
    	scanf("%d %d", &N, &M);
    	for (int i = 0; i < N; i++) scanf("%d", &num[i]);
    
    	// 오름차순 정렬
    	std::sort(num, num + N);
    }
    
    void Rep_Permu(int n)
    {
    	if (n == M) {
    		for (int i = 0; i < M; i++) printf("%d ", choice[i]);
    		printf("\n");
    		return;
    	}
    	for (int i = 0; i < N; i++) {
    		choice[n] = num[i];
    		Rep_Permu(n + 1);
    	}
    }
    
    
    int main()
    {
    	input();
    	Rep_Permu(0);
    	return 0;
    }

     

    [백준 15657] N과 M (8) 

    // 중복조합
    #include <cstdio>
    #include <algorithm>
    int N, M;
    int num[8 + 2];
    int choice[8 + 2];
    
    
    void input(void)
    {
    	scanf("%d %d", &N, &M);
    	for (int i = 0; i < N; i++) scanf("%d", &num[i]);
    
    	// 오름차순 정렬
    	std::sort(num, num + N);
    }
    
    void Rep_Combi(int n, int s)
    {
    	if (n == M) {
    		for (int i = 0; i < M; i++) printf("%d ", choice[i]);
    		printf("\n");
    		return;
    	}
    	for (int i = s; i < N; i++) {
    		choice[n] = num[i];
    		Rep_Combi(n + 1, i);
    	}
    }
    
    
    int main()
    {
    	input();
    	Rep_Combi(0, 0);
    	return 0;
    }
    728x90

    댓글

Designed by Tistory.