-
백준 15666번 : N과 M(12)c c++ 언어 공부 2023. 6. 15. 11:23
https://www.acmicpc.net/problem/15666
15666번: N과 M (12)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
Code:
1234567891011121314151617181920212223242526272829303132333435363738394041424344#include <stdio.h>#include <stdlib.h>int numbers[8] = { 0, };int sequence[8] = { 0, };void printSequence(int n, int m, int count, int start) {if (count == m) {for (int i = 0; i < m; i++) {printf("%d ", sequence[i]);}printf("\n");return;}int prev = -1;for (int i = start; i < n; i++) {if (prev != numbers[i]) {sequence[count] = numbers[i];printSequence(n, m, count + 1, i);prev = numbers[i];}}}int compare(const void* a, const void* b) {return (*(int*)a - *(int*)b);}int main() {int n, m;scanf("%d %d", &n, &m);for (int i = 0; i < n; i++) {scanf("%d", &numbers[i]);}qsort(numbers, n, sizeof(int), compare);printSequence(n, m, 0, 0);return 0;}cs 문제풀이:
1. 문제 설명
주어진 N개의 자연수 중에서 M개를 골라서 만들 수 있는 모든 수열을 비내림차순으로 출력하는 문제입니다.
2. 코드 설명
주어진 코드는 재귀 함수를 활용하여 N개의 자연수 중에서 M개의 수열을 생성하고, 오름차순으로 출력하는 과정을 수행합니다.
- 주어진 자연수의 개수 N과 선택할 숫자의 개수 M을 입력받습니다.
- N개의 자연수를 입력받아 numbers 배열에 저장합니다.
- numbers 배열을 오름차순으로 정렬합니다.
- printSequence 함수를 호출하여 수열을 생성하고 출력합니다. printSequence 함수는 다음과 같이 구현됩니다.
- n: 전체 숫자의 개수, m: 선택할 숫자의 개수, count: 현재까지 선택한 숫자의 개수, start: 숫자 선택을 시작할 인덱스
- count가 m과 같아지면, 숫자를 m개 선택한 경우이므로 현재까지 선택한 수열을 출력합니다.
- 중복된 숫자를 제외하기 위해 이전에 선택한 숫자(prev)와 현재 선택한 숫자가 다를 때만 재귀적으로 다음 숫자를 선택하도록 합니다.
- 숫자를 선택할 때마다 count를 증가시키고, 선택한 숫자를 sequence 배열에 저장합니다.
- 재귀 호출을 통해 다음 숫자를 선택하도록 합니다.
- 결과적으로, 주어진 N개의 자연수 중에서 M개를 선택하여 만들 수 있는 모든 오름차순 수열을 출력합니다.
'c c++ 언어 공부' 카테고리의 다른 글
백준 2083번 : 럭비 클럽 (C 언어) (0) 2023.06.19 백준 1235번 : 학생 번호 (C 언어) (0) 2023.06.16 백준 15655번 : N과 M (6) (C 언어) (0) 2023.06.15 백준 2740번 : 행렬 곱셈 (C 언어) (0) 2023.06.14 백준 5543번 : 상근날드 (C 언어) (0) 2023.06.12