정보처리기사[실기]

[C언어] 23년 기출 문제 풀이 (1회 ~ 4회)

microsaurs 2024. 10. 1. 15:49

[23년 1회]

#include <stido.h>

int main(void) {
	char a[] = "Art";
    char *p = NULL;
    p=a;
    
    printf("%s\n",a);
    printf("%c\n",*p);
    printf("%c\n",*a);
    printf("%s\n",p);
    
    for(int i=0; a[i]!='\0'; i++){
    	printf("%c", a[i]);
    }
}
더보기

정답

Art

A

A

Art

Art

 

[풀이]

1. 문자열 a "Art" 출력

2. 포인터 p가 가리키는 첫 번째 문자 → 'A'출력

3. 문자열 a의 첫 번째 문자 → 'A'출력

4. 포인터 p가 가리키는 문자열 전체 → "Art" 출력 

: printf("%s\n", p);는 포인터 p가 가리키는 주소부터 시작하여 문자열 "Art" 전체를 출력

  '\0'이 나올 때까지 메모리에서 문자를 차례대로 읽어서 출력하는 방식

5. 문자열 a의 각 문자를 순회 후 순차적 출력 "Art" 출력

 

#include <stdio.h>

int main(void) {
	char* a = "qwer";
    char* b = "qwtety"
    
    for(int i=0; a[i]!='\0'; i++){
    	for(int j=0; b[j]!='\0'; j++){
        	if(a[i] == b[j]) printf("%c", a[i]);
        }
    }
}
더보기

정답 : qwe

 

[풀이]

char* a에 할당된 데이터 qwer을 각각 반복문을 통해 순회하면서

char* b랑 같으면 그 문자를 출력하면 됨

 

ex. a[0] = q → b[0] ~ b[5]까지 반복문 돌면서 q가 있으면 출력

위와 같은 방식으로 a[3]까지 반복해서 두개의 문자열 리터럴을 비교해서 같은 문자를 출력하면 됨

 

// 다음은 이진수에서 십진수로 변환하는 코드이다.
// (가)는 연산자이고 (나)는 정수일 때 빈칸을 알맞게 쓰시오.

#include <stdio.h>

int main(void){
	int input = 101110;
    int di = 1;
    int sum = 0;
    
    while (input > 0){
    	sum = sum + (input (가)(나) * di);
        di = di * 2;
        input = input / 10;
    }
    
    printf("%d", sum);
    
    return 0;
}
더보기

정답

(가) %

(나) 10

 

// (가), (나) 빈칸에 알맞은 변수를 쓰시오.

#include <stdio.h>
void swap(int* idx1, int* idx2){
	int t = *idx1;
    *idx1 = *idx2;
    *(가) = t;
}

void Usort(int a[], int len){
	for(int i=0; i < len - 1; i++) {
    	for(int j=0; j < len - i - 1; j++){
        	if(a[j] > a[j+1])
            	swap(&a[j], &a[j+1]);
        }
    }
    
    for(int k=0; k<5; k++){
    	printf("%d", a[k]);
    }
}

int main(void){
	int arr[] = {64, 34, 25, 12, 40};
    int nx = 5;
    
    Usort(arr, (나));
    return 0;
}
더보기

정답

(가) idx2

(나) nx

 

[풀이]

swap() → 두 정수를 바꾸는 함수

Usrot() → 버블정렬 오름차순 함수


[23년 2회]

// 입력값이 순서대로 5,4,3,2,1일 경우 출력값이 43215로 출력 되도록 빈칸 (가)에 들어갈 코드를 작성하시오.

#include <stdio.h>

int main(){
	int n[5];
    int i;
    
    for(i=0; i<5; i++){
    	printf("숫자를 입력하세요 : ");
        scanf("%d", &n[i]);
    }
    
    for(i=0; i<5; i++){
    	printf("%d", (가));
    }
    
    return 0;
}
더보기

정답

(가) n[(i+1) % 5]

 

// a,b,c,d의 빈칸에 알맞은 식을 <보기>에서 찾아쓰는데 <보기>를 최소한으로 쓰시오.
// [보기] 
// 1000    500   100   10   %   /   +   -

#include <stdio.h>

