정보처리기사 24년도 2회차

·2025년 4월 11일

just공부

목록 보기
13/47

1. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

public class Main {
	public static void check(int[] x, int[] y) {
		if(x==y) System.out.print("O");
		else System.out.print("N");
	}
	public static void main(String[] args) {
		int a[] = new int[] {1, 2, 3, 4};
		int b[] = new int[] {1, 2, 3, 4};
		int c[] = new int[] {1, 2, 3};
		check(a, b);
		check(b, c);
		check(a, c);
	}
}

  • NNN

풀이

  • check 메소드는 == 연산자로 비교
    • == 연산자 : 배열이 참조하는 주소값을 비교
  • 배열이 내용이 같아도 메모리 위치가 다르기 때문에 다른 객체로 취급되어 false가 반환됨

2. 다음 내용이 설명하는 용어를 쓰시오.

시스템의 성능을 향상시키고 개발 및 운영의 편의성 등을 높이기 위해 정규화된 데이터 모델을 의도적으로 통합, 중복, 분리하여 정규화 원칙을 위배하는 행위

  • 반정규화

풀이

  • 반정규화

    • 성능 향상, 속도 개선 등의 이유로 일부러 정규화 원칙을 깨고 데이터 구조를 수정하는 행위
  • 정규화

    • 데이터의 중복을 제거하고 데이터 무결성을 유지하기 위해 데이터베이스를 여러 테이블로 나누는 과정

      절차설명
      제 1정규화- 도메인의 원자성 확보
      제 2정규화- 부분 함수 종속성 제거
      제 3정규화- 이행 함수 종속성 제거
      BCNF- 모든 결정자가 후보키 집합에 속해야 함
      제 4정규화- 다중값 종속 제거
      제 5정규화- 조인 종속 제거

3. 다음의 조건을 만족하도록 괄호에 적합한 명령을 넣어 SQL문을 완성하시오.

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

① 신입사원이 들어와서 부서 테이블에 새로운 사람을 추가

INSERT INTO 부서 (사원번호, 이름, 주소, 나이) **()** (240728, '홍길동', '서울', 30);

② 부서 테이블에서 추가한 사원을 검색한 후 사원 테이블에 추가

INSERT INTO 사원 (사원번호, 이름, 나이, 부서)
**()** 사원번호, 이름, 나이, ‘영업’ FROM 부서 WHERE 이름 = '홍길동';

③ 전체 사원 테이블 조회

SELECT * **()** 사원;

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

