본문 바로가기
정보처리산업기사

정보처리산업기사 실기 C언어 문제 정리

by Hwangminseo 2026. 4. 9.

문제1 (22년 1회 6번)

문제1 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int n, count = 0;
scanf("%d", &n);
for (int i = 2; i <= n / 2; i++) {
if (i % 1 == 0) {
count++;
}
}
printf("%d", count);
return 0;
}

정답 확인
답 : 2

해설 : 7을 입력하면 반복문은 i=2, 3까지만 돈다. i % 1 == 0은 모든 정수에 대해 항상 참이므로 count가 두 번 증가해 2가 출력된다. 원문 코드는 소수 판별처럼 보이지만 실제로는 그렇지 않다.

문제2 (22년 1회 9번)

문제2 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int n = 3, r = 0;
for (int i = 1; i < 10; i = i + 2) {
r = r + n * i;
}
printf("%d", r);
return 0;
}

정답 확인
답 : 75

해설 : i는 1, 3, 5, 7, 9까지 돈다. 각 항에 3을 곱해 더하면 3×(1+3+5+7+9)=3×25=75이다.

문제3 (22년 1회 14번)

문제3 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int n1 = 15, n2 = 22;
n1 ^= n2;
n2 ^= n1;
n1 ^= n2;
printf("%d %d", n1, n2);
return 0;
}

정답 확인
답 : 22 15

해설 : XOR 스왑 패턴이다. 임시 변수 없이 n1과 n2의 값을 교환하므로 최종적으로 n1은 22, n2는 15가 된다.

문제4 (22년 1회 17번)

문제4 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int num = 35, evencnt = 0, oddcnt = 0;
for (int i = 1; i <= num; i++) {
if (i % 2 == 0) {
evencnt++;
} else {
oddcnt++;
}
}
printf("%d %d", evencnt, oddcnt);
return 0;
}

정답 확인
답 : 17 18

해설 : 1부터 35까지는 총 35개다. 짝수는 17개, 홀수는 18개이므로 17 18이 출력된다.

문제5 (22년 2회 1번)

문제5 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int a = 27, b = 12;
int l, g;
for (int i = b; i > 0; i--) {
if (a % i == 0 && b % i == 0) {
g = i;
break;
}
}
l = a * b / g;
printf("%d", g + l);
return 0;
}

정답 확인
답 : 111

해설 : 27과 12의 최대공약수는 3이다. 최소공배수는 27×12÷3=108이므로 둘의 합은 111이다.

문제6 (22년 2회 7번)

문제6 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int sum = 0;
int i = 0;
for (i = 0; i <= 10; i++) {
if (i % 2 != 0) {
continue;
}
sum += i;
}
printf("%d", i + sum);
return 0;
}

정답 확인
답 : 41

해설 : 짝수만 더하므로 sum은 30이 된다. 반복문이 끝난 뒤 i는 11이므로 i+sum=41이다.

문제7 (22년 2회 14번)

문제7 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int arr[6];
int max = 0, min = 99;
int sum = 0;

for (int i = 0; i &lt; 6; i++) {
    arr[i] = i * i;
    sum += arr[i];
}

for (int i = 0; i &lt; 6; i++) {
    if (max &lt; arr[i]) max = arr[i];
    if (min &gt; arr[i]) min = arr[i];
}

printf(&quot;%.2f&quot;, (sum - max - min) / 4.0);
return 0;

}

정답 확인
답 : 7.50

해설 : 배열 값은 0, 1, 4, 9, 16, 25이고 총합은 55다. 최대값 25와 최소값 0을 빼면 30, 이를 4로 나누면 7.50이다.

문제8 (22년 2회 15번)

문제8 : 결과 값을 구하시오

소스 :

#include <stdio.h>
#include <math.h>

int check(int a) {
int n = (int)sqrt(a);
int i = 2;
while (i <= n) {
if (a % i == 0) return 0;
i++;
}
return 1;
}

int main() {
int arr[5];
for (int i = 0; i < 5; i++) {
arr[i] = (i + 2) + (i * 2);
}
for (int i = 0; i < 5; i++) {
printf("%d", check(arr[i]));
}
return 0;
}

정답 확인
답 : 11010

해설 : arr 값은 2, 5, 8, 11, 14가 된다. 소수 여부는 1, 1, 0, 1, 0이므로 11010이 출력된다.

