출처 : https://chobopark.tistory.com/540
[2025년 1회] 정보처리기사 실기 복원 문제
안녕하세요. 2025년 1회 정보처리기사 실기 기출문제를 정리해보았습니다.해당 복원된 기출문제가 많은 분들에게 도움이 되었으면 좋겠습니다.정보처리기사 개편안인 2020년 시험부터 기출문제
chobopark.tistory.com
1. 다음은 네트워크 보완에 관련된 문제이다. 괄호안에 알맞는 용어를 작성하시오.
( )은/는 '세션을 가로채다.' 라는 의미로 다른 사람의 세션 상태를 훔치거나 도용하여 액세스하는 해킹 기법이다.
TCP ( )은/는 TCP의 3-way 핸드셰이크가 완료된 후에 공격자가 시퀀스 번호 등을 조작하여 정상적인 세션을 가로채고 인증 없이 통신을 탈취하는 공격 공격이다.
정답 : 세션 하이재킹
2. 다음은 제약조건과 관련된 문제이다. 괄호안에 알맞는 용어를 보기에 골라 작성하시오.

[보기]
개체, 참조, 도메인
정답 :
ㄱ-도메인
ㄴ-개체
ㄷ-참조
3. 아래의 내용에서 설명 글의 괄호안의 용어를 영문 약자로 작성하시오.
( ) 은/는 3글자의 영어 약자로 이루어진 오류 기법으로 데이터를 전송하거나 저장할 때 데이터의 오류를 감지하는 데 사용되는 오류 검출 코드이다.
( ) 은/는 데이터에 체크섬을 추가하여 데이터를 전송하거나 저장한 후, 수신 또는 읽을 때 이 체크섬을 다시 계산하여 데이터가 변경되었는지 확인하는 기법이다.
( ) 은/는 데이터 전송의 안정성을 높이는 데 중요한 역할을 한다.
데이터는 이진수(0과 1)로 표현되며 정해진 다항식(x³ + x + 1)을 기반으로 데이터를 2진수 나눗셈하고나머지를 ( ) 값으로 삼는다.
정답 : CRC
4. 다음은 악성코드 관련된 문제이다. 아래 내용을 확인하여 보기에 골라 작성하시오.
사용자가 원치 않는 소프트웨어를 구매하도록 조작하기 위해 사회 공학을 사용하여 충격, 불안 또는 위협에 대한 인식을 유발하는 악성 소프트웨어의 한 형태이다.
‘겁을 주다’라는 영어 단어에서 유래한 것으로 공포를 이용하여 피해자를 속여 대가를 지불 하거나 특정 행동을 유도하는 랜섬웨어이다.
가짜 바이러스 경고나 시스템 문제를 표시하여 사용자가 돈을 지불하거나 특정 소프트웨어를 설치하도록 속이는 방식으로 작동한다.
[보기]
ㄱ. 컴포넌트 웨어 ㄴ. 유즈웨어 ㄷ. 셔블웨어 ㄹ. 스캐어 웨어 ㅁ. 안티 스파이 웨어 ㅂ. 네트웨어 ㅅ. 그룹웨어 ㅇ. 애드웨어
정답 : ㄹ. 스캐어 웨어
5. 다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class Main {
public static void main(String[] args) {
int a=5,b=0;
try{
System.out.print(a/b);
}catch(ArithmeticException e){
System.out.print("출력1");
}catch(ArrayIndexOutOfBoundsException e) {
System.out.print("출력2");
}catch(NumberFormatException e) {
System.out.print("출력3");
}catch(Exception e){
System.out.print("출력4");
}finally{
System.out.print("출력5");
}
}
}
|
정답 : 출력1출력5
풀이 :
0으로 나누게 되면 ArithmeticException catch문에 걸리고 finally문이 최종적으로 호출
6. 아래 내용은 ARP/RARP에 대한 설명이다. 각 설명에 해당하는 것을 작성하시오.
( 1 ) 은/는 네트워크상에서 IP 주소를 MAC 주소로 변환하는 프로토콜이고,
( 2 ) 은/는 MAC 주소를 IP 주소로 변환하는 프로토콜이다.
( 1 ) - ARP
( 2 ) - RARP
7. 다음은 SQL 문제이다. 아래 두 테이블을 참고하여 보기에 쿼리 실행 결과를 작성하시오.

