작성
·
80
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
이거 재귀함수를 외우라고 하셨는데
swap 함수 부분이 이해가 잘 안갑니다ㅜ 이게 배열 내에 있는 원소들을 하나씩 스왑하고 makePermutation하고 다시 원위치로 스왑하는건가요?
void makePermutation(int n, int r, int depth)
{
if(r == depth)
{
//solve();
print();
return;
}
for(int i = depth; i < n; ++i)
{
swap(a[i], a[depth]);
makePermutation(n, r, depth +1);
swap(a[i], a[depth]);
}
}
답변 2
1
안녕하세요, 인프런 AI 인턴입니다.
허니잼님께서 주신 질문의 핵심은 재귀함수 내에서 swap
함수의 역할과 작동 원리에 관한 것으로 보입니다. swap
함수는 배열 내의 원소들을 교환하는 과정에서 중요한 역할을 합니다. 답변을 통해 질문자님의 궁금증을 해소해보려 합니다.
재귀함수를 이용한 순열 생성 과정에서, swap
함수는 배열의 원소들을 교환하여 모든 순열을 생성하는 기본적인 도구입니다. 여기에서 질문하신 swap(a[i], a[depth]);
부분은 해당 깊이(depth)에서 가능한 모든 순열을 구하기 위해, 현재 깊이(depth)의 위치에 있는 원소와 그 이후 위치(i)에 있는 배열의 모든 원소를 교체합니다.
이 과정은 두 가지 주요 목적을 달성합니다:
1. 순열 생성: 첫 번째 swap(a[i], a[depth]);
은 현재 위치에서 가능한 모든 선택을 시도하여 순열을 생성합니다.
2. 원상복구: 두 번째 swap(a[i], a[depth]);
은 함수의 다음 호출을 위해 배열을 원래 상태로 복구합니다.
다음은 이에 대한 적절한 설명을 포함한 기존 답변 링크입니다:
swap
함수의 두 번째 호출이 왜 필요한지에 대해 설명합니다 (원상태로 복구하기 위함).그리고 강의 swap 질문에서 강사님은 swap
작용 후 재귀함수 호출 과정을 자세히 설명합니다. 이 과정에서 swap -> make 호출 -> 그 내부의 for문으로 들어가서 -> 다시 swap -> make 호출
이 이루어진다는 것을 확인할 수 있습니다.
위의 설명이나 링크가 질문자님의 궁금증을 해소하는 데 도움이 되었기를 바랍니다. 재귀함수와 swap
함수의 사용법을 이해하는 것은 알고리즘 문제 해결 과정에서 매우 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
안녕하세요 허니님 ㅎㅎ
#include <iostream>
using namespace std;
int a[9];
int main() {
for(int i : a)cout << i << " ";
return 0;
}
이부분은 잘 동작합니다. ㅎㅎ
혹시 동작안하는 코드 전체 공유가능하실까요?
감사합니다.
넵
#include <bits/stdc++.h>
using namespace std;
int a[9];
int n = 9, r = 7;
void solve()
{
int sum = 0;
for(int i = 0; i < r; ++i)
{
sum += a[i];
}
if(sum == 100)
{
sort(a, a+7);
for(int i = 0; i < r; ++i)
{
cout << a[i] << "\n";
}
exit(0);
}
}
void makePermutation(int n, int r, int depth)
{
if(r == depth)
{
solve();
return;
}
for(int i = depth; i < n; ++i)
{
swap(a[i], a[depth]);
makePermutation(n, r, depth +1);
swap(a[i], a[depth]);
}
}
int main()
{
for(int i : a)
{
cin >> i;
}
makePermutation(n, r, 0);
return 0;
}
네네 컴파일은 잘됩니다. 요지는 백준에서 틀렸다고 하는것인데 차이가 그럼 없는걸까요?
int a[9]를
for(int i : a)
{
cin >> i;
}
이 루프형태 for문을 쓰면 백준에서 틀리다고 채점하고
for(int i = 0; i < (sizeof(a)/sizeof(*a)); ++i)
{
cin >> a[i];
}
이렇게 풀어쓰면 맞다고 채점해서요.
안녕하세요 허니잼님 ㅎㅎ
제출했던 틀린 코드, 맞는 코드 링크 부탁드립니다.
확인 후 다시 답변드리겠습니다.
링크는 0주차 : 질문하는 방법 참고 부탁드립니다.
감사합니다.
안녕하세요 허니잼님 ㅎㅎ
해당 부분은 값복사이기 때문에 그런 것 같습니다.
for(int i : a) 에서 i는 그저 배열 a로부터 참조값이 아닌 값복사로 가져오기 때문에 해당 값을 변경하려고 하니 -> 틀렸습니다가 뜨는데요. 이렇게 참조형태로 가져와서 -> 변경 하시면 됩니다.
#include <bits/stdc++.h>
using namespace std;
int a[9];
int n = 9, r = 7;
void solve() {
int sum = 0;
for (int i = 0; i < r; ++i) {
sum += a[i];
}
if (sum == 100) {
sort(a, a + 7);
for (int i = 0; i < r; ++i) {
cout << a[i] << "\n";
}
exit(0);
}
}
void makePermutation(int n, int r, int depth) {
if (r == depth) {
solve();
return;
}
for (int i = depth; i < n; ++i) {
swap(a[i], a[depth]);
makePermutation(n, r, depth + 1);
swap(a[i], a[depth]);
}
}
int main() {
for(int &i : a) cin >> i;
makePermutation(n, r, 0);
return 0;
}
감사합니다.
위에 질문은 AI 덕분에 이해했습니다. 한가지 더 있는데
int a[9]를
for(int i : a)
{
cin >> i;
}
이렇게하면 백준에서 틀렸다고하는것 같은데 루프형태에서 뭔가 차이가 있는걸까요?