자격증 요약/정보처리기사

[정보처리기사 실기] C언어 기출 유형_1 (배열, 정렬)

문성 2026. 4. 8. 16:00


[20년 1회]
12. 다음은 C언어 소스 코드이다. 출력 결과를 쓰시오. 

#include <stdio.h>
void main() {
    int i, j;
    int temp;
    int a[5] = {75, 95, 85, 100, 50};
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4 - i; j++) {
            if (a[j] > a[j + 1]) {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
    for (i = 0; i < 5; i++) {
        printf("%d", a[i]);
    }
}
답: 50758595100
                               

void main() {
    int i, j;
    int temp;
    int a[5] = {75, 95, 85, 100, 50};
→ 변수 정의
→ temp는 임시로 쓰는 변수다.

    for (i = 0; i < 4; i++) {

        for (j = 0; j < 4 - i; j++) {
            if (a[j] > a[j + 1]) {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;


    for (i = 0; i < 5; i++) {

        printf("%d", a[i]);
→ i의 값을 하나씩 대입해서 출력해라.
그러므로 50 75 85 95 100 으로 정렬된다. (띄어쓰기 없음)

 

 

[21년 2회]
18. 다음은 C언어 문제이다. 출력값을 작성하시오.

int main() {
    int ary[3];
    int s = 0;
    *(ary + 0) = 1;
    ary[1] = *(ary + 0) + 2;
    ary[2] = *ary + 3;
    for (int i = 0; i < 3; i++) {
        s = s + ary[i];
    }
    print("%d", s);
}
답: 8
                               

int main() {
    int ary[3];
    int s = 0;
→ 변수 정의
ary[3] : 3개의 배열을 가진 ary를 만든다.

    *(ary + 0) = 1;
*(ary + 0) : ary + 0 은 ary[0] 을 말하며, ary[0] 의 해당 주소(*)를 말한다.
ary[0]의 주소에 1을 넣어라.
즉, ary[0] 은 1 값이 들어간다.


    ary[1] = *(ary + 0) + 2;
*(ary + 0) : ary[0]의 주소에 있는 값에 +2를 해라. 1+2 = 3 가 된다.
즉, ary[1] 는 3 값이 들어간다.


    ary[2] = *ary + 3;
*ary + 3 : ary의 주소의 첫 값은 ary[0] 이므로, 여기에 +3을 해라 1+3 = 4
즉, ary[2] 는 3 값이 들어간다.


아래와 같은 형태가 된다.


    for (int i = 0; i < 3; i++) {

        s = s + ary[i];
int i = 0 : i 의 초기값 0
 i < 3 : 0부터 3까지(0~2) 반복수행해라.
i++ : 반복할 때마다 i 값은 1 증가한다.

s = s + ary[i];


    print("%d", s);

→ s는 8일 때 반복문 종료되므로 8이 출력된다.

 


[22년 2회]

16. 다음 C언어 코드에서 알맞는 출력값을 작성하시오.

#include <stdio.h>
int main(int argc, char *argv[]) {
    int a[4] = {0, 2, 4, 8};
    int b[3] = {0};
    int i = 1;
    int sum = 0;
    int *p1;
    for (i = 1; i < 4; i++) {
        p1 = a + i;
        b[i - 1] = *p1 - a[i - 1];
        sum = sum + b[i - 1] + a[i];
    }
    printf("%d\n", sum);
    return 0;
}
답: 22
                               

#include <stdio.h>
int main(int argc, char *argv[]) {
    int a[4] = {0, 2, 4, 8};
    int b[3] = {0};
    int i = 1;
    int sum = 0;
    int *p1;
→ 변수 정의

    for (i = 1; i < 4; i++) {
        p1 = a + i;
        b[i - 1] = *p1 - a[i - 1];
        sum = sum + b[i - 1] + a[i];

※ p1 : 시작 지점의 방 번호(주소), 강남구 역삼동 100번지라는 위치 정보
※ *p1 : 그 주소에 살고 있는 사람(값), 100번지 문을 열고 들어갔을 때 만나는 데이터
→ 그렇기 때문에 p1 의 값을 구했어도, *p1을 해야, 그 안에 있는 값 하나를 호출할 수 있다.


    printf("%d\n", sum);
    return 0;
→ sum 값은 22

 


[23년 2회]

1. 다음은 C언어 코드의 문제이다. 보기의 조건에 맞도록 괄호안에 알맞은 코드를 작성하시오.

int main(void) {
    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;
}
[보기] 입력값이 54321일 경우 출력값이 43215로 출력되어야 한다.
답: n[(i+1) % 5]
                               

scanf 로 입력된 54321 이 'n배열(&n[i])로 들어감.
결과값이 43215로 한칸씩 밀렸으므로, 배열의 위치값을 바꿔주는 식이 필요함.



배열의 시작 위치를 한 칸 옆(i + 1)으로 옮기고, 배열의 크기(5)로 나눈 나머지를 구해서 인덱스 범위를 유지

 


[22년 3회]

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

void main{
field {{0,1,0,1},{0,0,0,1},{1,1,1,0},{0,1,1,1}};
mines {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; 
int w = 4, h = 4;
  for(y=0; y<h; y++) {
    for(x=0; x<w; x++) {  
    if(field[y][x] == 0) continue;
      for(i=y-1; i<=y+1; i++) {
        for(j=x-1; j<=x+1; j++) {
          if(calculate(w,h,j,i) == 1) {
            mines[i][j] += 1;
          }
        }
      }
    }
  }
  for(y=0; y<h; y++){
    for(x=0; x<w; x++)
      printf("%d", mines[y][x]);
      printf("\n");
  }
}
int calculate(w,h,j,i) {
  if (i >= 0 && i < h && j >= 0 && j < w) return 1;
  return 0;
}

 

답:
1 1 3 2
3 4 5 3
3 5 6 4
3 5 5 3
                               

지뢰 찾기 매커니즘을 이해해야 풀 수 있다.

 


[24년 2회]

13. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.

#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
                               
int main() {
    int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};


    int* parr[2] = {arr[1], arr[2]};
* parr[2]  : 주소값을 담는 바구니 2개를 만듦
int* parr[2] = {arr[1], arr[2]} : parr[0] = arr[1]의 시작 주소를 가짐, parr[1] = arr[2]의 시작주소를 가짐


    printf("%d", parr[1][1] + *(parr[1] + 2) + **parr);
parr[1][1] : parr[1] 은 arr[2]의 시작주소. 거기서 [1]번 인덱스를 찾아라


*(parr[1] + 2) : parr[1] 은 arr[2]의 시작주소. 시작주소에 +2를 하고, 그 주소에 있는 값(*)을 가져와라


parr : 포인터 배열 그 자체의 주소. parr = parr[0]이 있는 곳을 가리킴
*parr : parr[0] 에 담긴 주소값인 arr[1]의 주소를 꺼내라 (※parr 이 arr의 주소를 지정했기 때문)
**parr : 그 주소로 직접 찾아가서 값을 꺼내라. arr[1][0]


printf("%d", parr[1][1] + *(parr[1] + 2) + **parr) : 8 + 9 + 4

 


[25년 1회]

10. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.

#include <stdio.h>
char Data[5] = { 'B', 'A', 'D', 'E' };
char c;
int main() {
    int i, temp, temp2;
    c = 'C';
    printf("%d\n", Data[3] - Data[1]);
    for (i = 0; i < 5; ++i) {
        if (Data[i] > c)
            break;
    }
    temp = Data[i];
    Data[i] = c;
    i++;
    for (; i < 5; ++i) {
        temp2 = Data[i];
        Data[i] = temp;
        temp = temp2;
    }
    for (i = 0; i < 5; i++) {
        printf("%c", Data[i]);
    }
    return 0;
}
답:
4
BACDE
                               

 


[24년 3회]

16. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.

#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 = 10;
    func(pp, 5);
    num = arr[2]
    printf("%d", num);
    return 0;
}
답: 1