AP 프로그래밍
8. codeup 2608 : 동아리 회장 선거 문제 해결
Quettabyte
2023. 5. 28. 19:42
이번 글에서는 코드업 2608번 문제인 동아리 회장 선거 문제를 해결해 봅시다.
문제의 내용은 다음과 같은데요
다음과 같이 알고리즘을 설계해 보았습니다. 사람 수 n이 주어지면 배열에 우선 O부터 저장하기 시작합니다. O를 계속 저장하다 보면 사람 수 만큼 O가 배열에 저장되었을 것입니다. 그러면 그것이 하나의 경우의 수가 완성된 것이고 이제부터는 O의 갯수를 하나씩 줄여가며 그 자리에 X를 추가해주는 것입니다. 또 그다음은 O를 저장하고 다음은 O를 제거하고 X를 추가하고... 이러한 작업을 반복하다 보면 모든 경우의 수가 나오게 될것입니다.
이러한 반복적인 작업은 재귀적으로 표현할 수 있을 것 같아 재귀함수로 표현해 보았습니다.
#include <stdio.h>
char arr[7]; //문자열 저장 배열
void f(int a, int n){ //함수
if(a==n){ //문자의 수가 사람수와 같아지면 출력
for(int i=0;i<n;i++)
printf("%c", arr[i]);
printf("\n");
return; //이전 재귀로 복귀
}
arr[a]='O'; //O부터 추가
f(a+1,n);
arr[a]='X'; //그다음 X 추가
f(a+1,n);
}
int main(){
int n;
scanf("%d",&n);
f(0, n); //배열의 0번 인덱스부터 저장
}
f 라는 함수를 선언하였습니다. main 함수에서 0을 인자로 주면 0번 인덱스부터 O가 차곡차곡 쌓이게 됩니다. 이때에는 a+1을 인자로 전달하여 인덱스가 하나씩 증가하도록 하였습니다. 이게 사람수와 같아지면 return 함수를 사용하여 이전 재귀로 복귀하도록 하였습니다. 그러면 복귀한 인덱스에는 X가 채워지게 되고 그 후 함수를 호출하여 O,X가 채워지는 작업이 재귀적으로 실행됩니다.
예를 들어 n=2일때
O
OO -> O로 복귀
OX -> 로 복귀
XO-> X로 복귀
XX
이 순으로 실행되게 됩니다.
지금 보니 n을 그냥 전역변수로 선언해도 괜찮을것 같다는 생각이 드네요.
오늘은 여기서 글을 마치겠습니다. 감사합니다.