문제9 (22년 2회 19번)

문제9 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
char a[3][5] = {"KOR", "HUM", "RES"};
char *pa[] = {a[0], a[1], a[2]};
int n = sizeof(pa) / sizeof(pa[0]);

for (int i = 0; i &lt; n; i++) {
    printf(&quot;%c&quot;, pa[i][i]);
}
return 0;

}

정답 확인
답 : KUS

해설 : pa[0][0]=K, pa[1][1]=U, pa[2][2]=S 이므로 KUS가 출력된다.

문제10 (22년 3회 6번)

문제10 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int a[3][5] = {
{27, 13, 21, 41, 12},
{11, 20, 17, 35, 15},
{21, 15, 32, 14, 10}
};
int sum, ssum = 0;

for (int i = 0; i &lt; 3; i++) {
    sum = 0;
    for (int j = 0; j &lt; 5; j++) {
        sum += a[i][j];
    }
    ssum += sum;
}

printf(&quot;%d&quot;, ssum);
return 0;

}

정답 확인
답 : 304

해설 : 각 행의 합은 114, 98, 92이고 전체 합은 304이다.

문제11 (22년 3회 8번)

문제11 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int i = 1, n = 0;
while (i <= 50) {
if (i % 7 == 0) {
n += i;
}
i++;
}
printf("%d", n);
return 0;
}

정답 확인
답 : 196

해설 : 50 이하의 7의 배수 7, 14, 21, 28, 35, 42, 49를 모두 더하면 196이다.

문제12 (22년 3회 16번)

문제12 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int n, sum = 0;
printf("정수를 입력하시오 : ");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
sum = sum + i;
}
printf("%d", sum);
return 0;
}

정답 확인
답 : 15

해설 : 입력값이 5이므로 1부터 5까지 더한 15가 출력된다.

문제13 (23년 1회 4번)

문제13 : 빈칸에 들어갈 값을 구하시오

소스 :

#include <stdio.h>
#define LEN 10

void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

int partition(int arr[], int left, int right) {
int pivot = arr[(left + right) / (가)];
while (left <= right) {
while (arr[left] < pivot) left++;
while (arr[right] > pivot) right--;
if (left <= right) {
swap(arr, left, right);
left++;
right--;
}
}
return left;
}

정답 확인
답 : 2

해설 : pivot을 가운데 인덱스로 선택하는 코드이므로 (left + right) / 2가 맞다.

문제14 (23년 1회 5번)

문제14 : 빈칸에 들어갈 값을 구하시오

소스 :

#include <stdio.h>

int SumNTo1(int n) {
if (n <= 1) {
return 1;
} else {
return n + (가);
}
}

int main() {
int result = SumNTo1(100);
printf("%d", result);
return 0;
}

정답 확인
답 : SumNTo1(n-1)

해설 : 1부터 n까지의 합을 재귀로 만들려면 현재 n에 대해 바로 아래 단계인 n-1의 합을 더해야 한다.

문제15 (23년 1회 16번)

문제15 : 빈칸에 들어갈 값을 구하시오

소스 :

#include <stdio.h>

int recursive(int n) {
if (n <= 1) {
return 1;
} else {
return n * n + recursive((가));
}
}

int main() {
int i;
scanf("%d", &i);
printf("%d ", recursive(i));
return 0;
}

정답 확인
답 : n-1

해설 : 현재 n의 제곱을 더하고 한 단계 작은 값으로 재귀 호출해야 하므로 n-1이 들어간다.

문제16 (23년 2회 3번)

문제16 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int d = 55;
int n = 4;
int r = 0, q = 0;

r = d;
while (r &gt;= 4) {
    r = r - n;
    q++;
}

printf(&quot;%d 그리고 &quot;, q);
printf(&quot;%d&quot;, r);
return 0;

}

정답 확인
답 : 13 그리고 3

해설 : 55에서 4를 반복해서 빼면 13번 빼고 나머지 3이 남는다.

문제17 (23년 2회 16번)

문제17 : 빈칸에 들어갈 값을 구하시오

소스 :

#include <stdio.h>

void Sort(int a[][6]) {
for (int i = 0; i <= 4; i++) {
for (int j = 5; j >= 0; j--) {
if (i == 0 || i == 4 || j == 0 || j == 5) {
printf("%3d", a[i][j]);
} else {
printf(" ");
}
}
printf("\n");
}
}

