정보처리기사[실기]

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

microsaurs 2024. 9. 19. 16:28

[22년 1회]

// 5를 입력 받았을 때 출력 결과

#include <stdio.h>

int func(int a) {
	if(a <= 1) return 1;
    return a*func(a-1);
}

int main(){
	int a;
    scanf("%d", &a);
    printf("%d", func(a));
}
더보기

정답 : 120

 

* 재귀함수를 활용한 팩토리얼 계산

int func(int a)

→ 주어진 숫자부터 1까지 전부 곱하는 팩토리얼 함수

 

✔️ 재귀 호출: return a * func(a-1);
a가 1보다 크면, a에 func(a-1)을 곱해 결과를 반환

a가 줄어들면서 팩토리얼의 정의대로 곱셈

 

[풀이]

func(5) = 5 * func(4)
func(4) = 4 * func(3)
func(3) = 3 * func(2)
func(2) = 2 * func(1)
func(1) = 1

5 * 4 * 3 * 2 * 1 = 120

 

간단 설명 : a가 5이므로 5! = 120

 

// 아래 프로그램은 정수를 역순으로 출력하는데 (1)(2)(3)에 들어갈 연산자를 쓰시오

#include <stdio.h>

int main(){
	int number = 1234;
    int div = 10;
    int result = 0;
    
    while(number ( 1 ) 0){
    	
        result = result * div;
        result = result + number ( 2 ) div;
        number = number ( 3 ) div;
        
    }
    
    printf("%d", result);
    return 0;
}
더보기

정답

(1) >   (2) %  (3) /

 

나는 그냥 막 대입해서 풀긴 했는데 chatGpt에게 풀이를 부탁함 ㅋ

 

(1), (2), (3)에 들어갈 부분

(1) 조건: while(number (1) 0)

  • number가 0이 될 때까지 반복하려는 의도입니다. 즉, number가 0보다 클 때까지만 반복이 계속되어야 합니다.
  • 답: >

(2) 자릿수 추출: result = result + number (2) div;

  • number의 마지막 자릿수를 추출하려고 합니다. 숫자를 10으로 나눈 나머지를 계산하면 마지막 자릿수를 얻을 수 있습니다.
  • 답: % (나머지 연산자)

(3) 자릿수 제거: number = number (3) div;

  • 마지막 자릿수를 제거하기 위해서는 숫자를 10으로 나누어 한 자리를 줄입니다.
  • 답: / (정수 나눗셈)

[22년 2회]

#include <stido.h>

struct A{
	int n;
    int g;
};

int main() {
	struct A a[2];
    for(int i=0; i<2; i++){
    	a[i].n=i, a[i].g=i+1;
    }
    printf("%d", a[0].n + a[1].g);
}
더보기

정답 : 2

 

a[0] {n: 0, g: 1}

a[1] {n: 1, g: 2}

0 + 2 = 2

 

#include <stdio.h>

int len(char*p);

int main() {
	
    char*p1 = "2022";
    char*p2 = "202207";
    
    int a = len(p1);
    int b = len(p2);
    
    printf("%d", a+b);
    
}

int len(char*p){
	int r = 0;
    while(*p != '\0'){
    	p++;
        r++;
    }
    return r;
}
더보기

정답 : 10

 

len 함수: 문자열의 길이를 세는 함수

  • 입력된 문자열이 끝날 때까지 (\0 문자)를 만날 때까지 한 글자씩 세면서 포인터 p를 옮김.
  • r은 글자 수를 세는 카운터로, p가 끝까지 가면 r을 반환함

main 함수: 문자열 길이 계산

  • p1은 문자열 "2022"이고, p2는 "202207"임.
  • len(p1)으로 "2022"의 길이인 4를 계산하고, len(p2)로 "202207"의 길이인 6을 계산함.
  • 두 길이의 합 4 + 6 = 10을 출력함.

 

#include <stido.h>

int main(int argc, char*argv[]){
	int a[4] = {0,2,4,8};
    int b[3] = {};
    int i=1;
    int sum = 0;
    int *p1;
    
    for(i; i<4; i++){
    	p1 = a+i;
        b[i-1]= *p1-a[i-1];
        sum = sum +b[i-1]+a[i];
    }
    printf("%d", sum);
    
    return 0;
}
더보기

정답 : 22

 

포인터 : 변수의 메모리 주소를 저장하는 변수

p1 = a + i;  p1은 배열 a의 i번째 요소를 가리킴

 

[p1 = a + i; 동작 설명]

  1. a는 배열의 시작 주소를 의미 a는 배열의 첫 번째 요소인 a[0]의 메모리 주소
  2. a + i는 배열의 i번째 요소의 주소를 의미  
    a는 배열의 시작 주소를 가리키고, 여기에 i를 더하면 배열의 i번째 요소의 주소를 가리키게 됨

  3. 포인터 p1에 저장:
    • p1 = a + i;는 포인터 p1이 a 배열의 i번째 요소를 가리킴
    • p1은 배열 a의 i번째 요소의 메모리 주소를 가리키고, *p1은 그 주소에 있는 값을 참조

[22년 3회]

// 아래는 C언어의 2차원 배열 형태이다. 
// field의 경우 2차원 배열 형태는 예시처럼 출력되므로
// 이를 참고하여 mines의 2차원 배열 형태를 작성하시오. 

#include <stido.h>

void main() {
	int mines[4][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
	int field[4][4] = {{0,1,0,1},{0,0,0,1},{1,1,1,0},{0,1,1,1}};
    
    int w = 4; h = 4;
    
    for(int y=0; y<h; y++){
    	for(int x=0; x<w; x++){
        	if(field[y][x] == 0) continue;
            for(int j=y-1; j<=y+1; j++){
            	for(int i=x-1; i<=x+1; i++){
                	if(chkover(w,h,j,i) == 1)
                    	mines[j][i] += 1;
                }
            }
        }
    }
}

int chkover(int w, int h, int j, int i){
	if(i >= 0 && i < w && j >=0 && j < h) return 1;
    return 0;
}
더보기

정답

1 1 3 2

3 4 5 3

3 5 6 4

3 5 5 3

 

풀이 

지뢰찾기 게임이라고 생각하고 풀어야함 .. 계산 하려했는데 실패ㅋ

쉬운 방법 

→ 나 + 내 바로 옆칸 (대각선 포함)에 + 1

 

#include <stdio.h>

main () {
	int s, el = 0;
    for(int i=6; i<=30; i++){
    	s=0;
        for(int j=1; j<=i/2; j++){
        	if(i%j == 0){
            s = s+j;
            }
        }
        if(s == i){
        	el++;
        }
    }
    printf("%d", el);
}
더보기

정답 : 2

 

완전수 찾는 함수

완전수 = 자기 자신을 제외한 약수들의 합이 자기 자신과 같은 수

 

6~30 숫자중 완전수 = 6, 28

→ 2 출력