c언어 독학문제풀이중 질문

익명 사용자의 이미지

[문제]
자연수 n(n≤6)을 입력받아 "출력 예"와 같이 공백으로 구분하여 출력되는 프로그램을 작성하시오.
주의! 문자는 공백으로 구분하되 줄사이에 빈줄은 없다.

[입력]
3

[출력]
A B C
D E 0
F 1 2

정답:
#include "stdio.h"
int main(void)
{
int a=0,b=0,c=0,d=0,e=0,f=0;
char h='A';
scanf("%d",&a);
for(b=1;b<=a;b++){
for(c=a;c>=b;c--)
printf("%C ",h++);
for(c=1;c printf("%d ",f++);
printf("\n");
}
}

이러한 문제들을 많이풀고있는 C언어 입문자입니다. 하지만 문제를아무리풀어도모르겠고 해설을봐도 이게 어떻게 적용이될까 하여 알아봐도 정확한 이해가 안갑니다. 문제풀이는 스스로 해결해야되는거지만 도저히 안돼겠어서 도움을 요청합니다..

위 문제에 b<=a 처럼 문자들의 크기배열은 왜 이루어지는것이며 c-- b++등에 전개로인해 어떻게문제가 풀리는등 자세한 해석을 써주신다면 정말감사하겠습니다. 이번한번만 이해를하면 나머지문제들은 왠만하게 이해하여 풀수있을것같습니다

세벌의 이미지

저는 문제부터 이해가 안 되네요.

3을 입력했을 때

출력이
A B C
D E 0
F 1 2
나오도록 하는 프로그램을 만들라고요?
무슨 규칙이죠?
잘못된 문제 갖고 님께서 스트레스 받지 마시길.

질문할 때는
https://wiki.kldp.org/wiki.php/DocbookSgml/Beginner_QA-KLDP#AEN70
참고하세요.

익명 사용자의 이미지

일단, 문제가 정말 마음에 안 듭니다.

n=3일 때의 예시를 줄 테니 적당히 패턴을 파악해서 n=1~6일 때의 답은 알아서 맞추라는 건가요?
아무리 간단한 패턴이 자명하게 눈에 띈다고 해도 절대 납득할 수 없는 문제 서술입니다.
아래 코드가 답이 될 수 없는 이유는 뭐죠?

#include <stdio.h>
 
int main(){
    /* 입력이 뭐가 들어오든 말든.
    n을 꼭 써야 한다는 말은 없었잖아요? */
    puts("A B C\nD E 0\nF 1 2");
    return 0;
}

이까짓 디테일에 뭘 그렇게 예민하게 구냐고 생각하실 수도 있어요.
하지만 프로그래밍은, 특히 알고리즘 공부를 할 때는, 원래 이런 디테일에 민감하게 신경써야 합니다.

정답이라고 주신 코드도 한심하기 짝이 없네요.
int a=0,b=0,c=0,d=0,e=0,f=0;라니, 이런 코드를 보면 보통 세 가지 중 하나라고 생각을 합니다.

1. 고의적인 트롤링이거나 2. 코드 골프거나 3. ioccc 출품작?

워낙 짤막하고 간단한 코드니까 이런 식으로 짜도 사실 크게 문제는 없고 동작이야 당연히 잘 되겠지요.
하지만 결코 권장할 만한 스타일은 아닙니다. 입문자에게 보여진다는 전제라면 더더욱 문제가 있죠.

질문에 대한 직접적인 답은 아니라서 죄송합니다만, C언어를 입문하시려거든 다른 방법을 찾아보시는 게 더 나을 것 같습니다.

bushi의 이미지

고의 트롤링이거나 무슨 컨테스트 같지는 않고...
문제 낸 사람의 실력이 다른 사람의 질문에 답변을 할 수준조차 안되는 단순한 경우 같습니다.

자기가 처한 환경에 대한 정보를 다른 사람도 당연히 알고 있다고 생각하며 질문을 하듯 문제를 낸 것이라 생각됩니다.
문제(질문)을 받아든 사람이 뭘 가장 답답해 할 것인가를 생각해 본 적이 단 한번이라도 있을지 의심스럽습니다.

익명 사용자의 이미지

#include <stdio.h>
#include <stdlib.h>
 
static void draw_pattern(int n);
 
int main(){
    int n;
 
    if (scanf("%d", &n) == 1 && 0 <= n && n <= 6){
        draw_pattern(n);
        return EXIT_SUCCESS;
    }
    else
        return EXIT_FAILURE;
}
 
void draw_pattern(int n){
    const char *alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int number = 0;
 
    for (int row = 0; row < n; row++){
        int num_alphabet = n - row;
 
        for(int col = 0; col < num_alphabet; col++)
            printf("%c ", *alphabet++);
 
        for(int col = num_alphabet; col < n; col++)
            printf("%d ", number++);
 
        putc('\n', stdout);
    }
 
    return;
}

뭐 고작 이 정도 길이의 코드에 가독성을 논하고 스타일을 논하는 게 조금 우습다는 생각도 들기는 합니다만,

어쨌든 코드를 읽고 공부해야 하는 입장이면 int a=0,b=0,c=0,d=0,e=0,f=0; 이러는 코드보다는 이게 조금이라도 나을 겁니다.

shint의 이미지

맞는지는 모르지만.

세모 모양으로 만들라는겁니다. ㅇ_ㅇ;;
세모 ABCDEF
세모 012

[입력]
3
 
[출력]
A B C
D E 0
F 1 2

별 그리기 예요.

***
**0
*00

http://codepad.org/4paphBpk

#include "stdio.h"
int main(void)
{
    int a=0,b=0,c=0,d=0,e=0,f=0;
    char h='A';
    int i,j;
    int k = 0;
    int m = 0;
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            if(j == 2 && i == 1)
            {
                printf("%d", m);
                if(j == 2)
                {
                    printf("\n");
                }
                m++;
            }
            if(j == 2 && i == 2)
            {
                printf("%d", m);
                if(j == 2)
                {
                    printf("\n");
                }
                m++;
            }
            if(j == 1 && i == 2)
            {
                printf("%d", m);
                m++;
            }
 
            if(k < 6)
            {
                printf("%c", k+h);
            }
            k++;
        }
        if(i < 1)
        {
            printf("\n");
        }
    }
    return 0;
}
 
