[정보처리기사] 2025년도 1회차 복원문제풀이

https://chobopark.tistory.com/540

 

[2025년 1회] 정보처리기사 실기 복원 문제

안녕하세요. 2025년 1회 정보처리기사 실기 기출문제를 정리해보았습니다.해당 복원된 기출문제가 많은 분들에게 도움이 되었으면 좋겠습니다.정보처리기사 개편안인 2020년 시험부터 기출문제

chobopark.tistory.com

 

다음의 복원 문제를 기반으로 작성하였다.

 

1. 다음은 네트워크 보완에 관련된 문제이다. 괄호안에 알맞는 용어를 작성하시오.

 

 

(   )은/는 '세션을 가로채다.' 라는 의미로 다른 사람의 세션 상태를 훔치거나 도용하여 액세스하는 해킹 기법이다. 

 

TCP (   )은/는 TCP의 3-way 핸드셰이크가 완료된 후에 공격자가 시퀀스 번호 등을 조작하여 정상적인 세션을 가로채고 인증 없이 통신을 탈취하는 공격 공격이다.

 

정답 : 세션 하이재킹

 

출처 : https://developer.mozilla.org/ko/docs/Glossary/Session_Hijacking

 

 

 

 

2. 다음은 제약조건과 관련된 문제이다. 괄호안에 알맞는 용어를 보기에 골라 작성하시오.

 

 

[보기]

 

개체, 참조, 도메인

 

데이터 베이스 무결성 제약 조건에 관한 문제

 

정답 : ㄱ - 도메인 , ㄴ - 개체 ,ㄷ-참조

