자격증/정보처리기사

[정보처리기사] 실기 문제 정리 - 1 (2024년 2회, 2024년 3회)

대기업 가고 싶은 공돌이 2025. 4. 7. 20:58

/ 는 소수점까지 나오는 나눗셈

//는 강제로 (int) 시키기 때문에 뒷자리 다 버림

 

즉 3까지 돌린다.

0,1,2

 

인덱스에 -가 들어가면 뒤에서부터 세는 것

-1은 맨 뒤의 요소

 

0을 대입해보면

lst[0], lst[-1] = lst[-1],lst[0]

1을 대입해보면

lst[1], lst[-2] = lst[-2], lst[1]

 

즉 리스트를 반대로 바꿔버리는 문법임

 

이 이후 결과는 6, 5, 4, 3, 2, 1이 됨

 

마지막 슬라이싱 문법

[시작지점, 끝 지점, 간격] 시작 지점부터 끝 지점까지 해당 간격을 기준으로 뽑아서 리스트를 만듦

 

[::2]는 처음부터 끝까지 2 간격으로 리스트를 뽑아라

즉, 6,4,2가 나옴

[1::2]는 첫 번째부터 끝까지 2 간격으로 리스트를 뽑아라

즉, 5,3,1이 나옴

 

이 둘을 빼면 3 즉, 정답은 3이다.

 

 

✅ 페이지 교체 알고리즘이란?

  • 프로세스가 페이지를 요청할 때, 메모리에 공간이 부족하면 기존 페이지를 교체해야 함.
  • 이때 어떤 페이지를 버릴지 정하는 기준이 페이지 교체 알고리즘이야.

💡 자주 나오는 대표 알고리즘 5가지

1. FIFO (First-In First-Out)

"가장 먼저 들어온 페이지부터 내보낸다."

  • 큐(Queue) 방식.
  • 가장 오래된 페이지를 제거.
  • 구현 쉬움. 성능은 상황에 따라 나쁠 수 있음.

예시

복사편집
프레임 3개, 참조 순서: 1 2 3 4 → 1,2,3 (채움) → 4 들어오면 1 제거 (가장 먼저 들어왔으니까)

2. LRU (Least Recently Used)

"가장 오래 사용되지 않은 페이지를 내보낸다."

  • 최근에 사용한 페이지는 유지하고, 한참 안 쓰인 것을 제거.
  • 시간 기록이 필요해서 구현은 조금 복잡함.

예시

복사편집
프레임 3개, 참조 순서: 1 2 3 2 4 → 1,2,3 → 2 사용됨 → 4 들어오면 1 제거 (가장 오래 안 쓰임)

3. OPT (Optimal / 최적 교체)

"앞으로 가장 오랫동안 사용되지 않을 페이지를 제거한다."

  • 이론상 가장 적은 page fault를 가짐.
  • 미래의 참조를 알아야 하므로 실제 시스템에서는 사용 불가, 시험용 이론.

예시

복사편집
프레임 3개, 참조: 1 2 3 4 2 1 5 → 1,2,3 → 4 들어오면 앞으로 3 안 쓰이니까 3 제거

4. LFU (Least Frequently Used)

"가장 적게 사용된 페이지를 제거한다."

  • 사용 횟수(count)를 세서 가장 덜 쓰인 페이지 제거.
  • 사용 횟수 저장 필요 → 구현 복잡.

특징

  • 자주 쓰는 페이지는 오래 유지됨
  • 근데 사용 빈도가 같을 땐 처리 기준이 애매할 수 있음

5. Second Chance (Clock 알고리즘)

FIFO에서 개선된 방식, 한 번의 기회를 더 줌.

  • 각 페이지에 참조 비트를 둠 (0 또는 1).
  • 제거 전에 이 비트가 1이면 0으로 바꾸고 기회 한 번 더 주고 넘어감.
  • 비트가 0이면 진짜 제거.

시계방향으로 돌면서 체크하는 모습 때문에 "Clock 알고리즘"이라고도 함.

 

 

 

