[C] 2017-2019 프로그래밍 문제 모음

https://ss-o.tistory.com/149

* 위 게시글을 바탕으로 코드 정리를 하였습니다.


C

1. 다음 C언어로 구현된 프로그램에서 괄호 (1)에 해당되는 가장 적합한 변수(Variable)나 조건식을 C언어 코드 형식으로 쓰시오. (2017년 1회)

#include <stdio.h>
main()
{
    int num[10];
    int min = 9999;
    int i;
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &num[i]);
    }

    for (i = 0; i < 10; i++)
    {
        if (min > (  1  ) )
        {
            min = num[i];
        }
    }

    printf("가장 작은 값은 %d이다.", min);
}

답안

더보기

num[i]

*답안 작성 시 C언어 코드 형식으로 쓰라는 조건이 있으므로 C언어 코드 형식에 맞게 답안을 작성해야 한다. 예를 들어 C언어 변수명은 대소문자를 구분하므로 num[i]를 NUM[I]와 같이 대문자로 작성하면 오답으로 처리된다.

 

2. 다음은 C언어로 구현된 100을 넘지 않는 소수의 개수를 구하는 프로그램에서 괄호 (1)에 해당하는 가장 적합한 변수나 조건식을 C언어 코드 형식으로 쓰시오. (2017년 2회)

#include <stdio.h>
int isprime(int number){
    int i;
    for(i=2; i<number; i++)
        if( (  1  ) )
            return 0;
    return 1;
}

int main(void) {
    int number = 100, cnt = 0, i;
    for(i=2; i<number; i++)
        cnt = cnt +isprime(i);
    printf("%d를 넘지 않는 소수는 %d개입니다.\n", number, cnt);
    return 0;
}

동작 설명

  1. 소수 판별 함수 (isprime):
    • 숫자 1 이하는 소수가 아니다.
    • 숫자 2는 소수이다.
    • 짝수는 2를 제외하고 소수가 아니므로 바로 0을 반환한다.
    • 3부터 시작하여 홀수만 검사. 만약 나누어 떨어지면 소수가 아님. (효율성을 위해 i * i <= number 조건 사용)
  2. 메인 함수 (main):
    • 2부터 99까지의 수를 검사한다.
    • cnt 변수에 소수의 개수를 누적한다.
    • 결과 출력

이 코드가 올바르게 컴파일되고 실행되면, 100 이하의 소수를 정확하게 계산하고 출력할 수 있다. 소수는 2, 3, 5, 7, 11, 13, 17, 19, ..., 97이며, 25개가 있다.


답안

더보기

number % i == 0

 

3. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오. (2017년 3회)

#include <stdio.h>
int res10(void) {
    return 4;
}

int res30(void) {
    return 30 + res10();
}

int res200(void) {
    return 200 + res30();
}

int main(void) {
    int result;
    result = res200();
    printf("%d\n", result);
}

동작설명

  1. main 함수가 실행
  2. res200 함수가 호출.
  3. res200 함수에서 res30 함수가 호출.
  4. res30 함수에서 res10 함수가 호출.
  5. res10 함수는 4를 반환.
  6. res30 함수는 30 + 4 = 34를 반환.
  7. res200 함수는 200 + 34 = 234를 반환

출력 결과

 

4. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오. (2017년 3회)

#include <stdio.h>
int power(int data, int exp) {
    int i, result = 1;
    for(i = 0; i<exp; i++)
        result = result * data;
    return result;
}

int main(void) {
    printf("%d\n", power(2, 10));
    return 0;
}

동작설명

  1. main 함수에서 power(2, 10)을 호출.
  2. power 함수가 실행:
    • result를 1로 초기화.
    • i가 0부터 exp (여기서는 10)보다 작을 때까지 반복.
    • 각 반복에서 result에 data를 곱합.
    • 최종적으로 result는 2의 10제곱인 1024.

출력 결과

더보기

1024

 

5. 다음은 C언어의 <출력>과 <코드>를 보고 괄고 (1), (2), (3), (4)에 적용될 수 있는 가장 적합한 답을 쓰시오. (2018년 1회)

<출력>
statck's status
value = 40
value = 30 
value = 20
#include <stdio.h>
#define MAX_STACK_SIZE 10

int stack[MAX_STACK_SIZE];
int top = -1;

void push(int item) {
    if(top >= (  1  ) ){
        printf("stack is full\n");
    }
    stack[++top] = (  2  );
}

int pop(void){
    if(top == (  3  )) {
        printf("stack is empty\n");
    } return stack[(  4  )];
}

int isempty(void){
    if(top == (  3  )){
        return 1;
    }else
        return 0;
}

int isfull(void){
    if(top >= (  1  ))
        return 1;
    else
        return 0;
}