출처 : 한국정보통신기술협회(https://terms.tta.or.kr/mobile/main.do)

 

 

3. 아래의 내용에서 설명 글의 괄호안의 용어를 영문 약자로 작성하시오.

 

 

(        ) 은/는 3글자의 영어 약자로 이루어진 오류 기법으로 데이터를 전송하거나 저장할 때 데이터의 오류를 감지하는 데 사용되는 오류 검출 코드이다.


(        ) 은/는 데이터에 체크섬을 추가하여 데이터를 전송하거나 저장한 후, 수신 또는 읽을 때 이 체크섬을 다시 계산하여 데이터가 변경되었는지 확인하는 기법이다.


(        ) 은/는 데이터 전송의 안정성을 높이는 데 중요한 역할을 한다.


데이터는 이진수(0과 1)로 표현되며 정해진 다항식(x³ + x + 1)을 기반으로 데이터를 2진수 나눗셈하고나머지를 (       ) 값으로 삼는다.

 

정답 : CRC

 

출처 : 위키피디아(https://ko.wikipedia.org/wiki)

 

 

4. 다음은 악성코드 관련된 문제이다. 아래 내용을 확인하여 보기에 골라 작성하시오.


사용자가 원치 않는 소프트웨어를 구매하도록 조작하기 위해 사회 공학을 사용하여 충격, 불안 또는 위협에 대한 인식을 유발하는 악성 소프트웨어의 한 형태이다.

‘겁을 주다’라는 영어 단어에서 유래한 것으로 공포를 이용하여 피해자를 속여 대가를 지불 하거나 특정 행동을 유도하는 랜섬웨어이다.

가짜 바이러스 경고나 시스템 문제를 표시하여 사용자가 돈을 지불하거나 특정 소프트웨어를 설치하도록 속이는 방식으로 작동한다.

 

 

보기

 

ㄱ. 컴포넌트 웨어  ㄴ. 유즈웨어  ㄷ. 셔블웨어  ㄹ. 스캐어 웨어  ㅁ. 안티 스파이 웨어  ㅂ. 네트웨어  ㅅ. 그룹웨어  ㅇ. 애드웨어

 

정답  : ㄹ - 스캐어 웨어

출처 : IBM(https://www.ibm.com/kr-ko/think/topics/scareware)

 

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. int a=5, b=0;

2. try 블록 실행: System.out.print(a/b);

  • 5 / 0 나누기 연산 실행
  • Java에서 정수를 0으로 나누면 ArithmeticException발생

3. 예외 발생 -> catch 블록 탐색

catch(ArithmeticException e){

      System.out.print("출력1");

}

다음의 cath 발생

4. finally 블록은 무조건 실행

finally{
      System.out.print("출력5");
    }

 

정답 : 

 

 

6. 아래 내용은 ARP/RARP에 대한 설명이다. 각 설명에 해당하는 것을 작성하시오.

 


( 1 ) 은/는 네트워크상에서 IP 주소를 MAC 주소로 변환하는 프로토콜이고,

( 2 ) 은/는 MAC 주소를 IP 주소로 변환하는 프로토콜이다.

 

정답 : ARP , RARP

 

출처 : 위키피디아(https://ko.wikipedia.org/wiki)

 

 

7. 다음은 SQL 문제이다. 아래 두 테이블을 참고하여 보기에 쿼리 실행 결과를 작성하시오.

 

 

 

[보기]

 

SELECT name, incentive FROM emp, sal WHERE emp.id = sal.id and incentives >= 500

 

과정 : 

FROM emp, sal

->WHERE 절에서 emp.id = sal.id 조건이 있으므로 내부 조인 처럼 동작
WHERE emp.id = sal.id AND incentives >= 500;

-> WHERE emp.id = sal.id
공통 id만 남김

1002 (홍길동) , 1004 (강감찬) , 1008 (이순신)

 

추가 조건 : incentives >= 500

1002: incentives = 300 (X)

1004: incentives = 300 (X)

1008: incentives = 1000 (O)

 

SELECT name, incentive

name incentive

이순신 1000

 

정답 : 이순신 1000

 

8. 아래는 데이터베이스에 관련된 설명이다. 알맞는 용어를 보기에서 골라 괄호를 작성하시오.


1. 릴레이션에서 속성의 개수를 의미 : ( 1 )

2. 릴레이션에서 튜플의 개수를 의미 : ( 2 )

3. 한 릴레이션의 속상이 다른 릴레이션의 기본 키를 참조할 때, 참조하는 속성을 의미 : ( 3 )

4. 특정 속성에 대해 입력될 수 있는 값의 유형이나 범위를 의미하고 무결성을 보장하는 기준 : ( 4 )

 

[보기]

 

ㄱ. domain   ㄴ. primary   ㄷ. degree    ㄹ. candidate   ㅁ. cardinality   ㅂ. attribute   ㅅ. foreign

 

출처 : 위키독스 - 무조건, 데이터베이스(https://wikidocs.net/274519)

 

정답 :

1 -  ㄷ. degree

2 - ㅁ. cardinality

3 - ㅅ. foreign

4 - ㄱ. domain

 

 

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

 

--- ChatGPT 대답 ---

서브넷 마스크 : 255.255.252.0

이진수로 표현하면:

255.255.252.0 = 11111111.11111111.11111100.00000000

즉, 앞의 22비트는 네트워크, 뒤의 10비트는 호스트입니다.

 

IP 주소: 192.168.35.10

이진수 표현:

192 = 11000000
168 = 10101000
35  = 00100011
10  = 00001010

 

네트워크 주소 구하기 (AND 연산)

IP:     11000000.10101000.00100011.00001010
MASK:   11111111.11111111.11111100.00000000
-------------------------------------------
Result: 11000000.10101000.00100000.00000000
      = 192.168.32.0   ← 네트워크 주소

 

 

브로드캐스트 주소 구하기 (호스트 비트 모두 1)

유효 호스트 범위

  • 유효한 호스트 IP: 192.168.32.1 ~ 192.168.35.254
  • 192.168.32.0: 네트워크 주소 X
  • 192.168.35.255: 브로드캐스트 주소 X

보기 IP 포함 여부 

192.168.34.1 O 범위 내 (192.168.32.1 ~ 192.168.35.254)
192.168.32.19 O 범위 내
192.168.35.200 O 범위 내
192.168.33.138 O 범위 내
192.168.35.50 O 범위 내

 

정답 : ㄱ,ㄴ,ㄷ,ㄹ,ㅁ

 

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

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
#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]);
    }
}

과정 : 

1. 초기 값

char Data[5] = {'B', 'A', 'D', 'E'}; // Data 배열
// 인덱스:      0    1    2    3
// 값:        'B'  'A'  'D'  'E'

문자 'C'는 ASCII 코드 67

'A' = 65, 'B' = 66, 'D' = 68, 'E' = 69

2. 첫 번째 출력

printf("%d\n", Data[3] - Data[1]);
→ 'E' - 'A' = 69 - 65 = 4

출력1: 4

3. for문: if(Data[i] > c) 

for(i=0; i<5; ++i){
    if(Data[i] > c) break;
}

c = 'C' (67)

Data[0] = 'B' (66)

Data[1] = 'A' (65) 

Data[2] = 'D' (68)

→ i = 2

 

'C' 삽입 

temp = Data[i];      // temp = 'D'
Data[i] = c;         // Data[2] = 'C'
i++;                 // i = 3

이제 배열은: {'B', 'A', 'C', 'E'} 이고, temp = 'D'

for(; i<5; ++i){
    temp2 = Data[i];
    Data[i] = temp;
    temp = temp2;
}

i=3:

temp2 = 'E'

Data[3] = 'D'

temp = 'E'

 

i=4:

temp2 = ? (초기화되지 않은 값)
Data[4] = temp = 'E'

최종 Data = {'B', 'A', 'C', 'D', 'E'}

 

출력값 : 

 

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

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
30
31
#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[] = {527418369}; 
    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);
}

과정 : 

1. 기본 데이터 구조

int rows = 3, cols = 3, sum = 0;
int data[] = {5, 2, 7, 4, 1, 8, 3, 6, 9};

 

총 rows * cols = 9개의 요소를 채우게 됨

int** arr;
arr = (int**) malloc(sizeof(int*) * rows);
for (int i = 0; i < cols; i++) {
    arr[i] = (int*) malloc(sizeof(int) * cols);
}

arr은 3x3 정수형 배열로 동적 생성됨

즉, arr[0], arr[1], arr[2]는 각 3칸의 int 배열

 

2. set 함수 분석

for (int i = 0; i < rows * cols; ++i) {
    arr[((i + 1) / rows) % rows][(i + 1) % cols] = data[i];
}

2차원 배열을 1차원으로 접근

data[i]를 아래 좌표에 할당

row = ((i + 1) / rows) % rows
col = (i + 1) % cols

 

각 i 값마다 계산된 인덱스값

0 1 (1 / 3) % 3 = 0 1 % 3 = 1 arr[0][1] 5
1 2 (2 / 3) % 3 = 0 2 % 3 = 2 arr[0][2] 2
2 3 (3 / 3) % 3 = 1 3 % 3 = 0 arr[1][0] 7
3 4 (4 / 3) % 3 = 1 4 % 3 = 1 arr[1][1] 4
4 5 (5 / 3) % 3 = 1 5 % 3 = 2 arr[1][2] 1
5 6 (6 / 3) % 3 = 2 6 % 3 = 0 arr[2][0] 8
6 7 (7 / 3) % 3 = 2 7 % 3 = 1 arr[2][1] 3
7 8 (8 / 3) % 3 = 2 8 % 3 = 2 arr[2][2] 6
8 9 (9 / 3) % 3 = 0 9 % 3 = 0 arr[0][0] 9

 

3. 최종 배열 구조 (arr)

arr = [
    [9, 5, 2],   // row 0
    [7, 4, 1],   // row 1
    [8, 3, 6]    // row 2
]

 

4. sum 계산 

for (int i = 0; i < rows * cols; i++) {
    sum += arr[i / rows][i % cols] * (i % 2 == 0 ? 1 : -1);
}

여기서 i / rows는 행, i % cols는 열

i가 짝수이면 +, 홀수면 -

각 단계별로 sum에 더해지는 값

0 0 0 9 0 + +9
1 0 1 5 1 - -5
2 0 2 2 0 + +2
3 1 0 7 1 - -7
4 1 1 4 0 + +4
5 1 2 1 1 - -1
6 2 0 8 0 + +8
7 2 1 3 1 - -3
8 2 2 6 0 + +6
+9 -5 +2 -7 +4 -1 +8 -3 +6 = 13

 

정답 : 

 

12. 다음은 결합도와 관련된 내용이다. 보기에 알맞는 답을 골라 작성하시오.


(1) 다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용하는 경우의 결합도

(2) 모듈 간의 인터페이스로 배열이나 오브젝트, 자료구조 등이 전달되는 경우의 결합도

(3) 파라미터가 아닌 모듈 밖에 선언되어 있는 전역 변수를 참조하고 전역 변수를 갱신하는 식으로 상호작용하는 경우의 결합도


[보기]

ㄱ. 자료 결합도  ㄴ. 스탬프 결합도 ㄷ. 제어 결합도  ㄹ. 공통 결합도  ㅁ. 내용 결합도  ㅂ. 외부 결합도

 

출처 : 위키피디아(https://ko.wikipedia.org/wiki)

정답 : 

ㅁ. 내용 결합도

ㄴ. 스탬프 결합도

ㄹ. 공통 결합도

 

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

 

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
30
31
32
33
34
35
36
37
38
39
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;
    }
}
 