5. 다음은 네트워크 취약점에 대한 문제이다. 아래 내용을 보고 알맞는 용어를 작성하시오.

 

 

 - IP나 ICMP의 특성을 악용하여 엄청난 양의 데이터를 한 사이트에 집중적으로 보냄으로써 네트워크의 일부를 불능 상태로 만드는 공격이다.
 - 여러 호스트가 특정 대상에게 다량의 ICMP Echo Reply 를 보내게 하여 서비스거부(DoS)를 유발시키는 보안공격이다.
 - 공격 대상 호스트는 다량으로 유입되는 패킷으로 인해 서비스 불능 상태에 빠진다.

 

 

정답: 스머프 공격

icmp flooding이라 생각했지만, 브로드 캐스트 이후 reply를 통해 마비시키는 공격이므로 스머프 공격이 맞음

 

6. 다음은 GoF 디자인 패턴과 관련된 문제이다. 괄호안에 알맞는 용어를 작성하시오.

 

(        ) 패턴은 클래스나 객체들이 서로 상호작용하는 방법이나 책임 분배 방법을 정의하는 패턴이다.
(        ) 패턴은 객체들 간의 통신 방법을 정의하고 알고리즘을 캡슐화하여 객체 간의 결합도를 낮춘다.
(        ) 패턴은 Chain of Responsibility나 Command 또는 Observer 패턴이 있다.

 

🔍 GoF 디자인 패턴의 3가지 분류

생성(Creational) 객체를 어떻게 만들지에 대한 패턴. (예: Singleton, Factory)
구조(Structural) 클래스나 객체를 어떻게 조합할지에 대한 패턴. (예: Adapter, Composite)
행위(Behavioral) 객체들 사이의 상호작용 방식에 대한 패턴. (예: Observer, Strategy, Command 등)

c언어에서 함수가 다시 호출되어도 static은 다시 0값이 대입되지 않음

 

그냥 처음 변수 선언 이후 값을 계속 가져감

 

정답 20

 

1. 개체 무결성:

  • 각 릴레이션의 기본키를 구성하는 속성은 널(NULL) 값이나 중복된 값을 가질 수 없습니다.

2. 참조 무결성

  • 외래키 값은 NULL이거나 참조하는 릴레이션의 기본키 값과 동일해야 합니다.

3. 도메인 무결성

  • 각 속성들의 값은 정의된 도메인에 속한 값이어야 합니다.

4. 고유 무결성

  • 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 릴레이션의 각 튜플이 가지는 속성 값들은 고유한 값을 가져야 합니다.

5. NULL 무결성

  • 릴레이션의 특정 속성 값은 NULL 될 수 없습니다.

6. 키 무결성

  • 각 릴레이션은 최소한 한 개 이상의 키를 가져야 하며, 키는 튜플을 식별할 수 있는 값이어야 합니다.

13. 다음은 테스트 커버리지에 대한 문제이다. 아래 내용에 알맞는 답을 보기에서 골라 작성하시오.


1. 테스트를 통해 프로그램의 모든 문장을 최소한 한 번씩 실행했는지를 측정
2. 프로그램 내의 모든 분기(조건문)의 각 분기를 최소한 한 번씩 실행했는지를 측정
3. 복합 조건 내의 각 개별 조건이 참과 거짓으로 평가되는 경우를 모두 테스트했는지를 측정

🏷️ 테스트 기법에 따른 분류