int main() {
	int m = 4620;
    int a,b,c,d;
    a=(가)
    b=(나)
    c=(다)
    d=(라)
    printf("1000원 개수 : %d", a);
    printf("500원 개수 : %d", b);
    printf("100원 개수 : %d", c);
    printf("10원 개수 : %d", d);
    return 0;
}
더보기

정답

(가) m / 1000

(나) (m % 1000) / 500

(다) (m % 500) / 100

(라) (m%100) / 10

 

// 홍길동, 김철수, 박영희 순서대로 입력했다고 할 때 출력결과

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

char n[30];

char *test() {
	printf("입력하세요 : ");
    gets(n);
    return n;
}

int main() {
	char * test1;
    char * test2;
    char * test3;
    
    test1 = test();
    test2 = test();
    test3 = test();
    
    printf("%s\n", test1);
    printf("%s\n", test2);
    printf("%s", test3);
    return 0;
}
더보기

정답

박영희

박영희

박영희

#include <stdio.h>

int main(void){
	int n[3] = {73,95,82};
    int sum = 0;
    for(int i=0; i<3; i++){
    	sum += n[i];
    }
    
    switch(sum/30){
    	case 10:
        case 9: printf("A");
        case 8: printf("B");
        case 7:
        case 6: printf("C");
        default: printf("D");
    }
    return 0;
}

 

더보기

정답 : BCD

 

[풀이]

switch문은 break가 없는 경우, 해당 case 이후의 case가 모두 실행됨

sum = 250 이고 sum / 30 = 8 이므로

case 8 이후의 case들이 모두 실행

 

#include <stdio.h>

int main(void){
	int c=0;
    for(int i=1; i<=2023; i++){
    	if(i%4 == 0) c++;
    }
    printf("%d", c);
    return 0;
}
더보기

정답 : 505

 

#include <stdio.h>
#define MAX_SIZE 10

int isWhat[MAX_SIZE];
int point = -1;

void into(int num) {
	if(point >= 10) printf("Full");
    isWhat[++point] = num;
}

int take() {
	if(isEmpty() == 1) printf("Empty");
    return isWhat[point--];
}

int isEmpty() {
	if(point == -1) return 1;
    return 0;
}

int isFull() {
	if(point == 10) return 1;
    return 0;
}

int main(int argc, char const *argv[]) {
	int e;
    into(5);
    into(2);
    while(!isEmpty()) {
    	printf("%d", take());
        into(4);
        into(1);
        printf("%d", take());
        
        into(3);
        printf("%d", take());
        pirntf("%d", take());
        
        into(6);
        printf("%d", take());
        printf("%d", take());
    }
    return 0;
}
더보기

정답 : 213465

 

[풀이] - chatGPT 

 

  • 변수 및 배열 정의:
    • int isWhat[MAX_SIZE]; : 스택을 구현하기 위한 배열. 최대 MAX_SIZE (10)까지 정수 저장 가능
    • int point = -1; : 스택의 현재 최상단 인덱스를 나타냅니다. 초기 값은 -1, 즉 스택이 비어 있는 상태
  • into(int num) 함수:
    • 입력된 정수 num을 스택에 추가
    • point가 10 이상인 경우 "Full" 메시지를 출력
    • point를 증가시키고 num을 isWhat 배열에 추가
  • take() 함수:
    • 스택에서 최상단 요소를 꺼내는 함수
    • 스택이 비어 있는 경우 "Empty" 메시지를 출력
    • 최상단 요소를 반환하고 point를 감소
  • isEmpty() 함수:
    • 스택이 비어 있는지를 확인
    • point가 -1이면 스택이 비어있다고 판단하고 1을 반환. 그렇지 않으면 0을 반환
  • isFull() 함수:
    • 스택이 가득 차 있는지를 확인
    • point가 10이면 스택이 가득 차 있다고 판단하고 1을 반환. 그렇지 않으면 0을 반환
  • main() 함수:
    • into(5)와 into(2)를 호출하여 스택에 5와 2를 추가
    • while 루프는 스택이 비어 있지 않을 때까지 반복. 
    • take()를 호출하여 스택에서 최상단 요소를 꺼내고 출력
      • 4와 1을 스택에 추가합니다.
      • 다시 take()를 호출하여 최상단 요소를 꺼내고 출력
      • 3을 스택에 추가한 후, 두 번 take()를 호출하여 최상단 요소를 꺼내고 각각 출력
      • 6을 스택에 추가한 후, 두 번 take()를 호출하여 최상단 요소를 꺼내고 각각 출력

 

 