int main(void) {
    int e;
    push(20); push(30); push(40);
    printf("stack's status\n");
    while (!isempty()){
        e = pop();
        printf("value = %d\n", e);
    }
}

동작설명

  • push 함수 - 스택에 새로운 요소 추가
    • if 문에서 top이 MAX_STACK_SIZE-1 또는 최대 크기인 9보다 크거나 같으면, 스택이 가득 찼음을 의미하며 stack is full 메시지를 출력한다.
    • 그렇지 않으면 top을 1 증가시키고 그 위치에 item을 저장한다. 
  • pop 함수 - 스택에서 최상위 요소 제거 후 반환
    • top이 -1이면 비어 있는 상태이므로 , stack is empty 메시지를 출력한다.
    • 그렇지 않으면 top 위치의 요소를 반환하고 top 을 1 감소시킨다.
  • isempty 함수 - 스택이 비어 있는지 확인
    • top 이 -1이면 스택이 비어 있는 상태이므로 1을 반환하고 그렇지 않으면 0을 반환한다. 
  • isfull 함수 - 스택이 가득 찼는지 확인
    • top이 9이상이면 스택이 가득 찼음을 의미하여 1을 반환하고 그렇지 않으면 0을 반환한다.

  1. push(20) 호출: 스택에 20을 추가. top은 0
  2. push(30) 호출: 스택에 30을 추가. top은 1
  3. push(40) 호출: 스택에 40을 추가. top은 2
  4. "stack's status" 
  5. while (!isempty()) 루프: 스택이 비어 있지 않은 동안 반복한다.
    1. pop() 호출: 스택에서 최상위 요소 40을 제거하고 반환한다. top은 1이 됩니다. e는 40이 되고, 이를 출력한다.
    2. pop() 호출: 스택에서 최상위 요소 30을 제거하고 반환한다. top은 0이 됩니다. e는 30이 되고, 이를 출력한다.
    3. pop() 호출: 스택에서 최상위 요소 20을 제거하고 반환한다. top은 -1이 됩니다. e는 20이 되고, 이를 출력한다.
    4. 이제 스택이 비어 있으므로 isempty()가 1을 반환하여 루프를 종료한다.

답안

더보기

1 MAX_STACK_SIZE-1 또는 9

2 item

3 -1

4 top--

 

6. 다음은 5개의 정수를 입력받아 그 중 홀수의 개수를 구하여 출력하는 알고리즘을 C언어로 구현한 <코드>이다. 프로그램을 분석하여 괄호에 가장 적절한 답을 쓰시오. (2018년 2회)

#include <stdio.h>
int main(void){
    int i, a[5], cnt = 0;
    
    for(i = 0; i < 5; i++)
        scanf("%d", &a[i]);
    
    for(i = 0; i < 5; i++) {
        if(a[i] % 2 (  ①  ) 0)
            cnt = cnt + 1;
    }
    
    printf("홀수의 개수: %d개", cnt);
}

*답안 작성 시 주의 사항: C언어에서 사용하는 형식에 맞게 정확히 작성해야 한다. "같지 않다"는 표현을 '<>'으로 하지 않도록 주의한다. 

동작설명

배열 a에 차례대로 1, 2, 3, 4, 5가 입력되었다고 가정하고 두 번째 for 문부터 디버깅한 결과이다.

i a[i] a[i]%2 cnt 출력
0 1 1 0 홀수의 개수: 3개
1 2 0 1
2 3 1 2
3 4 0 3
4 5 1  
5      

답안

더보기

!= 또는 >

 

7. 다음은 C언어의 출력과 코들르 보고 괄호 ①에 가장 적합한 답을 쓰시오.  (2018년 2회)

출력
1의 약수 : 1
2의 약수 : 1 2
3의 약수 : 1 3
4의 약수 : 1 2 4
5의 약수 : 1 5
#include <stdio.h>

int main(void) {
    int i, j;
    for(i = 1; i <= 5; i++) {
        printf("%d의 약수 : ", i);
        for (j = 1; j <= 5; j++) {
            if( ( ① ) )
                printf("%d", j);
        }
        printf("\n");
    }
    return 0;
}

동작설명

  • 외부 for 문: 1부터 5까지 증가하며 i에 대해 약수를 출력하기 위한 메시지 출력
  • 내부 for 문: 1부터 5까지 j에 대해 조건을 검사하며 i가 j로 나누어 떨어지면 약수이므로 j 를 출력

답안

더보기

i % j == 0

 

8. 다음은 6면 주사위를 100번 굴려서 나온 각 면의 수를 배열에 저장하여 출력하는 알고리즘을 C언어로 구현한 코드이다. 프로그램을 분석하여 괄호 ①, ②에 가장 적합한 답을 쓰시오. (2018년 3회)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    int hist[6] = {0, };
    int n, i = 0;
    srand(time(NULL));
    
    do {
        i++;
        n = rand() % 6 + 1;
        hist[( ① )] += 1;
    } while (i < 100);
    
    for(i = 0; i < 6; i++)
        printf("[%d] = %d\n", i+1, ( ② ));
}