//
ABC
DE0
F12

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

1,2,4,5이 입력됐을때는요?

세모는 오직 입력이 3,6일때만 가능한것 같은데......

익명 사용자의 이미지

A B C D
E F G 0
H I 1 2
J 3 4 5

"i번째 행은 n-i+1개의 알파벳과 i-1개의 숫자로 이루어지고, 각 알파벳과 숫자는 여러 행에 걸쳐 계속 증가한다."라는 규칙이라고 생각되네요.

shint의 이미지

ㅇ_ㅇ;; 그냥 되는 방식만 구현해봤습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

raymundo의 이미지

훨씬 더 명확하게 조건을 제시하는 문제 사이트들이 많을 겁니다.
알고리즘 경연 사이트들이라거나(그런 곳에도 초급 수준의 문제들도 나오니까)
외국 사이트라면 오일러 프로젝트라거나.
적어도 본문에 적힌 그런 문제를 내는 곳보다는 다른 곳을 찾아보시는 게 나을 것 같습니다.
(이유는 다른 분들이 다 적어주셨고...)

어쨌거나 본문 문제를 굳이 좋게 해석해서,
가로 세로 길이 N인 정사각형 모양으로 문자를 출력하되,
정사각형을 우상단-좌하단 대각선을 기준으로 두 개의 삼각형 영역으로 쪼개고
좌상단 삼각형(대각선 포함)은 A, B, .. 순으로 채워넣고
우하단 삼각형은 0, 1, ... 순으로 채워넣어라
정도로 해석이 되고,

그러면 N=4일 때도 한번 손으로 그려보면

1번째줄: A B C D  - 4개의 문자, 0개의 숫자
2번째줄: E F G 0  - 3개의 문자, 1개의 숫자
3번째줄: H I 1 2  - 2개의 문자, 2개의 숫자
4번째줄: J 3 4 5  - 1개의 문자, 3개의 숫자

이렇게 쓰면 "i번째 줄"에 몇 개의 문자와 숫자가 출력되어야 하는지 규칙이 보입니다.

그게 https://kldp.org/comment/627726#comment-627726 에 다른 분이 쓰신 것처럼
"i번째 줄에는 N-i+1개의 문자, i-1개의 숫자" 인 거죠.

그 다음, 각 줄에 이렇게 "A개의 문자, B개의 숫자"를 출력하려니, 루프가 두번 쓰여야 합니다. A번 반복하며 문자 하나씩 출력하는 루프와, B번 반복하며 숫자 하나씩 출력하는 루프

그리고 이 과정이 N번 반복되어야 하니 다시 루프가 있어야겠죠.

N번 반복하는 루프
{
    A번 반복하는 루프
    {
        문자 1개 출력
    }
    B번 반복하는 루프
    {
        숫자 1개 출력
    }
    줄바꿈 문자 출력
}

이 규칙은 얼마든지 자신의 편의를 위해 바꿀 수 있습니다.

만일 줄 번호 i 를 1부터 시작하지 않고 0부터 시작하는 걸로 하면 "N-i개의 문자, i개의 숫자"로 더 간단해질 수도 있죠. 이렇게 0부터 시작하는 걸로 구현한 게 https://kldp.org/comment/627717#comment-627717 에 있는 코드입니다.

void draw_pattern(int n){
//...
    for (int row = 0; row < n; row++){    // 줄 번호 row는 0부터 n-1까지, 총 n회 반복
 
        // 문자를 출력할 횟수는 N - i
        int num_alphabet = n - row;
 
        // col은 0부터 num_alphabet-1까지, 총 num_alphabet회 반복
        for(int col = 0; col < num_alphabet; col++)
            printf("%c ", *alphabet++);
 
        // num_alphabet부터 n-1까지, 총 n - num_alphabet = n - (n - row) = row회 반복
        for(int col = num_alphabet; col < n; col++)
            printf("%d ", number++);
 
        // 줄바꿈 
        putc('\n', stdout);
    }
 
    return;
}

본문의 코드는 일단 변수명이 a,b,c,...이렇게 생각없는 이름이라서 매우 피곤하지만 결국 같은 식으로 구현한 거니까, 일단 변수 이름을 좀 그럴싸하게 고쳐놓고(a가 N, b가 row에 해당하겠군요) 차분히 보시면 똑같은 일을 하고 있는 걸 아실 수 있을 겁니다.

좋은 하루 되세요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.