📘 화이트박스 테스트 : 각 응용 프로그램의 내부 구조와 동작을 검사하는 소프트웨어 테스트

  1. 구문 커버리지 : 모든 명령문을 적어도 한 번 수행
  2. 결정 커버리지 : 결정 포인트 내의 전체 조건식이 적어도 한 번은 참과 거짓의 결과를 수행
  3. 조건 커버리지 : 결정 포인트 내의 각 개별 조건식이 적어도 한 번은 참과 거짓의 결과를 수행
  4. 조건/결정 커버리지 : 전체 조건식뿐만 아니라 개별 조건식도 참과 거짓의 결과를 수행
  5. 변경 조건/결정 커버리지 : 개별 조건식이 다른 개별 조건식에 영향을 받지않고 전체 조건식에 독립적으로 영향을 주도록 향상시킨 커버리지
  6. 다중 조건 커버리지 : 모든 개별 조건식의 모든 가능한 조합을 100% 보장하는 커버리지
  7. 경로 커버리지 : 수행 가능한 모든 경로를 테스트하는 커버리지
  8. 제어 흐름 테스트 : 프로그램 제어 구조를 그래프 형태로 나타내어 내부 로직을 테스트
  9. 데이터 흐름 테스트 : 제어 흐름 그래프에 데이터 사용현황을 추가한 그래프 테스트

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ExceptionHandling {
  public static void main(String[] args) {
      int sum = 0;
      try {
          func();
      } catch (NullPointerException e) {
          sum = sum + 1;
      } catch (Exception e) {
          sum = sum + 10;
      } finally {
          sum = sum + 100;
      }
      System.out.print(sum);
  }
 
  static void func() throws Exception {
      throw new NullPointerException(); 
  }
}

throws exception에서 niullpointerexception을 구현체로 받아

nullpoionterException이 throw됨

 

결론, 정답 101

 

19. 다음은 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
class Main {
 
  public static class Collection<T>{
    T value;
 
    public Collection(T t){
        value = t;
    }
 
    public void print(){
       new Printer().print(value);
    }
 
   class Printer{
      void print(Integer a){
        System.out.print("A" + a);
      }
      void print(Object a){
        System.out.print("B" + a);
      } 
      void print(Number a){
        System.out.print("C" + a);
      }
   }
 }
 
  public static void main(String[] args) {
      new Collection<>(0).print();
  }
  
}

T가 값을 받으면 Integer가 되는 것이 맞다.

 

그러나 메서드 오버로딩에서 static 클래스는 컴파일 시점에 결정된 객체 타입을 기준으로 오버로딩을 진행함

 

즉, 컴파일 시 자료형이 Object이기 때문에, B0이 정답이다.

 

 

3. 다음은 SQL에 관한 문제이다. 아래 SQL 구문의 빈칸을 작성하시오.

 

 

테이블

 

사원 [사원번호(PK), 이름, 나이, 부서]

부서 [사원번호(PK), 이름, 주소, 나이]

 

 

신입 사원이 들어와서 사원 테이블에 추가

INSERT INTO 사원 (사원번호, 이름, 주소, 부서)   [      ①     ] (32431, '정실기', '서울', '영업');

 

 

위에 신입사원을 검색하면서 부서 테이블에 추가

INSERT INTO 부서 (사원번호, 이름, 나이, 부서)

[         ] 사원번호, 이름, 나이, 23 FROM 사원 WHERE 이름 = '정실기';

 

 

전체 사원 테이블 조회

SELECT  *   [       ]   사원;

 

 

퇴사로 인해 부서에 해당하는 값을 '퇴사'로 변경

UPDATE 사원   [           ]   부서  =  '퇴사'  WHERE 사원번호  = 32431;

 

1: values

2: select

3. from

4. set

 

5. 다음은 프로토콜에 대한 내용이다. 아래 내용을 읽고 알맞는 답을 작성하시오.

 

 

- Network layer에서 IP패킷을 암호화하고 인증하는 등의 보안을 위한 표준이다. 

- 기업에서 사설 인터넷망으로 사용할 수 있는 VPN을 구현하는데 사용되는 프로토콜이다.
- AH(Authentication Header)와 ESP(Encapsulating Security Payload)라는 두 가지 보안 프로토콜을 사용한다.

 

✅ 핵심 비교표: SSL vs TLS vs HTTPS vs IPSec

항목                   SSL                                 TLS                                      HTTPS                                                    IPSec

 

