c언어로 부분집합을 모두 구현하는 함수를 만들던 도중에 다음과 같은 일이 벌어졌습니다.

조회수 531회

C언어를 공부 중인 학생입니다.

C언어를 이용해서 부분집합을 전부 출력하는 프로그램을 만들던 도중에 곤란함을 겪고 있어서 다음과 같이 질문을 드리러 왔습니다.

제가 원하던 결과값은 다음과 같습니다.

A집합을 입력하세요:afz
0:
1:a f z
2:af az fz
3:afz

이런 식으로 말이죠. 하지만 제가 만든 코드대로 하면은

A집합을 입력하세요:afz
0:
1:  a  f     z
2:       af      az   fz
3:                  afz

이런식으로 공백이 너무 과도하게 많이 나옵니다. 아무래도 for문을 돌리면서 공백을 계속해서 생성하게 만들어서 일어난 일인 것 같은데 문제는 어떤 식으로 제어를 해야 제가 원하는 예상값처럼 깔끔하게 나올 수 있는지를 모르겠습니다. 그래서 이렇게 질문을 드립니다. 어떻게 수정을 해야 제가 원하는대로 깔끔하게 나올까요?

#include <stdio.h> 
#include <string.h>
#include <math.h> 
#define MAX 1000

char ary[MAX] = {0};

unsigned int countSetBits(unsigned int n)
{
    unsigned int count = 0;
    while (n) {
        count += n & 1;
        n >>= 1;
    } 
    return count;
}

void printPowerSet(char *set, int set_size)
{
    unsigned int pow_set_size = pow(2, set_size);
    int counter, j, k;

    for(counter = 0; counter <= set_size; counter++)
    {
        printf("%d:", counter);

        for(j = 0; j < pow_set_size; j++)
        {
            for(k = 0; k < set_size; k++)
            {
                if(j & (1<<k))
                {
                    if(countSetBits(j<<k) == counter)
                    {
                        printf("%c", set[k]);
                    }
                }
            }printf(" ");
        }printf("\n");
    }
}
int main() 
{ 
    printf("A집합을 입력하시오:");
    scanf("%s", ary);
    printPowerSet(ary, strlen(ary));
    return 0; 
} 

1 답변

  • 출력한 문자 수가 counter만큼 도달했을 때만 공백을 넣으시면 원하는 대로 출력이 됩니다.

    void printPowerSet(char *set, int set_size)
    {
        unsigned int pow_set_size = pow(2, set_size);
        int counter, j, k;
    
        for (counter = 0; counter <= set_size; counter++)
        {
            printf("%d:", counter);
    
            for (j = 0; j < pow_set_size; j++)
            {
                int c_counter = 0; // 출력한 문자 수 체크 변수
                for (k = 0; k < set_size; k++)
                {
                    if (j & (1 << k))
                    {
                        if (countSetBits(j << k) == counter)
                        {
                            printf("%c", set[k]);
                            c_counter++; // 출력한 문자 수
                        }
                    }
                }
                if (c_counter == counter) // 출력한 문자 수가 counter에 도달했을 때 공백 출력 
                {
                    printf(" ");
                }
            }printf("\n");
        }
    }
    

    확인해보시기 바랍니다.

    감사합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)