정보처리기사[실기]

[C언어] 24년 기출 문제 풀이 (1회, 2회)

microsaurs 2024. 10. 1. 18:42

[24년 1회]

#include <stdio.h>

int main() {
	int v1 = 0, v2 = 35, v3 = 29;
    
    if(v1 > v2 ? v2 : v1) {
    	v2 = v2 << 2;
    } else {
		v3 = v3 << 2;
    }
    
    printf("%d", v2+v3);
}
더보기

정답 : 151

 

[풀이]

if (v1 > v2 ? v2 : v1) → if(v1) → if(0) => else 실행

v3 = v3 << 2; → 왼쪽으로 2번 시프트 = 4배

29 * 4 = 116

v2 + v3 = 151

 

#include <stdio.h>
#include <string.h>

void reverse(char* str) {
	int len = strlen(str);
    char temp;
    char* p1 = str;
    char* p2 = str + len - 1;
    while(p1<p2) {
    	temp = *p1;
        *p1 = *p2;
        *p2 = temp;
        p1++;
        p2--;
    }
}

int main(int argc, char* argv[]){
	char str[100] = "ABCDEFGH";
    
    reverse(str);
    
    for(int i=1; i<len; i+=2){
    	printf("%c", str[i]);
    }
    
    printf("\n");
    
    return 0;
}
더보기

정답 : GECA

 

[풀이]

reverse 함수 → 문자열 뒤집는 함수

str = "HGFEDCBA"

 

main에 for 문은 i가 2씩 늘어나면서 그 인덱스 문자를 출력

1,3,5,7 인덱스 출력

 

#include <stdio.h>

typedef struct {
	int accNum;
    double bal;
} BankAcc;

double sim_pow(double base, int year) {
	int i;
    double r = 1.0;
    
    for(i=0; i<year; i++){
    	r = r*base;
    }
    return r;
}

void initAcc(BankAcc *acc, int x, double y) {
	acc -> accNum = x;
    acc -> bal = y;
}

void xxx(BankAcc *acc, double *en) {
	if(*en > 0 && *en < acc -> bal) {
    	acc -> bal = acc -> bal-*en;
    }
}

void yyy(BankAcc *acc) {
	acc -> bal = acc -> bal * sim_pow((1+0.1),3);
}

int main() {
	BankAcc myAcc;
    initAcc(&myAcc, 9981, 2200.0);
    double amount = 100.0;
    xxx(&myAcc, &amount);
    yyy(&myAcc);
    printf("%d and %.2f", myAcc.accNum, myAcc.bal);
    return 0;
}
더보기

정답 : 9981 and 2795.10

 

#include <stdio.h>
#include<ctype.h<

int main() {
	char*p = "It is 8";
    char result[100];
    int i;
    
    for(i=0; p[i]!='\0'; i++) {
    	if(isupper(p[i]))
        	result[i] = (p[i]-'A'+5)%25 + 'A';
        else if(islower(p[i]))
        	result[i] = (p[i]-'a'+10)%26 + 'a';
        else if(isdigit(p[i])) 
        	result[i] = (p[i]-'0'+3)%10 + '0';
        else if(!(isupper(p[i]) || islower(p[i]) || isdigit(p[i])))
        	result[i] = p[i];
        
    }
    
    result[i] = '\0';
    printf("%s\n", result);
    
    return 0;
}
더보기

정답 : Nd sc 1

 

문자를 아스키코드로 변환하여 풀이

 


[24년 2회]

#include <stdio.h>

int main() {
	int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int* parr[2] = {arr[1], arr[2]};
    printf("%d", parr[1][1] + *(parr[1]+2) + **parr);
    
    return 0;
}
더보기

정답 : 21 

 

[풀이]

2차원 배열

1 2 3 

4 5 6 

7 8 9

parr[2] → [4, 5, 6] , [7, 8, 9]

parr [1][1] = 8

parr [1] + 2 => parr포인터 주소 첫번째 인덱스에 2칸을 더 간 주소 = parr[1][2] = 9

**parr = 4

8 + 9 + 4  = 21

 

#include <stdio.h>
#include <string.h>

void sumFn(char* d, char* s) {
	int sum = 0;
    
    while (*s) {
    	*d = *s;
        d++;
        s++;
    }
    *d = '\0';
}

int main() {
	char* str1 = "first";
    char str2[50] = "teststring";
    int result = 0;
    sumFn(str2, str1);
    
    for (int i=0; str2[i] != '\0'; i++) {
    	result += i;
    }
    printf("%d", result);
    
    return 0;
}
더보기

정답 : 10

 

[풀이]

sumFn() 함수로 str2 를 "first"로 변경

main() 함수의 for문에서 first의 길이만큼 반복

0 + 1 + 2 + 3 + 4 = 10

 

#include <stdio.h>

void swap(int a, int b) {
	int t = a;
    a = b;
    b = t;
}

int main() {
	int a = 11;
    int b = 19;
    swap(a, b);
    
    switch(a) {
    	case 1: 
        	b += 1;
        case 11: 
        	b += 2;
        default:
        	b += 3;
        break;
    }
    
    print("%d", a-b);
}
더보기

정답 : -13

 

[풀이]

main함수에서 호출된 swap 함수가 적용되지 않기 때문에 a, b의 값은 그대로 유지 (포인터가 아니라 그냥 매개변수라서)

a = 11 b = 19

조건문에서 case 11을 실행하면 a = 11 b = 21, default 실행 a = 11 b = 24

 

11-24 = -13

 

#include <stdio.h>

struct node {
	int n1;
    struct node *n2;
};

int main() {
	struct node a = {10, NULL};
    struct node b = {20, NULL};
    struct node c = {30, NULL};
    
    struct node *head = &a;
    a.n2 = &b;
    b.n2 = &c;
    
    printf("%d\n", head->n2->n1);
    
    return 0;
}
더보기

정답 : 20 

 

[풀이] - chatGPT

 

  • 구조체 정의:
    • struct node는 두 개의 멤버를 가지고 있습니다:
      • int n1: 정수를 저장하는 필드.
      • struct node *n2: 다음 노드를 가리키는 포인터로, 다음 노드의 주소를 저장합니다. 이는 연결 리스트 구조를 구현할 때 사용됩니다.
  • 노드 선언 및 초기화:
    • 세 개의 노드 a, b, c를 선언하고 각각 초기화합니다.
    • n1 필드는 각각 10, 20, 30으로 초기화됩니다.
    • n2 필드는 NULL로 초기화됩니다. 이는 아직 연결되지 않았음을 의미합니다.
  • 노드 연결:
    • 포인터 head는 첫 번째 노드 a의 주소를 저장하고 있습니다. 즉, head는 연결 리스트의 시작점입니다.
    • a.n2 = &b;: 노드 a의 n2가 노드 b의 주소를 가리키도록 합니다. 즉, a 다음에 b가 연결됩니다.
    • b.n2 = &c;: 노드 b의 n2가 노드 c의 주소를 가리키도록 합니다. 즉, b 다음에 c가 연결됩니다.
    • 이렇게 하면 연결 리스트는 a -> b -> c의 형태로 구성됩니다.
  • 값 출력:
    • head는 현재 노드 a를 가리키고 있습니다.
    • head->n2는 노드 b를 가리키게 됩니다. 즉, a.n2의 값, 즉 b의 주소를 따라갑니다.
    • head->n2->n1은 노드 b의 n1 값인 20을 의미합니다.
    • 따라서 20이 출력됩니다