int main() {
int a[5][6] = {
{0, 1, 2, 3, 4, 5},
{6, 7, 8, 9, 10, 11},
{12, 13, 14, 15, 16, 17},
{18, 19, 20, 21, 22, 23},
{24, 25, 26, 27, 28, 29}
};
Sort(a);
return 0;
}

정답 확인
답 : 빈칸 값: 17, 12, 23, 18

해설 : 각 행을 오른쪽에서 왼쪽으로 출력하되 바깥 테두리만 출력한다. 그래서 안쪽 양 끝에 보이는 값이 17, 12, 23, 18이다.

문제18 (23년 2회 17번)

문제18 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
char s1[5] = "abcd";
char s2[5];

for (int i = 0; i &lt; 4; i++) {
    s2[i] = s1[3 - i];
}
s2[4] = &#x27;\0&#x27;;

printf(&quot;%s&quot;, s2);
return 0;

}

정답 확인
답 : dcba

해설 : 문자열을 뒤에서부터 복사하므로 역순 문자열 dcba가 된다. 원문에는 널 종료 인덱스 오타가 있어 학습용으로 보정했다.

문제19 (23년 2회 18번)

문제19 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int a = 10;
char b = 'a';

printf(&quot;%d\n&quot;, a);
printf(&quot;%d\n&quot;, b);
printf(&quot;%c&quot;, b);
return 0;

}

정답 확인
답 : 10
97
a

해설 : 문자 a를 정수로 출력하면 아스키 코드 97이 나온다. 마지막은 문자 형식이므로 a가 출력된다.

문제20 (23년 2회 20번)

문제20 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int result = 1;
for (int i = 1; i <= 5; i++) {
result *= i;
}
printf("%d", result);
return 0;
}

정답 확인
답 : 120

해설 : 1부터 5까지 곱한 값인 5! = 120이다.

문제21 (23년 3회 2번)

문제21 : 결과 값을 구하시오

소스 :

#include <stdio.h>
#define MAX 4

int prin(int a) {
if (a > 1) {
prin(a - 1);
}
printf("%d", a);
return 0;
}

int main() {
prin(MAX);
return 0;
}

정답 확인
답 : 1234

해설 : 재귀 호출이 먼저 끝난 뒤 출력하므로 1부터 4까지 순서대로 이어진다.

문제22 (23년 3회 5번)

문제22 : 빈칸에 들어갈 값을 구하시오

소스 :

#include <stdio.h>
#define SIZE 5

int p[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

int snail(int a[SIZE][SIZE]) {
int i = 0, j = 0, v = 1, c = 0;
a[i][j] = v;
v += 1;

while (v &lt;= SIZE * SIZE) {
    int ni = i + p[c][0];
    int nj = j + p[c][1];

    if (0 &lt;= ni &amp;&amp; ni &lt; SIZE &amp;&amp; 0 &lt;= nj &amp;&amp; nj &lt; SIZE &amp;&amp; a[ni][nj] == 0) {
        i = ni;
        j = nj;
        a[i][j] = v;
        v += 1;
    } else {
        c = (c + 1) % (가);
    }
}
return 0;

}

정답 확인
답 : 4

해설 : 달팽이 배열은 방향이 4개이므로 방향 전환 인덱스도 4로 순환해야 한다.

문제23 (23년 3회 7번)

문제23 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int data[] = {15, 12, 26, 23, 31, 36};
int temp = 0;
int cnt = sizeof(data) / sizeof(int);

for (int i = 0; i &lt; cnt - 1; i++) {
    for (int j = 0; j &lt; cnt - 1 - i; j++) {
        if (data[j] &gt; data[j + 1]) {
            temp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = temp;
        }
    }
}

for (int i = 1; i &lt; cnt - 1; i++) {
    printf(&quot;%d &quot;, data[i]);
}
return 0;

}

정답 확인
답 : 15 23 26 31

해설 : 정렬 뒤 배열은 12, 15, 23, 26, 31, 36이 된다. 첫 번째와 마지막을 제외한 값만 출력한다.

문제24 (23년 3회 9번)

문제24 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int sub(int *a) {
printf("%d", *a);
printf("%d", a[2]);
return 0;
}