1. new Child(); 호출

Parent() → Child() 순서로 생성자가 실행.

 

2. Parent() 생성자 실행

int v = 1;  이건 Parent의 인스턴스 변수

++v -> v = 2,
total += 2 -> total = 2

show() 호출  자식 클래스에서 오버라이딩한 show()가 호출

생성자 내에서 오버라이딩된 메서드를 호출하면 자식 클래스의 메서드가 실행됨

이때 Child.show()가 실행

total += total * 2;

현재 total = 2

오버라이딩된 계산: total += 2 * 2 = 4
total = 2 + 4 = 6

Parent 생성자 끝난 후: total = 6

 

3. Child() 생성자 실행

v = 10 -> Child의 인스턴스 변수

v += 2; -> v = 12

total += v++ -> total += 12 -> total = 18, v = 13

show() 호출 -> Child의 show() 호출됨

total += total * 2;
total = 18 + (18 * 2) = 18 + 36 = 54

Child 생성자 끝난 후: total = 54

 

4. 결과

 

요약

1 Parent 생성자 → ++v = 2 2
2 Parent.show() → 오버라이딩된 Child.show() 실행 6
3 Child 생성자에서 v += 2, v++ → +12 18
4 Child.show() → total += total * 2 → +36 54
5 System.out.println(...) 출력값: 54

 

