https://www.acmicpc.net/problem/15665

 

15665번: N과 M (11)

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

www.acmicpc.net


    • 백트래킹으로 유명한 N과 M 시리즈 중 하나이다.
    • 이번에는 각 자릿수마다 중복으로 값 선택이 가능하기 때문에 더 단순하게 각 재귀마다 N 번 반복해주면 된다.
    • 다만 같은 수열을 중복 출력하는 것에 대한 검사가 필요하다.
    • 각 자릿수마다 개별적인 방문 배열을 사용하여 현재 자릿수에서 뽑혔던 값인지를 확인해주자.
    • ios_base::sync_with_stdio 를 사용했음에도 불구하고 시간 초과가 난다. 어이없어.. cstdio 쓰자

#include <cstdio>
#include <algorithm>

using namespace std;

int N, M;
int value[8];
int digit[8];

void pick(int cur)
{
    if(cur == M)                            // 자릿수 전부 다 골랐으면 출력
    {
        for(int i = 0 ; i < M ; i++)
        {
            printf("%d ", digit[i]);
        }
        printf("\n");
        return;
    }

    bool visited[10001] = {false,};         // 이번 자릿수의 중복 방지 배열
    for(int i = 0 ; i < N ; i++)            // 중복이 가능하므로 모든 가능한 값들을 탐색
    {
        if(visited[value[i]]) continue;     // 이전에 이미 검사됐던 값이면 스킵
        visited[value[i]] = true;
        digit[cur] = value[i];              // 현재 자릿수에 값을 넣어주고
        pick(cur + 1);                      // 다음 자릿수 재귀적으로 고름
    }
}

int main(void)
{
    scanf("%d %d", &N, &M);
    for(int i = 0 ; i < N ; i++)
    {
        scanf("%d", &value[i]);
    }
    sort(value, value+N);                   // 사전 순 출력을 위한 값 정렬

    pick(0);
}

'PS > BOJ' 카테고리의 다른 글

[백준] 11265 : 끝나지 않는 파티  (0) 2021.06.07
[백준] 17396 : 백도어  (0) 2021.06.06
[백준] 12886 : 돌 그룹  (0) 2021.06.03
[백준] 21758 : 꿀 따기  (0) 2021.05.31
[백준] 9466 : 텀 프로젝트  (0) 2021.05.30

+ Recent posts