본문 바로가기
C Programming/연습 문제

[C언어 연습문제]강좌 5. Conditional Statements in C(C언어 if 조건문), 숫자 조건을 영어로 표현하기)

by 희품 2019. 2. 18.
반응형


학습(Study) & 목표(Objective)

아무도 읽지 않아 슬픈 일기 강좌가 되어가고 있습니다. 이번 시간에는 if 문을 사용한 예제 문제를 풀어보려고 합니다.

if와 else는 C언어와 C++ 언어에서 가장 많이 사용하는 조건문으로, 여러 종속 조건 중에 실행을 안 하거나 하나 이상의 조건문을 실행할 수 있어요.


if 문은 condition 조건을 만족할 때, 중괄호로 묶인 statement1 구문 실행을 시작합니다.

if (condition) {

statement1;

...

}


if - else 문은 condition 조건을 만족하면 statement1이 포함된 중괄호 부분을 수행하고, 조건에 만족하지 못하면 중괄호로 묶인 else 구문 statement2를 수행합니다.

if (condition) {

statement1;

...

}

else {

statement2;

...

}


if - else if - else 구조에는 위의 조건이 모두 거짓일 때만 아래의 구문이 실행되는 구조입니다. 하나의 조건이 만족한다면, 만족하는 중괄호 구문을 수행하고, 프로그램은 마지막 종속 조건(else)문의 끝으로 이동해서 다음 프로그램 구문을 수행합니다. 조건이 모두 만족하지 못하면, 마지막 else 구문의 중괄호 안 내용이 실행됩니다.

if (first condition) {

...

}

else if(second condition) {

...

}

.

.

.

else if( (n-1)'th condition) {

...

}

else {

...

}



과제(Task)

주어진 양의 정수 n이 입력되면, 숫자를 영어로 표기한다.

9가 넘는 수를 주면 9보다 크다는 문구를 표기한다.


입력 형식(Input Format)

첫 번째 줄은 하나의 정수 n을 입력한다.


제약 조건(Constraints)


출력 형식(Output Format)

- 숫자를 영어 이름으로 표기한다(1이면 one, 2이면 two, 등)

- Greater then 9를 표기한다.


입력 예제(Sample Input)

5


출력 예제(Sample Output)

five


주어진 코드

#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char* readline();
 
 
 
int main()
{
    char* n_endptr;
    char* n_str = readline();
    int n = strtol(n_str, &n_endptr, 10);
 
    if (n_endptr == n_str || *n_endptr != '\0') { exit(EXIT_FAILURE); }
 
    // Write Your Code Here
 
    return 0;
}
 
char* readline() {
    size_t alloc_length = 1024;
    size_t data_length = 0;
    char* data = malloc(alloc_length);
 
    while (true) {
        char* cursor = data + data_length;
        char* line = fgets(cursor, alloc_length - data_length, stdin);
 
        if (!line) { break; }
 
        data_length += strlen(cursor);
 
        if (data_length < alloc_length - 1 || data[data_length - 1== '\n') { break; }
 
        size_t new_length = alloc_length << 1;
        data = realloc(data, new_length);
 
        if (!data) { break; }
 
        alloc_length = new_length;
    }
 
    if (data[data_length - 1== '\n') {
        data[data_length - 1= '\0';
    }
 
    data = realloc(data, data_length);
 
    return data;
}


여기다가 // Write Your code에 해결을 위한 코드를 넣으면 됩니다. 그런데, 뭔가 갑자기 코드가 길어지고 복잡해졌네요? 주어진 코드도 분석을 해보겠습니다.

char* readline()
{
    //변수 초기화
    size_t alloc_length = 1024;    // 버퍼의 크기
    size_t data_length = 0;        // 데이터의 크기
 
    // data에 메모리 할당
    char* data = malloc(alloc_length);
 
    while (true) {
        // data의 시작 지점 + 읽은 데이터의 크기
        char* cursor = data + data_length;
 
        // 표준입력(키보드)에서 현재 cursor 위치에서 남은 데이터를 읽는다.
        // 값은 allock_length 만큼씩 읽어들인다.
        char* line = fgets(cursor, alloc_length - data_length, stdin); 
 
        // line이 NULL이면 모든 데이터를 읽은 것이므로 빠져나간다.
        if (!line) { break; }
 
        // 읽은 데이터만큼 값을 더해 다음 루프를 준비한다.
        data_length += strlen(cursor);
 
        // 버퍼의 마지막 위치이거나 모두 읽었으면 빠져나간다.
        // 여기서 date_length는 현재까지 읽은 위치, alloc_length는 할당된 크기이므로,
        // date_length가 더 작다면, 더 이상 읽을 내용이 없다는 의미.
        if (data_length < alloc_length - 1 || data[data_length - 1== '\n') { break; }
 
        // 버퍼의 크기를 늘려 다시 메모리를 할당한다.
        size_t new_length = alloc_length << 1;
        data = realloc(data, new_length);
 
        // 데이터 할당에 실패하면 오류로 빠져나간다.
        if (!data) { break; }
 
        alloc_length = new_length;
    }
 
    // 마지막 개행 문자를 없앤다.
    if (data[data_length - 1== '\n') {
        data[data_length - 1= '\0';
    }
 
    // data의 컨텐츠 크기에 맞게 메모리를 다시 할당하고 반환한다.
    data = realloc(data, data_length);
 
    return data;
}

결론은, 사용자의 입력(표준 입력) 데이터를 가져와서 10진수 정수로 변환한 후에 변환이 실패하면 프로그램을 종료하고, 성공했다면, 과제를 수행하겠다는 내용입니다.

int main()
{
    char* n_endptr;
    char* n_str = readline();
    int n = strtol(n_str, &n_endptr, 10);
 
    if (n_endptr == n_str || *n_endptr != '\0') { exit(EXIT_FAILURE); }
 
    // Write Your Code Here
    if(n == 1)
        printf("one");
    else if(n == 2)
        printf("two");
    else if(n == 3)
        printf("three");
    else if(n == 4)
        printf("four");
    else if(n == 5)
        printf("five");
    else if(n == 6)
        printf("six");
    else if(n == 7)
        printf("seven");
    else if(n == 8)
        printf("eight");
    else if(n == 9)
        printf("nine");
    else
        printf("Greater than 9");
 
    return 0;
}

사실 정수 조건의 나열이기 때문에 switch(n)문을 사용하는 것이 더 코드가 보기 좋고 간결해져요.

아래와 같이 코드를 보기 쉽게 만드는 방법도 있습니다. 출력할 문자열들을 상수로 만들고, 실제 값과 매칭을 시켜서 한 줄 한줄 적지 않아도 되는 방법이죠. 매칭 방법이 복잡해진다면 또 다른 방법을 써야하겠지만요.

#include <stdio.h>
 
static const char *strings[] = {"one","two","three","four","five",
                                "six","seven","eight","nine"};
int main()
{
    int n = 0;
    if (scanf("%d",&n) < 1)
        return 1;
    
    if (n >= 1 && n <= 9)
        printf("%s",strings[n-1]);
    else
        printf("Greater than 9");
    
    return 0;
}

벌써 5번째 C언어 과제 글인데요, 조회 수가 0으로 수렴하고 있어서 제목을 바꿔봤어요. Hacker Rank의 소제목은 누구도 검색하지 않는 것 같아서, 연습 문제와 강좌를 넣으면 좀 나아지지 않을까 생각이 드네요.


반응형