14. 아래는 디자인 패턴에 대한 설명이다. 알맞는 답을 보기에 골라 작성하시오. 

서로 다른 인터페이스를 가진 클래스들을 연결해 사용 가능하게 한다.

기존 클래스(Adaptee)를 원하는 인터페이스(Target)에 맞게 변환하는 어댑터(Adapter)를 만든다.

기존 클래스를 감싸서(wrapper) 인터페이스를 변환해주는 역할을 한다. 

 

https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EB%94%94%EC%9E%90%EC%9D%B8_%ED%8C%A8%ED%84%B4

 

소프트웨어 디자인 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 소프트웨어 디자인 패턴(software design pattern)은 소프트웨어 공학 소프트웨어 디자인의 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이

ko.wikipedia.org

 

다음의 위키를 참조

 

정답 : Adapter

 

15. 문장(Statement) 커버리지 테스트를 수행하려고 한다. 코드를 아래의 제어 흐름도 빈칸에 연결되도록 작성하고 문장 커버리지 순서대로 작성하시오.

 

1
2
3
4
5
6
7
8
9
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 Main(int b[], int m, int x) {
    int a = 0;                                // [1]
    while (a < m || b[a] < x) {               // [2]
        if (b[a] < 0)                         // [3]
            b[a] = -b[a];                     // [4]
        a++;                                  // [5]
    }
    return 1;                                 // [6]
}

 

2. 제어 흐름도 분석

우선 블록 번호를 각 코드에 대응한 결과