[보기]
SELECT name, incentives FROM emp, sal WHERE emp.id = sal.id and incentives >= 500
name | incentives
이순신 | 1000
8. 아래는 데이터베이스에 관련된 설명이다. 알맞는 용어를 보기에서 골라 괄호를 작성하시오.
1. 릴레이션에서 속성의 개수를 의미 : ( 1 )
2. 릴레이션에서 튜플의 개수를 의미 : ( 2 )
3. 한 릴레이션의 속상이 다른 릴레이션의 기본 키를 참조할 때, 참조하는 속성을 의미 : ( 3 )
4. 특정 속성에 대해 입력될 수 있는 값의 유형이나 범위를 의미하고 무결성을 보장하는 기준 : ( 4 )
[보기]
ㄱ. domain ㄴ. primary ㄷ. degree ㄹ. candidate ㅁ. cardinality ㅂ. attribute ㅅ. foreign
( 1 ) - ㄷ
( 2 ) - ㅁ
( 3 ) - ㅅ
( 4 ) - ㄱ
9. IP 주소가 192.168.35.10, 서브넷 255.255.252.0인 PC에서 브로드캐스팅으로 다른 IP로 정보를 전달한다고 할 때 수신할 수 있는 알맞는 IP를 보기에서 골라 모두 작성하시오.
[보기]
ㄱ. 192.168.34.1
ㄴ. 192.168.32.19
ㄷ. 192.168.35.200
ㄹ. 192.168.33.138
ㅁ. 192.168.35.50
정답 : ㄱ, ㄴ, ㄷ, ㄹ, ㅁ
풀이 :
→ 네트워크 주소 : 3번째 옥텟인 35와 252의 AND연산 = 32
- 192.168.32.0
→ 브로드캐스트 주소 : (네트워크 주소 + 호스트 비트 최대값) = 35, 서브넷 마스크에서 0인 자리를 모두 1로 바꾸면 = 255
- 192.168.35.255
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]);
}
}
정답 : 4
BACDE
※ 첫번째 출력에 \n이 있다는걸 인지
풀이 :
Data[3] = 'E'
Data[1] = 'A'
c = 'C'
첫번째 출력문 'E' - 'A' = 4(아스키를 몰라도 A와 E가 4차이)
Data[2] = 'D'이므로 for문은 i = 2에서 멈춤
temp = Data[2] = 'D'
Data[2] = 'C'
{'B', 'A', 'C', 'E'}
i++ → i = 3
두번째 for문
- Step 1: i=3
- temp2 = Data[3] = 'E'
- Data[3] = temp = 'D'
- temp = temp2 = 'E'
- Step 2: i=4
- temp2 = Data[4] = 0
- Data[4] = temp = 'E'
- temp = temp2 = 0
{'B', 'A', 'C', 'D', 'E'}
세번째 for문은 배열 출력
BACDE
11. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h>
#include <stdlib.h>
void set(int** arr, int* data, int rows, int cols) {
for (int i = 0; i < rows * cols; ++i) {
arr[((i + 1) / rows) % rows][(i + 1) % cols] = data[i];
}
}
int main() {
int rows = 3, cols = 3, sum = 0;
int data[] = {5, 2, 7, 4, 1, 8, 3, 6, 9};
int** arr;
arr = (int**) malloc(sizeof(int*) * rows);
for (int i = 0; i < cols; i++) {
arr[i] = (int*) malloc(sizeof(int) * cols);
}
set(arr, data, rows, cols);
for (int i = 0; i < rows * cols; i++) {
sum += arr[i / rows][i % cols] * (i % 2 == 0 ? 1 : -1);
}
for(int i=0; i<rows; i++) {
free(arr[i]);
}
free(arr);
printf("%d", sum);
}
정답 : 13
풀이 :
첫번째 for문 열 배치
arr = (int**) malloc(sizeof(int*) * rows);
arr → [ ptr0 ] [ ptr1 ] [ ptr2 ] (rows = 3)
두번째 for문 행 배치
각 위 각 ptr에 3개의 int 공간을 확보
ptr0 → [ int0, int1, int2 ]
ptr1 → [ int0, int1, int2 ]
ptr2 → [ int0, int1, int2 ]
set함수 호출
| i | ((i + 1) / rows) % rows | (i + 1) % cols | data[i] |
| 0 | 0 | 1 | 5 |
| 1 | 0 | 2 | 2 |
| 2 | 1 | 0 | 7 |
| 3 | 1 | 1 | 4 |
| 4 | 1 | 2 | 1 |
| 5 | 2 | 0 | 8 |
| 6 | 2 | 1 | 3 |
| 7 | 2 | 2 | 6 |
| 8 | 0 | 0 | 9 |
완성된 2차원 배열
| 9 | 5 | 2 |
| 7 | 4 | 1 |
| 8 | 3 | 6 |
세번째 for문 sum진행
| i | i / 3 | i % 3 | arr[a][b] | sum |
| 0 | 0 | 0 | 9 | 9 |
| 1 | 0 | 1 | 5 | 4 |
| 2 | 0 | 2 | 2 | 6 |
| 3 | 1 | 0 | 7 | -1 |
| 4 | 1 | 1 | 4 | 3 |
| 5 | 1 | 2 | 1 | 2 |
| 6 | 2 | 0 | 8 | 10 |
| 7 | 2 | 1 | 3 | 7 |
| 8 | 2 | 2 | 6 | 13 |
12. 다음은 결합도와 관련된 내용이다. 보기에 알맞는 답을 골라 작성하시오.
(1) 다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우의 결합도
(2) 모듈 간의 인터페이스로 배열이나 오브젝트, 자료구조 등이 전달되는 경우의 결합도
(3) 파라미터가 아닌 모듈 밖에 선언되어 있는 전역 변수를 참조하고 전역 변수를 갱신하는 식으로 상호작용하는 경우의 결합도
[보기]
ㄱ. 자료 결합도 ㄴ. 스탬프 결합도 ㄷ. 제어 결합도 ㄹ. 공통 결합도 ㅁ. 내용 결합도 ㅂ. 외부 결합도
정답 :
(1) - ㅁ
(2) - ㄴ
(3) - ㄹ
풀이:
| 종류 | 설명 | 예시 |
| 자료 결합 (Data Coupling) |
모듈 간 데이터만 전달 | 배열, 구조체, 객체 등 필요한 데이터만 전달. 모듈 내부 구조 몰라도 됨 |
| 스탬프 결합 (Stamp Coupling) |
복잡한 자료 구조를 통째로 전달 | 구조체, 객체 등 전체를 전달하지만 일부만 사용 |
| 제어 결합 (Control Coupling) |
다른 모듈의 동작을 제어하는 신호 전달 | 함수 호출 시 플래그 값 전달하여 동작 분기 |
| 외부 결합 (External Coupling) |
전역 변수나 외부 시스템 의존 | 전역 변수, 파일, 데이터베이스, 외부 라이브러리 의존 |
| 공통 결합 (Common Coupling) |
여러 모듈이 동일 전역 데이터를 공유 | 전역 변수나 공용 메모리를 여러 모듈에서 참조 |
| 내용 결합 (Content Coupling) |
다른 모듈 내부를 직접 참조 | 다른 모듈의 내부 코드, 변수, 기능까지 접근 |
13. 다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
new Child();
System.out.println(Parent.total);
}
}
class Parent {
static int total = 0;
int v = 1;
public Parent() {
total += (++v);
show();
}
public void show() {
total += total;
}
}
class Child extends Parent {
int v = 10;
public Child() {
v += 2;
total += v++;
show();
}
@Override
public void show() {
total += total * 2;
}
}
정답 : 54
풀이 :
자식 생성자 호출 시 부모 생성자 먼저 호출
new Child() 호출
→ 부모 생성자가 먼저 호출됨
Parent() 생성자 실행
→ total = 0 + 2 = 2
실제 객체는 Child()이기에 자식의 show() 호출
→ total = 2 + 2 * 2 = 6
----- Parent() 종료 -----
Child() 생성자 실행
v += 2 여기서 v는 자식의 v이므로 v = 12
total += v++; 여기서 total은 부모의 total이므로 6 + 12 = 18, v = 13
show() 호출(Child의 show)
→ total = 18 + 18 * 2 = 54
----- Child() 종료 -----
Parent.total = 54
14. 아래는 디자인 패턴에 대한 설명이다. 알맞는 답을 보기에 골라 작성하시오.
(1) 서로 다른 인터페이스를 가진 클래스들을 연결해 사용 가능하게 한다.
(2) 기존 클래스(Adaptee)를 원하는 인터페이스(Target)에 맞게 변환하는 어댑터(Adapter)를 만든다.
(3) 기존 클래스를 감싸서(wrapper) 인터페이스를 변환해주는 역할을 한다.
[보기]