계층 전송 계층 (TCP 위) 전송 계층 (TCP 위) 응용 계층 (HTTP + SSL/TLS) 네트워크 계층 (IP 수준)
역할 데이터 암호화/무결성/인증 TLS의 이전 버전 웹 보안 프로토콜 (HTTPS = HTTP over TLS) IP 패킷 자체를 암호화 및 인증
사용처 HTTPS, 이메일, FTP 등 SSL 대체 (요즘은 거의 TLS) 웹사이트 보안 접속 VPN, 사설망, 터널링
주요 구성요소 공개키/대칭키, 인증서 등 공개키/대칭키, 인증서 등 TLS(또는 SSL) + HTTP AH, ESP (두 가지 보안 프로토콜)
암호화 단위 응용 계층 데이터 응용 계층 데이터 웹 페이지 요청/응답 IP 패킷 전체 또는 페이로드
현황 사용 안 함 (구버전) 표준으로 사용 중 웹 보안의 표준 네트워크 보안에 사용

 

6. 다음은 Python에 대한 문제이다. 아래 코드를 읽고 알맞는 출력 값을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def fnCalculation(x,y):
    result = 0;
    for i in range(len(x)):
     temp = x[i:i+len(y)] 
     if temp == y:
       result += 1;
    return result
 
= "abdcabcabca"
p1 = "ab";
p2 = "ca";
 
out = f"ab{fnCalculation(a,p1)}ca{fnCalculation(a,p2)}"
print(out)

 

f"" 문법

f 뒤 문자열에 들어오는 {} 내부에 변수명이나 함수를 사용하면 그대로 사용된다.

 

즉 f"ab{함수 결과}ca{함수 결과} 해서 

ab3ca3이 정답으로 나오게 된다.

 

 

8. 패킷 교환 방식 중에 연결형과 비연결형에 해당하는 방식을 작성하시오. 

 

① 연결형 교환 방식

② 비연결형 교환 방식

 

 

이거 정답이 tcp, udp가 아니라는 것이 놀랍다

 

정답: 가상회선, 데이터그램

 

 

9. 아래 내용을 확인하고 보기에서 알맞는 답을 고르시오.

 

 

실행 순서가 밀접한 관계를 갖는 기능을 모아 모듈로 구성한다.
한 모듈 내부의 한 기능 요소에 의한 출력 자료가 다음 기능 원소의 입력 자료로서 제공되는 형태이다.

 

 

보기

ㄱ.  기능적(functional)           ㄴ.  우연적(Coincidental)          ㄷ.  통신적(Communication)       ㄹ.  절차적(Procedural)         ㅁ.  시간적(Temporal)           ㅂ.  순차적(sequential)              ㅅ.    논리적(Logical)

 

 

모듈의 응집도를 묻는 문제다.

 

🧠 7가지 응집도 종류 (약한 것 → 강한 것)

1️⃣ 우연적(Coincidental) 관련 없는 기능을 그냥 몰아넣음 로또처럼 막 넣은 유틸 함수
2️⃣ 논리적(Logical) 비슷한 성격의 기능을 하나의 모듈에서 조건으로 분기 메뉴 선택 후 분기 처리
3️⃣ 시간적(Temporal) 실행 시점이 같다고 묶음 (초기화 등) 시작할 때 다 같이 실행
4️⃣ 절차적(Procedural) 실행 순서가 중요해서 묶음 "A 후에 B"처럼 순서만 있음
5️⃣ 통신적(교환적) 같은 데이터를 사용하기에 묶음 같은 구조체나 파일 접근
6️⃣ 순차적(Sequential) 출력이 다음 기능의 입력이 됨 문제에서 말한 것!
7️⃣ 기능적(Functional) 하나의 명확한 목적을 위한 것만 묶음 진짜 이상적인 코드

우연적 응집도 (Coincidental Cohesion)

관련 없는 기능들이 우연히 하나의 모듈에 뭉쳐있는 상태 (최악)

예시:

def utility_module():
    print("오늘 날짜 출력")
    print("파일 열기")
    print("네트워크 연결")
    print("계산기")
  • 기능들이 서로 전혀 관련 없음 ❌