1 시작 / 초기화 int a = 0; -> 1
2 while 조건식 `while (a < m
3 if 조건식 if (b[a] < 0) -> 3
4 if 실행문 b[a] = -b[a]; -> 4
5 루프 반복처리 a++; -> 5
6 종료 반환 return 1; -> 6

경로 추적 : 

1. int a = 0;

2. while (a < m || b[a] < x)

3. if (b[a] < 0)

조건이 true면:

4. b[a] = -b[a];

5. a++

다시 2로 돌아감

조건 false면

6. return 1;

 

정답 :

1 , 2 , (3 , 4 , 5 , 2 , 6)

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
 
    public static void main(String[] args) {
        int[] data = {3581217};
        System.out.println(func(data, 0, data.length - 1));
    }
 
    static int func(int[] a, int st, int end) {
        if (st >= endreturn 0;
        int mid = (st + end/ 2;
        return a[mid] + Math.max(func(a, st, mid), func(a, mid + 1end));
    } 
 
}
배열을 분할 정복 방식으로 처리
mid = (st + end) / 2로 가운데 요소를 더하면서
func(a, st, mid) 과 func(a, mid + 1, end) 중 더 큰 값을 재귀로 선택하여 계속 누적
 
배열 분석
int[] data = {3, 5, 8, 12, 17};
index         0  1  2   3   4

실행과정

 

func(0, 4)

mid = (0+4)/2 = 2 -> a[2] = 8

return 8 + max(func(0,2), func(3,4))

 

func(0,2)

mid = (0+2)/2 = 1 -> a[1] = 5

return 5 + max(func(0,1), func(2,2))

 

func(0,1)

mid = (0+1)/2 = 0 -> a[0] = 3

return 3 + max(func(0,0), func(1,1))

 

func(0,0) = 0 (base case) -> func(1,1) = 0 (base case)

func(0,1) = 3 + max(0, 0) = 3

func(2,2) = 0 (base case)

func(0,2) = 5 + max(3, 0) = 8

 

func(3,4)

mid = (3+4)/2 = 3 -> a[3] = 12

return 12 + max(func(3,3), func(4,4))

 

func(3,3) = 0

func(4,4) = 0

func(3,4) = 12 + max(0, 0) = 12

 

결과

 

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

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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(1len(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 + 1for n in node.children)
 
li = [35812151821]
 
root = tree(li)
 
print(calc(root)) 

클래스 정의

class Node:
    def __init__(self, value):
        self.value = value
        self.children = []

각 노드는 value 값을 가지며, 자식 노드들을 담는 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]

li로부터 이진 트리 구조를 생성

자식 노드의 부모는 (i - 1) // 2 완전 이진 트리 형태

 

재귀 계산 함수

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)

루트에서 시작하여 각 노드를 순회

홀수일 때만 node.value를 더함

 

트리의 구성 구조

li = [3, 5, 8, 12, 15, 18, 21]

생성되는 트리 구조

Level 0:         3
               /   \
Level 1:     5       8
           /  \     / \
Level 2: 12  15   18  21

 

각 레벨별 노드의 값

0 3
1 5, 8
2 12, 15, 18, 21

 

계산 : 

calc(root) = 0 (root 3 제외)
           + calc(5, level=1) = 5 + sum(0 for 12,15)
           + calc(8, level=1) = 8 + sum(0 for 18,21)
→ 5 + 8 = 13

 

결과 : 

 

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

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
30
31
32
33
34
35
36
37
38
39
40
41
#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
}

과정 : 

연결 리스트를 생성하고, 특정 노드(value == 3)를 리스트의 앞으로 옮긴 후, 리스트의 값을 출력하는 구조

 

1. insert 함수

Data* insert(Data* head, int value)

새 노드를 생성하고 head 앞에 추가

 

2. reconnect 함수

Data* reconnect(Data* head, int value)

리스트에서 value 값을 가진 노드를 찾아, 해당 노드를 리스트의 가장 앞으로 이동

단, 이미 head면 그대로 반환

 

1. 리스트 생성

for (int i = 1; i <= 5; i++)
    head = insert(head, i);

 

i = 1: head = insert(NULL, 1) -> 1

i = 2: insert(1, 2) -> 2 -> 1

i = 3: insert(2->1, 3) -> 3 -> 2 -> 1

i = 4: -> 4 -> 3 -> 2 -> 1

i = 5: -> 5 -> 4 -> 3 -> 2 -> 1

5 → 4 → 3 → 2 → 1

 

2. reconnect(head : 3)

리스트 현재 상태:

head → 5 → 4 → 3 → 2 → 1

반복 탐색:

curr = 5, curr.value != 3

curr = 4, curr.value != 3

curr = 3, curr.value == 3 → 탐색 종료

 

재연결:

prev = 4, curr = 3

prev->next = curr->next = 2

 

즉, 4 -> 2로 연결됨

curr->next = head (=5)

head = curr

 

변경 결과 : 

3 → 5 → 4 → 2 → 1

 

for (curr = head; curr != NULL; curr = curr->next)
    printf("%d", curr->value);

 

 

단계 설명

리스트 생성 5 → 4 → 3 → 2 → 1
reconnect(head, 3) 실행 3을 맨 앞으로 이동
최종 리스트 3 → 5 → 4 → 2 → 1
출력 35421

필요하시면 이 구조를 그림으로도 시각화해드릴 수 있습니다.

 

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

 

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
#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", {0xA00xA50xDB}, "Lee", {0xA00xED0x81} };
    Student* p = s;
    int result = 0;
 
    for (int i = 0; i < 2; i++) {
        result += sum(&s[i]);
    }
    printf("%d", result);
    return 0;
}

 

typedef struct student {
    char* name;
    int score[3];
} Student;

 

Student 구조체는 이름(name)과 세 개의 점수(score[3])를 가짐

 

int dec

return enc & 0xA5;

인자로 받은 정수 enc를 16진수 0xA5와 비트 AND 연산하여 반환

0xA5 = 10100101 (2진수)

AND 연산은 각 비트가 모두 1일 때만 1이 됨

 

int sum

return dec(p->score[0]) + dec(p->score[1]) + dec(p->score[2]);

p->score[0~2] 각각을 dec()에 넣고 더한 값 반환

 

main 함수

구조체 초기화

Student s[2] = {
    "Kim", {0xA0, 0xA5, 0xDB},
    "Lee", {0xA0, 0xED, 0x81}
};

Index Name score[0] score[1] score[2]

0 Kim 0xA0 0xA5 0xDB
1 Lee 0xA0 0xED 0x81

 

비트연산 계산

Kim

Score 16진수 2진수 & 0xA5 결과 (10진수)

0xA0 10100000 AND 10100101 → 10100000 0xA0 = 160  
0xA5 10100101 AND 10100101 → 10100101 0xA5 = 165  
0xDB 11011011 AND 10100101 → 10000001 0x81 = 129  

 

Score 16진수 2진수 & 0xA5 결과 (10진수)

0xA0 10100000 AND 10100101 → 10100000 0xA0 = 160  
0xED 11101101 AND 10100101 → 10100101 0xA5 = 165  
0x81 10000001 AND 10100101 → 10000001 0x81 = 129  

 

최종 계산

for (int i = 0; i < 2; i++)
    result += sum(&s[i]);

sum(&s[0]) = 454

sum(&s[1]) = 454

result = 454 + 454 = 908

 

결과 : 

 

단계 설명

구조체 초기화 "Kim": A0 A5 DB, "Lee": A0 ED 81
dec(enc) enc & 0xA5 수행 (AND 비트 마스킹)
각 학생의 점수 합 둘 다 454
최종 합 454 + 454 = 908
출력 908

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
  public static void main(String[] args) {
    System.out.println(calc("5"));
  }
 
  static int calc(int value) {
    if (value <= 1return value;
    return calc(value - 1+ calc(value - 2);
  }
 
  static int calc(String str) {
    int value = Integer.valueOf(str);
    if (value <= 1return value;
    return calc(value - 1+ calc(value - 3);
  }
}

과정 : 

value = 5

calc(4) -> calc(3) + calc(2)

-> calc(3) → calc(2) + calc(1)

-> calc(2) → calc(1) + calc(0) = 1 + 0 = 1

-> calc(1) = 1

-> calc(3) = 1 + 1 = 2

-> calc(2) = 1 (위에서 계산됨)

->calc(4) = 2 + 1 = 3

->calc(2) = 1

-> 최종 = 3 + 1 = 4

 

정답 :