int main() {
int a[10] = {1, 2, 3, 4, 5, 6};
sub(a);
sub(a + 2);
return 0;
}

정답 확인
답 : 1335

해설 : sub(a)는 1과 3을, sub(a+2)는 3과 5를 출력하므로 전체 결과는 1335다.

문제25 (23년 3회 13번)

문제25 : 빈칸에 들어갈 값을 구하시오

소스 :

#include <stdio.h>

int compare(int i, int j, int *ma, int *in) {
if (i > j) {
*ma = j;
*in = i;
} else {
*ma = i;
*in = j;
}
return 0;
}

int main() {
int max = 0;
int min = 0;
compare(3, 7, (가), (나));
printf("작은수:%d 큰수:%d", max, min);
return 0;
}

정답 확인
답 : (가) &max, (나) &min

해설 : 포인터 인자로 변수의 주소를 넘겨야 값이 저장된다. 3은 max 자리에, 7은 min 자리에 들어간다.

문제26 (24년 1회 1번)

문제26 : 결과 값을 구하시오

소스 :

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

int main() {
char *str = "abCDEfGh";
int count = 0;

for (int i = 0; i &lt; strlen(str); i++) {
    char ch = str[i];
    if (ch &gt;= &#x27;A&#x27; &amp;&amp; ch &lt;= &#x27;Z&#x27;) {
        count++;
    }
}

printf(&quot;%d&quot;, count);
return 0;

}

정답 확인
답 : 4

해설 : 대문자는 C, D, E, G 총 4개다.

문제27 (24년 1회 18번)

문제27 : 결과 값을 구하시오

소스 :

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

int main() {
int N = 2;
char *str[2];

for (int i = 0; i &lt; N; i++) {
    char input[100];
    scanf(&quot;%s&quot;, input);
    str[i] = (char *)malloc(strlen(input) + 1);
    strcpy(str[i], input);
}

while (N &gt; 0) {
    printf(&quot;%d번 출력 :&quot;, N);
    for (int i = (int)strlen(str[N - 1]) - 1; i &gt;= 0; i--) {
        printf(&quot;%c&quot;, str[N - 1][i]);
    }
    printf(&quot;\n&quot;);
    N--;
}

return 0;

}

정답 확인
답 : 2번 출력 :tset
1번 출력 :gnirts

해설 : string, test를 입력하면 뒤에서부터 꺼내 각 문자열을 역순 출력한다. 따라서 test → tset, string → gnirts 순서가 된다. 원문 오타는 보정했다.

문제28 (24년 1회 19번)

문제28 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int sum = 0;
int i = 329;

do {
    sum = 999 % i;
    i++;
} while (sum != 0);

printf(&quot;%d&quot;, i);
return 0;

}

정답 확인
답 : 334

해설 : 999가 333으로 나누어떨어진다. 루프 안에서 i++이 먼저 일어나므로 최종 출력은 334다. 원문 구두점 오타는 보정했다.

문제29 (24년 2회 3번)

문제29 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int i = 3;
int j = 5;
printf("%d", (i | j) - (i & j));
return 0;
}

정답 확인
답 : 6

해설 : 3은 011, 5는 101이다. OR은 7, AND는 1이므로 결과는 6이다.

문제30 (24년 2회 5번)

문제30 : 결과 값을 구하시오

소스 :

#include <stdio.h>

struct number {
float i;
float j;
};

int main() {
struct number a = {3.0, 4.0};
struct number b = {4.0, 5.0};
printf("%.2f 그리고 %.2f", a.i + b.i, a.j + b.j);
return 0;
}

정답 확인
답 : 7.00 그리고 9.00

해설 : 각 구조체의 같은 필드를 더하면 7.0과 9.0이 된다. 소수 둘째 자리까지 출력하므로 7.00 그리고 9.00이다.

문제31 (24년 2회 7번)

문제31 : 빈칸에 들어갈 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int n = 3;
for (int i = 1; i <= 9; i++) {
printf("%d*%d=%d\n", n, i, (가));
}
return 0;
}

정답 확인
답 : n*i

해설 : 3단의 결과 부분에는 n과 i의 곱이 들어가야 하므로 n*i가 맞다.

문제32 (24년 2회 9번)