논리적 응집도 (Logical Cohesion)

비슷한 카테고리의 일을 조건문으로 분기 처리하는 경우

예시:

def handle_input(input_type, value):
    if input_type == "keyboard":
        print("키보드 입력 처리")
    elif input_type == "mouse":
        print("마우스 클릭 처리")
  • 논리적으로 입력 관련이지만, 내부 로직은 서로 독립

시간적 응집도 (Temporal Cohesion)

같은 시점에 수행된다고 묶어 놓은 기능들 (초기화, 종료 등)

예시:

def init_system():
    init_ui()
    load_config()
    connect_db()
  • 시스템 시작할 때 다 같이 호출되지만, 역할은 제각각

절차적 응집도 (Procedural Cohesion)

순서상 이어져야만 하는 기능들을 모아둔 경우

예시:

def process_data():
    read_input()
    validate_data()
    store_data()
  • 흐름상 절차는 있지만, 각 단계는 별도로도 가능함

통신적 응집도 (Communicational Cohesion)

교환적이랑 똑같음

같은 데이터를 사용하는 기능을 묶은 경우

예시:

def user_operations(user):
    update_user_profile(user)
    log_user_activity(user)
  • user라는 공통 데이터를 공유

순차적 응집도 (Sequential Cohesion)

한 기능의 출력이 다음 기능의 입력이 되는 경우

예시:

def image_pipeline(image):
    resized = resize(image)
    filtered = apply_filter(resized)
    save(filtered)
  • 출력 → 입력 순으로 이어짐 ✔️

기능적 응집도 (Functional Cohesion) ✅ (최고 단계)

모듈이 하나의 명확한 기능만 수행

예시:

def calculate_total_price(items):
    return sum(item.price for item in items)
  • "총액 계산"이라는 한 가지 목적에 딱 집중됨

RIP 프로토콜은 최단 홉수를 기반으로 최단 경로를 결정한다

따라서 정답은 A->D->C->F

 

OSPF는 비용을 기반으로 최단 경로를 결정한다.

 

12. 아래의 표를 확인하여 SRT 스케줄링의 평균 대기시간을 계산하여 작성하시오.

 

프로세스 도착 시간 서비스 시간
A 0 8
B 1 4
C 2 9
D 3 5

 

 

비선점 스케쥴링

FCFS = first come first served

SJF = Shortest Job First Scheduling

 

선점 스케쥴링

SRT = Shortest Remaining Time

RR = round robin

 

정답: 평균은 6.5다

 

16. 아래는 소프트웨어 설계에 대한 내용이다. 내용을 읽고 괄호안에 알맞는 답을 작성하시오.

 

 

- 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하기 위해, 제어를 통신하거나 제어 요소를 전달하는 결합도이다.
- 한 모듈이 다른 모듈의 상세한 처리 절차를 알고 있어 이를 통제하는 경우나 처리 기능이 두 모듈에 분리되어 설계된 경우에 발생한다.

 

(              ) Coupling

 

💡 결합도의 종류와 수준 정리 (강한 → 약한 결합)

결합도 종류설명
① 내용 결합 (Content) 한 모듈이 다른 모듈 내부를 직접 접근 (최악)
② 공통 결합 (Common) 전역 변수 공유
③ 외부 결합 (External) 외부 인터페이스 공유
④ 제어 결합 (Control) 제어 플래그 전달 → 논리 흐름 제어
⑤ 스탬프 결합 (Stamp) 필요한 데이터 일부만 쓰지만, 전체 구조체 전달
⑥ 자료 결합 (Data) 필요한 데이터만 정확히 전달 (이상적!)
⑦ 메시지 결합 (Message) 객체끼리 메시지만 주고받는 완전한 느슨한 결합 (OOP 최적)

 

 

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
#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;
    }
    
    printf("%d", a-b);
}

case 문에 break가 없으면 default도 같이 실행됨

 

따라서 a = 11, b = 24

정답 -13