기타

C언어 반복문 사각형, 삼각형, 평행사변형, 마름모 출력하기 (Codeup)

restudy 2021. 1. 13. 13:07
반응형

이번 포스트에서는 C언어 반복문을 응용하여 출력할 수 있는 각종 문제들을 풀어보면서, 어떻게 반복문을 활용할 수 있는지에 대해서 다루어보도록 하겠습니다. 문제는 가장 간단한 문제들을 다루고 있는 온라인 저지 사이트인 Codeup을 이용하여 문제를 풀이하겠습니다.

 


사각형 출력하기 - Codeup 1352

 

길이 n이 입력되었을 때 크기에 맞는 정사각형을 별 문자(asterisk, *)로 출력하는 문제입니다.

 

#include<stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) printf("*");
        printf("\n");
    }
}

 

위처럼 먼저 n을 scanf로 입력받고, i = 1부터 n까지 반복문을 돌려준 뒤 그 안에서 별표를 n개씩 n번 출력하도록 설계하면 쉽게 풀리는 것을 확인할 수 있습니다.

 

안이 빈 사각형, 내부가 빈 사각형 출력하기 - Codeup 1356

 

길이 n이 입력되었을 때 테두리만 asterisk 기호로 출력하고, 내부는 공백으로 출력하는 문제입니다.

 

#include<stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            if(i==1 || i==n || j==1 || j==n) printf("*");
            else printf(" ");
        }
        printf("\n");
    }
}

 

테두리인 경우와 아닌 경우를 어떻게 구분할 수 있을까요?

바로 i와 j가 1 또는 n인지 확인하면 됩니다. 그러면 위처럼 아주 간단하게 코드로 작성이 가능하게 됩니다.

 

다만 이 문제에는 다른 풀이도 가능할 것 같습니다. 예를 들어 별을 한 줄 출력하고 그 다음 줄부터는 반복문으로 n-2줄동안 별 1개, 공백 n-2개, 별 1개를 반복적으로 출력하고 다시 마지막 줄에 별을 한 줄 출력하는 방식으로 일일이 출력해줘도 될 것 같네요.

 

삼각형 출력하기 - Codeup 1353

 

문제 모양처럼 크기 n이 주어졌을 때 왼쪽과 아래쪽에 변을 가지고 있는 직각삼각형을 출력하는 문제입니다.

 

#include<stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=i; j++) printf("*");
        printf("\n");
    }
}

 

위처럼 내부 반복문을 j=1부터 n까지가 아닌, j=1부터 i까지로 바꾸면 한 줄씩 늘어날 때마다 별이 한 개씩 늘어나게 출력해줄 수 있음을 확인할 수 있습니다.

 

역삼각형 출력하기 - Codeup 1355

 

위 문제와 반대로 오른쪽과 위쪽에 변을 가지고 있는 직각삼각형을 출력하는 문제입니다. 이 문제의 경우에는 왼쪽 아래 부분에 공백을 추가로 출력해주어야 한다는 것을 확인할 수 있습니다.

 

#include<stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<i; j++) printf(" ");
        for(int j=n; j>=i; j--) printf("*");
        printf("\n");
    }
}

 

첫 줄에 0개의 공백과 n개의 별, n번째 줄에 n-1개의 공백과 1개의 별을 출력해야 함을 인지하고 반복문을 써보면 됩니다. 그러면 공백의 경우 0개부터 n개까지 출력하도록 내부 반복문을 설계하고, 별의 경우 n개부터 1개까지 출력하도록 내부 반복문을 설계해야 하고 그 결과 위와 같은 코드를 작성할 수 있습니다. 다만 이 때 반복문의 범위는 구현하는 사람마다 조금씩 다를 수도 있기는 하겠네요.

 

평행사변형 출력하기 - Codeup 1367

 

 

크기 n이 주어졌을 때 그에 해당하는 크기의 평행사변형을 출력하는 문제입니다. 위의 예시를 보시면 확인하실 수 있겠지만 오른쪽으로 기울어진 평행사변형을 출력해야 합니다. 반복문 설계를 위해 개수를 세어보면 첫 줄에는 n-1개의 공백을 출력하고 n개의 별을 출력하며, 마지막 줄에는 0개의 공백을 출력하고 역시 n개의 별을 출력하네요.

 

#include<stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n-i; j++) printf(" ");
        for(int j=1; j<=n; j++) printf("*");
        printf("\n");
    }
}

 

적절히 개수에 맞게 반복문을 설계해주시면 됩니다.

 

마름모 출력하기 - Codeup 1371

 

 

마지막으로 출력해볼 도형은 마름모입니다. 마름모의 경우 왼쪽 공백도 고려해야하고 마름모 내부의 공백도 고려해야해서 상당히 복잡할 수도 있겠네요. 우선 맨 첫 줄에는 n-1개의 공백이 출력됩니다. 마름모 내부의 공백은 한 줄 내려갈 때마다 두 개씩 추가되고, n번째 줄에서는 마름모 왼쪽에 0개의 공백, 마름모 내부에 2n-2개의 공백이 출력되는 것을 확인할 수 있습니다.

 

#include<stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n-i; j++) printf(" ");
        printf("*");
        for(int j=1; j<=2*(i-1); j++) printf(" ");
        printf("*\n");
    }
    for(int i=n; i>=1; i--) {
        for(int j=1; j<=n-i; j++) printf(" ");
        printf("*");
        for(int j=1; j<=2*(i-1); j++) printf(" ");
        printf("*\n");
    }
}

 

위쪽 이중 for문만 설계해주시면 아래쪽의 이중 for문은 i의 변화 범위를 반대로만 설정하면 거꾸로 출력되므로 보이는 코드보다는 간단한 문제입니다.

 

먼저 공백의 개수를 줄 번호에 맞게 출력해주시고, 그 다음 asterisk를 한 개 출력, 그 다음 공백의 수를 줄의 번호에 맞게 출력해주신 뒤 "*\n"을 출력해주시면 됩니다. 약간 복잡할 때는 직접 개수를 세가면서 해도 괜찮습니다. 어떻게든 개수를 줄 번호에 맞게 일반화시키기만 하면 되니까요.

 


지금까지 Codeup에 있는 여러가지 C언어 반복문을 이용한 출력 예제들을 확인해보았습니다. 이러한 반복문을 이용한 출력 문제들의 공통점은 for문의 범위를 어떻게 설정하느냐겠네요. 그러나 이런 문제들의 경우 설정할만한 범위의 선택지가 별로 없기 때문에, 제가 위에 제시해드린 문제만 풀어보아도 웬만한 반복문 문제는 안 헷갈리고 푸실 수 있을 것이라고 생각합니다.

반응형