inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

재귀를 이용한 순열 코드 질문

해결된 질문

298

cho766

작성한 질문수 26

0

재귀를 이용한 순열 코드를 학습하면서 이와 관련된 백준 문제를 풀어보려고 하였습니다!

백준 15649 N과 M(1) 문제 같은 경우 순열을 출력하는 문제여서 학습한 코드를 사용하면

가능할 것이라고 생각했습니다. 그런데 교안에 있는 코드는 순열의 오름차순이 보장이

안되는 것 같습니다. 교안에 있는 코드를 최대한 활용해서 백준 15649번 문제를 풀고 싶은데, 순서가 오름차순이 되도록 순열을 출력하려면 교안의 코드를 어떻게 수정해야 할지 모르겠습니다!

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

 

c++ 코딩-테스트

답변 2

0

큰돌

안녕하세요 766님ㅎㅎ

죄송하지만 강의에서 설명하는 문제 외에는 답변을 드리지 않고 있습니다.

다만 제가 이 문제를 푼 코드는 다음과 같습니다.

참고부탁드립니다.

#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<string>
#include<iostream> 

using namespace std;    
int N, R;  
int a[9], visited[9];
void go(int index, int n, int r){
    if(r == 0){
        for(int i = 0; i < R; i++){
            printf("%d ", a[i]);
        }
        printf("\n");
        return; 
    }

    for(int i = 1; i <= N; i++){
        if(visited[i]) continue;  
        a[index] = i;
        visited[i] = 1; 
        go(index + 1, n, r - 1); 
        visited[i] = 0; 
    }
    return;
}
int main(){
    scanf("%d %d", &N, &R);
    go(0, N, R);  
    return 0; 
}

 

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

재귀를 이용한 순열 코드를 학습하면서 백준 15649번 N과 M(1) 문제를 해결하기 위해 교안의 코드를 사용하려고 하던데요, 순서가 오름차순으로 출력하기 위해서는 교안의 코드를 수정해야 할 것입니다.

교안의 코드를 한 번 살펴보면, Permutation 함수에서 매개변수로 순열의 시작 인덱스 idx와 마지막 인덱스 n이 들어가게 되는데요, 이때 시작 인덱스가 n일 경우 순열을 완성한 것으로 보고 출력하게 됩니다. 하지만 이렇게 작성된 코드는 순열의 오름차순이 보장되지 않습니다.

따라서, Permutation 함수 내에서 순서가 오름차순이 되도록 코드를 수정해야 합니다. 이를 위해서는 Permutation 함수 내에서 for문으로 배열을 돌 때, 시작 인덱스인 idx부터 n까지가 아니라, idx부터 n까지 출력할 때마다 idx 값을 1 증가시키는 방법을 이용하면 됩니다. 이렇게 수정된 코드를 실행하면, 오름차순으로 순열이 출력될 것입니다.

아래는 수정된 코드 예시입니다.

def Permutation(arr, idx, n):
    if idx == n:
        print(' '.join(map(str, arr)))
        return
    for i in range(idx, n):
        arr[i], arr[idx] = arr[idx], arr[i]
        Permutation(arr, idx+1, n)
        arr[i], arr[idx] = arr[idx], arr[i] # 원래대로 돌려놓기

N, M = map(int, input().split())
lst = [i+1 for i in range(N)]
Permutation(lst, 0, M)

이렇게 수정된 코드를 참고해 보시고, 문제를 해결해보세요! 좋은 결과 얻으시길 바랍니다.

5-B

0

9

2

4 - A

0

32

2

코딩살구클럽 입장이 안됩니다

0

79

2

4-F 경우의 수 질문입니다.

0

35

2

코딩살구클럽 가입이 안됩니다.

0

81

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

61

1

교안 158페이지 문의드립니다

0

46

2

코딩살구클럽 관련 건의사항

0

119

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

45

1

진행 방법 질문드립니다!

0

82

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

64

2

2주차 개념#12 트리 순회

0

33

2

백준사이트가 종료된다고 합니다.

0

318

2

백준 서비스 종료

9

953

1

sk 하이닉스 코테 대비

0

388

2

3-G 최댓값 질문

0

54

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

66

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

4-H 질문 있습니다 (코드 리뷰)

0

69

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

186

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

73

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

66

2