동작설명

  1. srand(time(NULL))를 통해 난수 생성기를 초기화
  2. do-while 루프가 100번 반복.
    • 난수로 생성된 주사위 면 n을 hist[n-1]에 기록합니다.
  3. for 루프를 통해 hist 배열의 값을 출력합니다.
  4. main 함수 종료

*srand(): 난수를 발생시킬 초기 값인 시드(seed)를 설정한다. 매 초마다 난수를 발생시키는 경우에는 보통 현재 시간 값을 사용한다.

*time(NULL): 1970년 1월 1일 이후부터 현재까지의 시간을 초 단위로 반환한다.


답안

더보기

① n-1 ② hist[i]

 

9. 다음은 연결 리스트를 활용하여 스택 구조를 C언어로 구현한 것이다. 출력과 코드를 보고 괄호 ①, ②에 가장 적합한 답을 쓰시오. (2018년 3회)

<출력>
30
20
10
#include <stdio.h>
#include <stdlib.h>

struct NODE {
    int data;
    struct NODE *Next;
};

struct NODE *head;

void Push(int data){
    struct NODE *end = malloc(sizeof(struct NODE));
    end->( ① ) = head -> ( ① );
    end->data = data;
    head->( ① ) = end;
}

int Pop(void) {
    int a;
    struct NODE *del = head -> ( ① );
    head->( ① ) = del -> ( ① );
    a = del -> data;
    free(del);
    return a;
}

int main(void) {
    int r;
    
    head = malloc(sizeof(struct NODE));
    head->( ① ) = NULL;
    
    Push(10);
    Push(20);
    Push(30);
    
    r = ( ② );
    printf("%d\n", r);
    r = ( ② );
    printf("%d\n", r);
    r = ( ② );
    printf("%d\n", r);
}

동작설명

  • head 노드를 생성하고 스택을 초기화한다.
  • Push(10)을 호출하여 스택에 10을 추가한다.
  • Push(20)을 호출하여 스택에 20을 추가한다.
  • Push(30)을 호출하여 스택에 30을 추가한다.
  • Pop()을 호출하여 스택의 맨 앞 노드인 30을 제거하고, 이를 출력한다.
  • Pop()을 호출하여 스택의 맨 앞 노드인 20을 제거하고, 이를 출력한다.
  • Pop()을 호출하여 스택의 맨 앞 노드인 10을 제거하고, 이를 출력한다.

답안

더보기

① Next ② Pop()

 

10. 다음은 C언어로 구현된 프로그램을 분석하여 괄호 (①)~(②)에 가장 적합한 답을 쓰시오. (2019년 1회)

예) 1234567을 입력받으면 결과 1+2+3+4+5+6+7=28 출력

#include <stdio.h>

int main(void) {
    int input, sum = 0;
    scanf("%d", &input);
    while(1) {
        if( ( ① ) == 0)
            break;
        sum = sum + input % 10;
        input = input / ( ② );
    }
    printf("%d\n", sum);
}

동작설명

1.사용자로부터 정수를 입력받는다.

2. while 문

  • input이 0이 될 때까지 반복한다.
  • input의 마지막 자리를 sum에 더한다.
  • input의 마지막 자리를 제거한다.

3. while 문이 종료되면 sum를 출력한다. 

input sum input%10 출력
1234 0 4 10
123 4 3
12 7 2
1 9 1
0 10  

답안

더보기

① input ② 10

 

11. 다음 C언어로 구현한 프로그램을 분석하여 괄호 ( )에 가장 적합한 답을 쓰시오. (2019년 2회)

#include <stdio.h>

int main(void) {
    char ch, str[] = "12345000";
    int i, j;

    // 처음으로 '0'이 나오는 위치 찾기
    for(i = 0; i < 8; i++){
        ch = str[i];
        if((         ))
            break;
    }

    i--;  // '0' 이전의 마지막 유효 인덱스로 이동

    // 부분 문자열 뒤집기
    for (j = 0; j < i; j++) {
        ch = str[j];
        str[j] = str[i];
        str[i] = ch;
        i--;
    }

    printf("%s\n", str);  // 뒤집힌 문자열 출력

    return 0;
}
실행 결과 : 54321000

동작설명

1. 처음 등장하는 '0'을 찾는다.

2. '0' 이전의 부분 문자열은 뒤집는다.

  • i를 0이전의 마지막 유효 인덱스로 이동한다.
  • j와 i를 사용하여 부분 문자열을 뒤집는다.
  • j가 증가하고 i가 감소하면서 문자열의 양 끝에서부터 문자를 교환한다. 

3. 수정된 문자열 출력


답안

더보기

ch == '0'