정답 :
Adapter
15. 문장(Statement) 커버리지 테스트를 수행하려고 한다. 코드를 아래의 제어 흐름도 빈칸에 연결되도록 작성하고 문장 커버리지 순서대로 작성하시오.
int Main(int b[], int m, int x) {
int a = 0;
while (a < m || b[a] < x) {
if (b[a] < 0)
b[a] = -b[a];
a++;
}
return 1;
}
[흐름도]

1. ( ① ) 2. ( ② ) 3. ( ③ ) 4. ( ④ ) 5. ( ⑤ ) 6. ( ⑥ )
문장 커버리지 순서 1 → 2 → ( ⑦ )
정답 :
(1) int a = 0
(2) a < m || b[a] < x
(3) b[a] < 0
(4) b[a] = -b[a];
(5) a++;
(6) return 1;
(7) ③ → ④ → ⑤ → ② → ⑥
16. 다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
int[] data = {3, 5, 8, 12, 17};
System.out.println(func(data, 0, data.length - 1));
}
static int func(int[] a, int st, int end) {
if (st >= end) return 0;
int mid = (st + end) / 2;
return a[mid] + Math.max(func(a, st, mid), func(a, mid + 1, end));
}
}
정답 : 20
풀이 :
func(data, 0, data.length - 1) 호출
st = 0
end = data.length - 1 = 4
mid = 2
a[2] = 8
return a[2] + Math.max(func(a, 0, 2), func(a, 3, 4));
a[2] = 8
func(a, 0, 2) = 8
func(a, 3, 4) = 12
왼쪽 func(a, 0, 2) = 8
st = 0
end = 2
mid = 1
a[1] = 5
왼쪽 func(a, 0, 1) = 3
st = 0
end = 1
mid = 0
a[0] = 3
왼쪽 func(a, 0, 0) = 0
오른쪽 func(a, 1, 1) = 0
오른쪽 func(a, 2, 2) = 0
오른쪽 func(a, 3, 4) = 12
st = 3
end = 4
mid = 3
a[3] = 12
왼쪽 func(a, 3, 3) = 0
오른쪽 func(a, 4, 4) = 0
17. 다음은 파이썬에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
class Node:
def __init__(self, value):
self.value = value
self.children = []
def tree(li):
nodes = [Node(i) for i in li]
for i in range(1, len(li)):
nodes[(i - 1) // 2].children.append(nodes[i])
return nodes[0]
def calc(node, level=0):
if node is None:
return 0
return (node.value if level % 2 == 1 else 0) + sum(calc(n, level + 1) for n in node.children)
li = [3, 5, 8, 12, 15, 18, 21]
root = tree(li)
print(calc(root))
정답 : 13
풀이 :
def tree(li)
nodes = [Node(i) for i in li] → li의 값을 Node 객체로 감싼 뒤 리스트에 저장
nodes = [
Node(3), # index 0
Node(5), # index 1
Node(8), # index 2
Node(12), # index 3
Node(15), # index 4
Node(18), # index 5
Node(21) # index 6
]
for i in range(1, len(li)):
nodes[ (i - 1) // 2 ].children.append(nodes[i])
→ (i - 1) // 2로 부모 인덱스 계산
- i = 1: 부모 = (1-1)//2 = 0 → 3.children = [5]
- i = 2: 부모 = (2-1)//2 = 0 → 3.children = [5, 8]
- i = 3: 부모 = (3-1)//2 = 1 → 5.children = [12]
- i = 4: 부모 = (4-1)//2 = 1 → 5.children = [12, 15]
- i = 5: 부모 = (5-1)//2 = 2 → 8.children = [18]
- i = 6: 부모 = (6-1)//2 = 2 → 8.children = [18, 21]
return nodes[0] → 루트 노드를 반환
def calc(node, lelvel=0)
if node is None: return 0 → 노드가 None이면 0 반환
(node.value if level % 2 == 1 else 0) → 현재 노드 레벨이 홀수면 node.value 짝수이면 0 반환
sum(calc(n, level + 1) for n in node.children)
→ 현재 노드의 자식에 대해 재귀 호출
level=0, 짝수 0 + (왼쪽1 + 오른쪽1) = 13
왼쪽1 level=1, 홀수 5 + (왼쪽2 = level=2 = 0 + 오른쪽2 = level=2 = 0)
오른쪽1 level=1, 홀수 8 + (왼쪽2 = level=2 = 0 + 오른쪽2 = level=2 = 0)
18. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h>
#include <stdlib.h>
typedef struct Data {
int value;
struct Data *next;
} Data;
Data* insert(Data* head, int value) {
Data* new_node = (Data*)malloc(sizeof(Data));
new_node->value = value;
new_node->next = head;
return new_node;
}
Data* reconnect(Data* head, int value) {
if (head == NULL || head->value == value) return head;
Data *prev = NULL, *curr = head;
while (curr != NULL && curr->value != value) {
prev = curr;
curr = curr->next;
}
if (curr != NULL && prev != NULL) {
prev->next = curr->next;
curr->next = head;
head = curr;
}
return head;
}
int main() {
Data *head = NULL, *curr;
for (int i = 1; i <= 5; i++)
head = insert(head, i);
head = reconnect(head, 3);
for (curr = head; curr != NULL; curr = curr->next)
printf("%d", curr->value);
return 0;
}
정답 : 35421
풀이 :
Data *head = NULL, *curr; → 초기화
for (int i = 1; i <= 5; i++)
head = insert(head, i);
5 → 4 → 3 → 2 → 1 → NULL 인 연결리스트가 생성됨
head = reconnect(head, 3);
while문을 통해 value = 3일때까지 반복해서 prev = 4 curr = 3 next = 2인 상태
prev -> next = curr -> next
3의 연결을 끊는 작업 prev가 curr의 next와 연결되게 하는 작업
curr -> next = head
curr을 head 앞에 붙이는 작업
head = curr으로 head를 바꿈
3 → 5 → 4 → 2 → 1
19.다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h>
typedef struct student {
char* name;
int score[3];
} Student;
int dec(int enc) {
return enc & 0xA5;
}
int sum(Student* p) {
return dec(p->score[0]) + dec(p->score[1]) + dec(p->score[2]);
}
int main() {
Student s[2] = { "Kim", {0xA0, 0xA5, 0xDB}, "Lee", {0xA0, 0xED, 0x81} };
Student* p = s;
int result = 0;
for (int i = 0; i < 2; i++) {
result += sum(&s[i]);
}
printf("%d", result);
return 0;
}
정답 : 908
풀이 :
Kim의 Score = 0xA0, 0xA5, 0xDB
dec(0xA0) + dec(0xA5) + dec(0xDB)
dec(0xA0) = 10100000 & 10100101 = 10100000 = 0xA0 = 160
dec(0xA5) = 10100101 & 10100101 = 10100101 = 0xA5 = 165
dec(0xDB) = 1101011 & 10100101 = 10000001 = 0x81 = 129
= 454
Lee의 Score = 0xA0, 0xED, 0x81
dec(0xA0) + dec(0xED) + dec(0xDB)
dec(0xA0) = 10100000 & 10100101 = 10100000 = 0xA0 = 160
dec(0xED) = 11101101 & 10100101 = 10100101 = 0xA5 = 165
dec(0x81) = 10000001 & 10100101 = 10000001 = 0x81 = 129
= 454
20. 다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class Main {
public static void main(String[] args) {
System.out.println(calc("5"));
}
static int calc(int value) {
if (value <= 1) return value;
return calc(value - 1) + calc(value - 2);
}
static int calc(String str) {
int value = Integer.valueOf(str);
if (value <= 1) return value;
return calc(value - 1) + calc(value - 3);
}
}
정답 : 4
풀이 :
calc("5")에서 매개변수가 문자열(String)이 입력됐으므로 두번째 calc를 호출
value = 5
재귀 진행
calc(4) + calc(2) 여기서 calc는 int를 매개변수로 받는 함수
calc(4) = calc(3) + calc(2) = 2 + 1 = 3
calc(3) = calc(2) + calc(1) = 2
calc(2) = calc(1) + calc(0) = 1
→ calc(4) + calc(2) = 3 + 1 = 4
'이론공부 > 정보처리기사 실기 기출' 카테고리의 다른 글
| 정보처리기사 실기(23년 3회 기출복원) (0) | 2025.09.16 |
|---|---|
| 정보처리기사 실기(24년 1회 기출복원) (0) | 2025.09.14 |
| 정보처리기사 실기(24년 2회 기출복원) (0) | 2025.09.14 |
| 정보처리기사 실기(24년 3회 기출복원) (0) | 2025.09.13 |
| 정보처리기사 실기(25년 2회 기출복원) (0) | 2025.09.11 |