문제32 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int n1 = 11;
int n2 = 0;
int *p = NULL;

p = &amp;n1;
n2 = *p + n1;

printf(&quot;%d&quot;, *p - n1 + n2);
return 0;

}

정답 확인
답 : 22

해설 : *p는 11이고 n2는 22가 된다. 따라서 11-11+22=22다.

문제33 (24년 2회 17번)

문제33 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int a[5] = {3, 4, 5, 10, 2};
int *p = a;
int temp;

for (int i = 0; i &lt; 5; i++) {
    for (int j = i + 1; j &lt; 5; j++) {
        if (*(p + i) &gt; *(p + j)) {
            temp = *(p + i);
            *(p + i) = *(p + j);
            *(p + j) = temp;
        }
    }
    printf(&quot;%d &quot;, *(p + i));
}
return 0;

}

정답 확인
답 : 2 3 4 5 10

해설 : 선택 정렬과 비슷하게 작은 값을 앞으로 보내며 각 단계의 값을 출력한다. 최종 출력은 오름차순 2 3 4 5 10이다.

문제34 (24년 3회 4번)

문제34 : 결과 값을 구하시오

소스 :

#include <stdio.h>

union Number {
int intV;
int floatV;
};

struct data {
union Number n1;
union Number n2;
char isInt;
};

void func(struct data *a) {
if (a->isInt) {
a->n1.intV += a->n2.intV;
} else {
a->n1.floatV += a->n2.floatV;
}
}

int main() {
struct data a = {{.intV = 5}, {.floatV = 3.5}, 1};
func(&a);
printf("%d", a.n1.intV);
return 0;
}

정답 확인
답 : 8

해설 : isInt가 1이므로 intV 기준으로 더한다. union의 floatV도 실제 선언은 int라서 3.5는 3처럼 취급되어 5+3=8이 된다.

문제35 (24년 3회 9번)

문제35 : 결과 값을 구하시오

소스 :

#include <stdio.h>

void swap(int *ptr1, int *ptr2) {
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}

void func(int *arr, int n) {
int *ptr1 = &arr[0];
int *ptr2 = &arr[n - 1];

while (ptr1 &lt; ptr2) {
    swap(ptr1, ptr2);
    ptr1++;
    ptr2--;
}

}

int main() {
int arr[] = {1, 2, 3, 4, 5};
func(arr, 5);
printf("%d", arr[2]);
return 0;
}

정답 확인
답 : 3

해설 : 배열을 뒤집어도 홀수 길이 배열의 가운데 값은 그대로다. 따라서 arr[2]는 3이다.

문제36 (24년 3회 11번)

문제36 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int main() {
int sum = 0;
int i = 0;

for (i = 0; i &lt;= 10; i++) {
    if (i % 2 != 0) {
        continue;
    }
    sum += i;
}

printf(&quot;%d&quot;, i + sum);
return 0;

}

정답 확인
답 : 41

해설 : 짝수 합 30에 반복 종료 후 i값 11을 더하므로 41이다.

문제37 (24년 3회 14번)

문제37 : 결과 값을 구하시오

소스 :

#include <stdio.h>

int factorial(int n, int from, int to, int temp) {
if (n == 0) {
return 0;
} else {
return factorial(n - 1, from, temp, to) + 1
+ factorial(n - 1, temp, to, from);
}
}

int main() {
int n = 3;
printf("%d", factorial(n, 3, 2, 1));
return 0;
}

정답 확인
답 : 7

해설 : 점화식은 T(n)=2T(n-1)+1, T(0)=0 형태다. 하노이 탑 이동 횟수와 같아서 n=3일 때 7이 된다.

문제38 (24년 3회 19번)

문제38 : 결과 값을 구하시오

소스 :

#include <stdio.h>

void func(int arr, int size) {
for (int i = 0; i < size; i++) {
*(
arr + i) = (
(*arr + i) + i) % size;
}
}

int main() {
int arr[] = {3, 1, 4, 1, 5};
int p = arr;
int *
pp = &p;
int num = 6;

func(pp, 5);
num = arr[2];
printf(&quot;%d&quot;, num);
return 0;

}

정답 확인
답 : 1

해설 : 각 원소를 (현재값 + 인덱스) % 5로 바꾼다. arr[2]는 (4+2)%5=1이 되므로 출력은 1이다.