// 다음은 선택정렬을 하는 코드이다. (가)에 들어갈 기호를 쓰시오.

#include <stdio.h>

int main(void) {
	int E[] = {64, 25, 12,22, 11};
    int n = sizeof(E) / sizeof(E[0]);
    
    int i = 0;
    do {
    	int j = i + 1;
        do {
        	if(E[i] (가) E[j]) {
            	int tmp = E[i];
                E[i] = E[j];
                E[j] = tmp;
            }
            j++;
        } while (j < n);
        i++;
    } while (i < n-1);
    
	return 0;
}
더보기

정답 :  >

 

* 선택정렬과 버블정렬

 

선택 정렬 (Selection Sort)

  1. 작동 방식:
    • 주어진 배열에서 가장 작은(또는 큰) 요소를 찾습니다.
    • 찾은 요소를 배열의 맨 앞(또는 맨 뒤)으로 교환합니다.
    • 이 과정을 배열의 끝까지 반복합니다. 즉, 매 반복마다 남은 배열에서 최솟값(최댓값)을 찾아 정렬합니다.
  2. 복잡도:
    • 시간 복잡도: O(n2)O(n^2) (모든 요소를 비교해야 하므로)
    • 공간 복잡도: O(1)O(1) (제자리 정렬, 추가 배열이 필요 없음)
  3. 특징:
    • 안정성: 안정적이지 않음 (동일한 값이 있을 경우, 순서가 바뀔 수 있음)
    • 많은 요소의 데이터에 비효율적임 (정렬된 상태에서 성능이 저하되지 않음)

버블 정렬 (Bubble Sort)

  1. 작동 방식:
    • 인접한 두 요소를 비교하고, 순서가 올바르지 않으면 교환합니다.
    • 배열의 끝까지 이동하며 이 과정을 반복합니다.
    • 가장 큰(또는 작은) 요소가 배열의 끝으로 "거품처럼" 올라가는 형태입니다.
    • 이 과정을 여러 번 반복하여 전체 배열이 정렬될 때까지 계속합니다.
  2. 복잡도:
    • 시간 복잡도: O(n2)O(n^2) (중첩 루프 사용)
    • 공간 복잡도: O(1)O(1) (제자리 정렬, 추가 배열이 필요 없음)
  3. 특징:
    • 안정성: 안정적임 (동일한 값의 상대적 순서는 유지됨)
    • 최적화 가능성: 만약 배열이 이미 정렬되어 있다면, 한 번의 패스만으로 정렬이 완료되므로 성능이 향상될 수 있음.

[23년 3회]

#include <stdio.h>

int mian() {
	char* p = "KOREA";
    printf("%s\n", p);
    printf("%s\n", p+1);
    printf("%c\n", *p);
    printf("%c\n", *(p+3));
    printf("%c\n", *p+4);
}
더보기

정답

KOREA

OREA

K

E

O

 

C 언어에서 구조체의 멤버에 접근하기 위한 기호를 쓰시오
더보기

정답 : ->

 

#include <stdio.h>

int complete(int n){
	int sum = 0;
    for(int j=1; j<=n/2; j++) {
    	if(n%j == 0) {
        	sum = sum + j;
        }
    }
    if(sum == n){
    	return 1;
    } else {
    	return 0;
    }
}

int main() {
	int s = 0;
    for(int i=1; i<=100; i++){
    	if(complete(i))
        	s += i;
    }
    printf("%d",s);
}
더보기

정답 : 34

 

[풀이]

완전수 찾는 문제 

완전수 : 자기 자신을 제외한 모든 약수의 합이 자신과 같은 수

 

complete() => 완전수를 찾는 함수

 

1~100 사이의 완전수는 6, 28 두 개

 

#include <stdio.h>

int f(int n) {
	if(n <= 1) return 1;
    else return n*f(n-1);
}

int main() {
	printf("%d", f(7));
}
더보기

정답 : 5040

 

재귀함수 팩토리얼 문제

답 → 7! = 5040