UPDATE 사원 **()** 부서 = '퇴사' WHERE 사원번호 = 240728;`

① VALUES
② SELECT
③ FROM
④ SET

풀이

INSERT INTO 부서 (사원번호, 이름, 주소, 나이) VALUES (240728, '홍길동', '서울', 30);
  • VALUES : 데이터 삽입 시 필수, 컬럼 순서와 값 순서가 일치해야 함

INSERT INTO 사원 (사원번호, 이름, 나이, 부서)
SELECT 사원번호, 이름, 나이, '영업' FROM 부서 WHERE 이름 = '홍길동';
  • 테이블 간 데이터 복제나 임시 테이블로 데이터를 옮길 때 유용하게 사용됨

SELECT * FROM 사원;
  • 데이터를 조회할 때 사용됨

UPDATE 사원 SET 부서 = '퇴사' WHERE 사원번호 = '240728'
  • 테이블에 저장된 기존 데이터를 수정할 때 사용
  • WHERE 조건이 빠지면 모든 행의 데이터가 변경될 수 있음

4. 다음 테이블에서 카디널리티(Cardinality)와 디그리(Degree)를 구하시오.

  • Cardinality : 5
  • Degree : 4

풀이

  • 카디널리티 : 테이블의 행, 레코드의 개수
  • 디그리 : 테이블의 열, 속성의 개수

5. 다음 설명에 해당하는 프로토콜을 쓰시오.

  • Network layer에서 IP패킷을 암호화하고 인증하는 등의 보안을 위한 표준이다.
  • 기업에서 사설 인터넷망으로 사용할 수 있는 VPN을 구현하는데 사용되는 프로토콜이다.
  • AH(Authentication Header)와 ESP(Encapsulating Security Payload)라는 두 가지 보안 프로토콜을 사용한다.

  • IPsec

6. 모듈에 대한 다음 설명에 해당하는 응집도(Cohesion)를 에서 찾아 쓰시오.

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

  • 순차적 응집도

풀이

종류설명예시
기능적 응집도하나의 모듈이 한 가지 명확한 기능만 수행- 사용자 로그인을 처리하는 모듈
- 계산기 모듈처럼 단일 목적
순차적 응집도모듈 내 기능이 순차적으로 연결되며, 한 기능을 출력이 다음 기능의 입력으로 사용됨- 데이터를 입력받아 처리하고, 결과를 출력하는 모듈
-컴파일러
교환적 응집도모듈 내 여러 기능이 동알한 데이터를 사용하여 수행됨- DB 레코드를 읽고 수정/삭제 기능이 있는 모듈
절차적 응집도관련된 기능들을 순서대로 수행하지만, 기능 간에 데이터의 직접 전달은 없음- 시스템 초기화 모듈
- 여러 가지 초기화 작업을 단지 순서적으로 수행
시간적 응집도시간적으로 동시에 실행될 필요가 있는 기능들을 한 모듈로 묶음시스템 시작 시 초기화 작업
- 정기적 백업, 배치(batch) 작업
논리적 응집도논리적으로 관련된 기능을 하나의 모듈로 묶지만, 실제로는 서로 다른 기능- 오류처리 모듈
- 하나의 모듈이 여러 비슷한 작업을 논리적 분기로 처리
우연적 응집도서로 연관이 없는 기능들이 무작위로 하나의 모듈에 모임- 잡다한 기능을 한 번에 처리하는 유틸리티 모듈

7. 디자인 패턴에 대한 다음 설명에서 알맞은 용어를 에서 찾아 쓰시오.

  • 컬렉션 객체의 내부 구조를 노출하지 않고 순차적으로 접근할 수 있게 하는 패턴이다.
  • 객체의 내부 표현 방식에 독립적으로 요소에 접근할 수 있다.
  • 반복 프로세스를 캡슐화하여 클라이언트 코드에서는 컬렉션의 구체적인 구현에 종속되지 않게 한다.
  • Cursor라고도 한다.

  • Iterator

풀이

  • Iterator (반복자) 패턴
    • 컬렉션의 내부 구조 은닉
    • 요소에 대한 순차 접근
    • Cursor : 데이터의 현재 위치를 기억하고 다음 데이터로 이동하는 방식이 커서의 움직임과 같아서

8. 다음 Python으로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

def cnt(str, p):
    result = 0
    for i in range(len(str)):
        sub = str[i:i+len(p)]
        if sub == p:
            result += 1
    return result

str = "abdcabcabca"
p1 = "ca"
p2 = "ab“

print(f'ab{cnt(str, p1)} ca{cnt(str, p2)}')

  • ab3 ca3

풀이

  • cnt 함수
    • str에 p가 몇 번 등장하는지의 횟수를 반환하는 기능
  • 출력문에서 cnt(str, p1) 의 반환값: 3
  • cnt(str, p2) 의 반환값: 3
  • 출력값은 ab3 ca3

9. 데이터 교환 방식에 대한 다음 설명에서 괄호(①, ②)에 들어갈 알맞은 용어를 쓰시오.

( ① ) : 연결형 통신에서 주로 사용되는 방식으로, 출발지와 목적지의 전송 경로를 미리 연결하여 논리적으로 고정한 후 통신하는 방식이다.
( ② ) : 비연결형 통신에서 주로 사용되는 방식으로, 사전에 접속 절차를 수행하지 않고 헤더에 출발지에서 목적지까지의 경로 지정을 위한 충분한 정보를 붙여서 개별적으로 전달하는 방식이다.

① 가상 회선 방식
② 데이터그램 방식

풀이

  • 그냥 외워 .

1. 패킷 교환 방식

  • 큰 데이터를 패킷으로 나누어 개별적으로 전송하는 방식
  • 가상 회선 방식
    • 연결형 통신
    • 전송 전 경로 설정
    • 패킷 순서 보장
  • 데이터그램 방식
    • 비연결형 통신
    • 패킷마다 헤더에 목적지 정보 표시
    • 패킷마다 다른 경로로 전송
    • 전송 순서 보장 안됨

2. 회선 교환 방식

  • 연결형 통신
  • 전송 지연이 없음
  • 옛날 전화기처럼 통신이 이루어지는 동안 회선이 독점됨

3. 메시지 교환 방식

  • 연결 없이 메시지 전송 가능
  • 메시지 크기가 크면 지연 발생
  • 중간 노드에 저장 공간 필요
항목회선 교환메시지 교환가상회선데이터그램
연결 방식연결형비연결형연결형비연결형
단위회선전체 메시지패킷패킷
전송 순서 유지OOOX
경로 설정물리적 경로없음논리적 경로패킷마다 다름
지연짧음짧음가변적
예시전화망(구) 네트워크ATM, MPLSIP, UDP

10. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include 

void swap() {
	int a = 11;
	int b = 19;
	int t = a;
	a = b; 
	b = t; 
}

int main() {
	int a = 11;
	int b = 19;
	swap();
	switch(a) { 
		case 1:
			b += 1;
		case 11: // a = 11
			b += 2; // b= 21
		default:
			b += 3; // b = 24
			break;
	}
	printf("%d", a-b); // 11 - 24 = -13
} 

  • -13

풀이

  • swap() 을 호출하긴 했으나, swap 함수에서 지역변수로 a, b, t를 선언했고 이 변수들끼리 swap하는 프로그램이라 main 함수에서의 a와 b에는 영향이 없음
  • switch 문
    • case 11 에서 b += 2; 가 실행됨. -> b = 21
    • break가 없으므로, 그대로 default까지 내려가게 됨
    • b += 3; 실행됨 -> b = 24
    • break
  • a - b 는 -13

11. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include 
#include 

void func(char *d, char *s) { // teststring , first
	int sum = 0;
	while (*s) {  // f
		*d = *s;  // test=f
		d++; // first++
		s++;  // first++;
	}
	*d = ''; // first
}

int main() {
	char* str1 = "first";
	char str2[50] = "teststring";
	int result = 0;
	func(str2, str1);  

	for (int i = 0; str2[i] != ''; i++) {
		result += i;
	}
	printf("%d", result);
	return 0;
}

  • 10

풀이

  • func : 문자열 복사 함수 - strcpy() 구현
  • str2 = "first" 로 바뀜
  • for문
    • 바뀐 str2[] 문자열의 길이만큼 1씩 더해 result에 저장
    • str2[0] = f
    • str2[1] = i
    • str2[2] = r
    • str2[3] = s
    • str2[4] = t
  • 0 + 1 + 2 + 3 + 4 = 10

12. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

interface Number {
	int sum(int[] a, boolean odd);
}

public class Main {
	public static void main(String[] args) {
		int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
		OENumber OE = new OENumber();
		System.out.print(OE.sum(a, true) + ", " + OE.sum(a, false)); // 25, 20
	}
}
class OENumber implements Number {
	public int sum(int[] a, boolean odd) {
		int result = 0;
		for(int i=0; i < a.length; i++) { // 9
			if((odd && a[i] % 2 != 0) || (!odd && a[i] % 2 == 0))  // 1, 3,5,7,9 | 2,4,6,8
				result += a[i]; 
		}		
		return result; //25
	}	
}

  • 25, 20

풀이

  • Main 클래스 실행
  • OE.sum(a, true)
    • if((odd && a[i] % 2 != 0)) 이 만족되는 값
      • a[0], a[2], a[4], a[6], a[8] 인 1, 3, 5, 7, 9가 result에 더해짐
      • result = 25
  • OE.sum(a, false)
    • if(!odd && a[i] % 2 == 0) 이 만족되는 값
      • a[1], a[3], a[5], a[7] 인 2, 4, 6, 8 이 result에 더해짐
      • result = 20
  • 25, 20 이 출력

13. 다음 라우터 A에서 라우터 F까지 경로를 설정하기 위해 RIP 방식을 사용한다고 할 때, 라우터가 지나가는 경로를 순서대로 쓰시오.(단, 간선 위의 숫자는 라우터 간의 거리를 의미한다.)

  • A-D-C-F

풀이

  • RIP 방식은 Hop 수가 가장 적은 경로로 가야 함
비교 항목RIP (Routing Information Protocol)OSPF (Open Shortest Path First)
경로 선택홉 수 (Hop Count)
거치는 라우터 수가 적은 경로
누적 링크 비용 (Link Cost)
각 링크의 비용(대역폭, 지연 등) 총합
프로토콜 유형거리 벡터 기반링크 상태 기반
경로 계산 방식이웃 라우터로부터 거리 정보 받아 갱신모든 라우터가 전체 네트워크 토폴로지를 알고 Dijkstra 알고리즘으로 계산
최대 홉 수15 (16은 무한대)제한 X
속도느림빠름

14. 아래 설명하는 내용을 확인하여 알맞는 알고리즘을 작성하시오.

QUESTION

  • 대칭키 알고리즘으로 1997년 NIST(미국 국립기술표준원)에서 DES를 대체하기 위해 생성되었다.
  • 128비트, 192비트 또는 256비트의 가변 키 크기와 128비트의 고정 블록 크기를 사용한다.
  • 높은 안전성과 효율성, 속도 등으로 인해 DES 대신 전 세계적으로 많이 사용되고 있다.

  • AES

풀이 방법

  • 암기가 답임.
    • AES 이름에서부터 DES를 대체할 수 있는 발전된 버전임을 알 수 있음.
  • AES (Advanced Encryption Standard)
    • 블록 암호 사용
    • 128bit의 고정적인 블록 크기 사용

15. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include 

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

풀이

[0][1][2]
arr[0]123
arr[1]456
arr[2]789

indexpoints to
parr[0]{4, 5, 6}
parr[1]{7, 8, 9}
  • parr[1][1] = 8
  • *(parr[1] +2)
    • parr[1] = arr[2]
    • parr[1] + 2 = arr[2][2]
    • *(parr[1] + 2) = arr[2][2] = 9
  • **parr
    • *parr = parr[0] = arr[1]
    • **parr = *parr[0] = arr[1][0] = 4
  • 8 + 9 + 4 = 21

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

  • 6.5

풀이

  • 대기 시간 = 종료된 시점 -도착시간-실행시간
프로세스시간대기시간
A1 12 13 14 15 16 17 1818-1-8 = 9
B2 5 6 77-2-4 = 1
C3 19 20 21 22 23 24 25 2626-3-9 = 14
D4 8 9 10 1111-4-5=2
  • 평균 대기시간 = 26 / 4 = 6.5

의미

  • 선점 : CPU가 한 번 할당되면 다른 프로세스는 점유 불가
  • 비선점 : CPU를 차지하는 프로세스가 있어도 다른 프로세스가 빼앗아 사용 가능

선점

  • RR
    • Round Robin
    • 준비상태 큐에 먼저 들어온 프로세스 먼저 CPU할당
    • 할당된 시간만 실행. 완료되지 않으면 다음 프로세스에 CPU 넘겨줌
  • SRT
    • Shortest Remaining Time
    • SJF의 선점형태 변형
    • 가장 짧은 실행시간인 프로세스부터 처리
    • 새로운 프로세스가 더 빨리 끝나면 얘부터 처리

비선점

  • FCFS
    • First Come First Service (FIFO)
    • 준비상태 큐에 도착한 순서대로 CPU 할당
  • SJF
    • Shortest Job First
    • 가장 적은 평균 대기시간
    • 실행 시간이 가장 짧은 프로세스부터 CPU 할당
  • HRN
    • Highest Response - ratio Next
    • 대기시간과 실행시간으로 계산된 우선순위
    • (대기시간+서비스시간) / 서비스시간

17. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

public class Main {
	public static String rf(String str, int index, boolean[] seen) { 
		if(index < 0) return "";
		char c = str.charAt(index); 
		String result = rf(str, index-1, seen);
		if(!seen[c]) {
			seen[c] = true;
			return c + result;
		}
		return result;
	}
	public static void main(String[] args) {
		String str = "abacabcd";
		int length = str.length(); 
		boolean[] seen = new boolean[256];
		System.out.print(rf(str, length-1, seen));
	}
}

  • dcba

풀이

  • 재귀 호출 + 중복 문자 제거
  • main()
    • length = 8
  • rf()
    • 역순으로 재귀 호출
    • 처음 등장하는 문자 : seen[c] = true / c+result 로 누적
    • 이미 등장한 문자 : return result
    • 뒤에서부터 처음 등장하는 문자만 앞에서부터 출력

18. 소프트웨어 설계에 대한 다음 설명에서 괄호에 들어갈 알맞은 용어를 쓰시오.

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

답 : ( ) Coupling

  • Control

풀이

종류설명
내용 결합모듈 간의 인터페이스로 데이터, 지역 변수 등을 직접 참조하거나 수정할 때의 결합도
공통 결합모듈 간의 인터페이스로, 모듈 밖에 선언된 전역 변수를 사용하여 전역 변수를 갱신하는 방식으로 상호작용
외부 결합모듈들이 운영체제, 하드웨어 포맷 등 외부 인터페이스를 공유
제어 결합단순 처리 대상인 데이터만 전달되는 것이 아니라 어떻게 처리해야 하는지를 결정하는 제어 요소가 전달되는 경우
스탬프 결합모듈 간의 인터페이스로 배열이나 레코드 등의 자료 구조가 전달될 때의 결합도
자료 결합도필요한 데이터만 명확히 전달
  • 내공외제스자 ( 강한->약한, 약할수록 좋은 것)

19. 다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

#include 

struct node {
	int n1;
	struct node *n2;
}; // linked list와 유사

int main() {
	struct node a = {10, 0}; // a.n1 = 10, a.n2 = null
	struct node b = {20, 0}; // b.n1 = 20, b.n2 = null
	struct node c = {30, 0}; // c.n1 = 30, c.n2 = null

	struct node *head = &a; // head -> &a 
	a.n2 = &b; // a.n2 -> &b
	b.n2 = &c; // head->n2->n1  → b.n1 → 20

	printf("%d", head -> n2 -> n1); // 

        return 0;
}

  • struct node
    • n1 : 정수값
    • n2 : 다음 노드를 가리키는 포인터 (struct node * )
    • Linked list 구조와 유사
  • main()
    • a.n1 = 10, a.n2 = NULL
    • b.n1 = 20, b.n2 = NULL
    • c.n1 = 30, c.n2 = NULL
  • struct node *head = &a; : head -> &a
  • a.n2 = &b; : a.n2 -> &b
  • b.n2 = &c; : b.n1 → 20
  • head -> n2 -> n1
    • head -> &a
    • head->n2 -> a.n2 -> &b
    • head->n2->n1 -> b.n1 -> 20
  • 포인터를 통해 구조체의 멤버 접근
  • 연결 리스트 : 구조체 포인터를 통해 다음 노드를 연결하는 자료구조

20. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.

public class Main {
	public static void main(String[] args) {
		String str = "ITISTESTSTRING";
		String[] result = str.split("T");
		System.out.print(result[3]);
	}
}

  • S

풀이

  • T를 기준으로 끊어진다
  • T는 포함되지 않음
  • result[0] = I
  • result[1] = IS
  • result[2] = ES
  • result[3] = S
profile
Whatever I want | Interested in DFIR, Security, Infra, Cloud

0개의 댓글