본문 바로가기
작업/Programming

Perfect C 프로그래밍 연습 7장 6, 7, 11, 13번 해결

 

 이전의 블로깅에 이어서 반복문인 7장의 연습문제를 해결해 보았습니다.

 

 

6번. 숫자 피라미드

 

//문제6
    for(int i=0; i<8; i++) {    //행의 수
        for(int j=7; j>0; j--){   //좌측 수
            if(j<=i) printf("%d", j); //행의 자리에 맞는 수 출력
            else printf(" ");       //빈 칸으로 자리 채움
            
        }
        for(int k=0; k<i+1; k++){  //우측 수
            printf("%d", k);
        }

        printf("\n"); //행 변경
    }

 

출력 형태가 삼각형 구조로 되어있어서 피라미드라고 말합니다.

출력의 형태를 보면 총 8행으로 구성되었고, 1행은 가운데에 0이 1개, 다음 행에는 1이 추가됩니다.

 

 

아래줄와 비교를 해보면 그냥 숫자만 출력한 것이 아니라
옆에 공백(' ')이 형성되었다는 것을 확인할 수 있습니다.
즉, 아래로 내려갈수록 공백은 없어지고 그 자리에 숫자가 들어간다는 의미입니다.


문제에서 중첩된 for문을 사용하라고 하였는데, 첫 for문은 줄(행)넘김을 하는 용도로 사용하고,
그 안의 중첩 for문으로 각 행의 숫자들을 출력시키면 됩니다.

 

 

마지막 행을 보면 7부터 출력이 되는 것을 확인할 수 있습니다. 
따라서 중첩된 for문의 시작은 7로 두는 것이 좋다고 판단했습니다.

 


그리고 각 행마다 새로운 수가 1씩 증가하여 나타나고 0을 기준으로 대칭으로 출력됩니다.
그래서 0을 기준으로 좌측의 수들을 뽑는 for문 따로, 우측의 수를 뽑는 for문 따로 만들었습니다.

 



좌측의 for문은 7부터 1까지 나열되고,
우측의 for문은 0부터 7까지 나열되는 구조로 만든 것입니다.




if문은 좌측의 수들을 뽑기 위한 조건입니다.
우측은 그냥 0부터 차례대로 뽑으면 되서 조건은 필요 없습니다.

 

 

 

※ 중첩 for문 알고리즘

 

좌측의 수를 뽑는 j는 7부터 시작하며 행의 위치를 나타내는 i는 0부터 시작합니다.
3번 행에서 i는 2가 되며 j는 7부터 1까지 감소하면서 반복합니다.


j가 i와 같거나 작으면(j가 2거나 1이면) 숫자를 출력하고, 그렇지 않다면 공백을 둡니다.
이런 알고리즘으로 좌측의 공백과 숫자를 위치시킬 수 있습니다.



우측의 수를 뽑는 k는 0부터 시작하며 행의 위치를 나타내는 i에 1을 더한 수만큼 반복합니다.
그래서 첫 행에 0을 출력합니다. k와 i는 0이며 k는 i+1(1)만큼 반복하기 때문입니다.


3번 행에서 k는 2가 되며 i+1(3)만큼 반복합니다. 그래서 0, 1, 2를 뽑아냅니다.

 

 


7번. 숫자 위치 변환

 

   //문제7
    int a; //정수 저장

    printf("정수 입력 : ");
    scanf("%d", &a);

    do {
        printf("%d", a%10); //처음 1의자리 출력
        a /=10;            //사용한 1의자리 없앰

        if(a<10) printf("%d", a); //최종 1의자리 출력

	} while(a>10); //최종 1의자리 나오면 종결

 

해당 문제는 배열 연습으로 나올 수도 있는 문제입니다. 입력한 정수를 반대로 출력하는 코딩입니다.

이것은 이전 연습문제에서  각 자리수의 수를 따로 출력하는(1백 2십 3만 4천...) 방식과 유사합니다.


do while() 문장을 사용하라고 했기 때문에 그렇게 해주겠습니다.
일의자리는 나머지 연산(%)으로 쉽게 뽑아낼 수 있습니다.
나머지 연산을 통해 뽑아낸 수는 이제 쓸모가 없기 때문에 버려도 무방합니다.


십의 자리부터 다음 출력에 사용하면 되기 때문에 일의 자리를 버리는 연산을 합니다.
10으로 나누면 몫으로 십의 자리까지의 값을 얻을 수 있으며 일의 자리는 자연스럽게 소멸됩니다.
(1234567890 / 10 = 123456789)


이 과정을 반복하면 최종적으로 맨 앞자리가 일의 자리가 될 것입니다.
이것은 곧 반복이 종료된 것과 같기 때문에 if문을 통해 마무리 출력 작업을 해주고,
while에서 더이상 나눌 수 있는 십의 자리가 없기 때문에 반복은 종료됩니다.

 

 


11번. 구구단 출력

 

//문제11
int a; //입력 정수

printf("구구단 정수 입력 : ");
scanf("%d", &a);

for(int i=1; i<10; i++){
    printf("%d x %d = %d\n", a, i, a*i);
}

 

반복문 연습에서 필수로 나오는 문제입니다.
만약 입력 없이 2단부터 9단까지 출력하려면 중첩 for문을 사용하면 됩니다.

 

 


13번. 1~n까지의 합

 

//문제13
    int sum=0; //수들의 합 저장
    int i=1; //1부터 시작

    while(sum + i<10000){
        sum += i;
        i++;
    }

    printf("10000을 넘기지 않는 가장 큰 합 = %d\n", sum);
    printf("그 때의 n의 값 = %d\n", i);

 

조건으로 합이 10000이하여야 한다고 제시되어 있습니다.


문제의 조건을 그대로 반복문의 탈출조건으로 해주시면 되며
특정한 조건을 기준으로 반복을 하는 것이기 때문에 while 구문이 적당합니다.


합(sum)이 10000이 넘게 되면 반복은 끝이나며
그 이전까지는 계속해서 1~n까지의 수를 더하는 연산을 수행하도록 합니다.

 

 

-끝-