Start Bit와 Stop Bit를 문자마다 붙여 동기를 맞추는 것은 동기식이 아니라 비동기식 전송의 특징이므로 옳지 않다.
동기식 전송은 여러 문자를 하나의 블록(프레임)으로 묶고, 앞뒤에 동기 문자나 플래그를 두어 송수신 측이 클록을 맞춘 채 연속 전송한다.
- 정해진 수의 문자열을 블록으로 묶어 한꺼번에 보내는 것은 동기식 전송의 기본 방식이다.
- 고속(2,400bps 이상)·원거리 전송에 쓰인다는 설명은 동기식의 특징으로 옳다.
- 블록 사이에 유휴시간이 없어 전송 효율이 높다는 설명도 동기식의 장점으로 옳다.
| 소작업 이름 | 소요시간 | 선행 소작업 |
|---|---|---|
| a | 5 | 없음 |
| b | 5 | 없음 |
| c | 8 | a, b |
| d | 2 | c |
| e | 3 | b, c |
| f | 4 | d |
| g | 5 | e, f |
프로젝트가 끝날 수 있는 가장 빠른 소요시간은 임계 경로(critical path)의 길이인 24이다.
각 소작업의 가장 이른 완료 시각은 선행 작업 중 가장 늦게 끝나는 시각에 자기 소요시간을 더해 구한다.
a·b는 5에 끝나고, c는 5+8=13, d는 13+2=15, f는 15+4=19, e는 max(5, 13)+3=16이다.
g는 e(16)와 f(19) 중 늦은 19에 시작하므로 19+5=24에 끝난다.
- 13: c까지만 끝난 시각으로, 뒤따르는 d·e·f·g가 남아 있다.
- 21: 경로 a→c→e→g(5+8+3+5)의 길이로, 더 긴 경로 a→c→d→f→g를 놓친 값이다.
- 32: 모든 소작업 시간을 단순 합산한 값으로, 병렬로 진행되는 작업을 고려하지 않았다.
- 입력 데이터 : 1234.5
- 표시 형식 코드 : #,##0
출력 결과는 1,235이다.
표시 형식 코드 #,##0은 천 단위마다 쉼표를 넣고 소수 자릿수 없이 정수로 표시하며, 버려지는 소수부는 반올림된다. 따라서 1234.5는 1,235로 표시된다.
- 1,234: 소수부를 반올림하지 않고 버린 결과로, 엑셀 표시 형식의 동작과 다르다.
- 1,234.5: 소수 첫째 자리를 표시하려면 #,##0.0 형식이 필요하다.
- 1,234.50: 소수 둘째 자리까지 표시하려면 #,##0.00 형식이 필요하다.
- ( ㉠ )은/는 외부에서 인식할 수 있는 특성이 담긴 소프트웨어의 골격이 되는 기본 구조로, 시스템 전체에 대한 큰 밑그림이다. 소프트웨어 품질 요구 사항은 ( ㉠ )을/를 결정하는 데 주요한 요소로 작용한다.
- ( ㉡ )은/는 두 개 이상의 클래스에서 동일한 메시지에 대해 객체가 다르게 반응하는 것이다.
- ( ㉢ )은/는 객체 간의 메시지 통신을 분석하기 위한 것으로 시스템의 동작을 정형화하고 객체들의 메시지 교환을 시각화한다.
㉠은 소프트웨어 아키텍처, ㉡은 다형성, ㉢은 시퀀스 모델이다.
시스템 전체의 골격이자 품질 요구 사항에 따라 결정되는 구조는 아키텍처이고, 같은 메시지에 클래스마다 다르게 반응하는 성질은 다형성이며, 객체 간 메시지 교환을 시간 순서로 시각화하는 것은 시퀀스 다이어그램(모델)이다.
- 유스케이스: 사용자 관점의 시스템 기능을 표현할 뿐, 시스템 전체의 구조적 골격을 뜻하지 않는다.
- 클래스 다이어그램, 캡슐화, 상태 모델: 캡슐화는 데이터와 연산을 묶고 내부를 숨기는 개념이고, 상태 모델은 한 객체의 상태 변화를 표현하므로 ㉡·㉢에 맞지 않는다.
- 디자인 패턴, 캡슐화, 상태 모델: 디자인 패턴은 반복되는 설계 문제의 재사용 해법으로 시스템 전체의 밑그림이 아니며, ㉡·㉢도 맞지 않는다.
송신자가 만든 MAC을 수신자가 점검해 전송 중 변조 여부를 확인한다는 설명이 옳은 서술이다. MAC은 공개키 방식 고유의 기법은 아니지만 메시지 무결성 확인 방법으로서 서술 자체에 오류가 없다.
나머지 설명은 공개키 방식의 키 사용 방향, 필요한 키 개수, 개인키 관리 주체를 잘못 서술하고 있다. 공개키 방식에서는 수신자의 공개키로 암호화하고 수신자가 자신의 개인키로 복호화한다.
- 수신자의 개인키로 암호화하고 공개키로 복호화한다는 설명은 키 사용 방향이 뒤바뀌었다.
- 사용자 n명일 때 대칭키는 개, 공개키는 개가 필요해 규모가 커질수록 대칭키 방식의 키 수가 훨씬 많아지므로, 공개키 방식이 더 많은 키를 필요로 한다는 설명은 틀리다.
- 개인키는 사용자가 직접 생성·보관하며, 인증기관이 발급하는 인증서에는 공개키와 소유자 정보가 담기므로 인증기관이 개인키를 만들어 준다는 설명은 틀리다.
부인 방지성은 전자서명 등 인증 기술이 제공하는 보안 서비스로, 워터마킹 기술의 특성이 아니다.
디지털 워터마킹은 콘텐츠에 저작권 정보를 숨겨 삽입하는 기술로, 비가시성으로 품질을 해치지 않으면서 강인성으로 공격에도 남아 있고 필요할 때 권리정보를 꺼낼 수 있어야 한다.
- 비가시성: 삽입된 워터마크가 사람 눈이나 귀로 식별되지 않아 원본 품질을 유지해야 한다.
- 강인성: 압축·필터링·자르기 등 변형이나 공격에도 워터마크가 제거되지 않아야 한다.
- 권리정보 추출성: 분쟁 시 삽입된 저작권 정보를 정확히 추출해 소유권을 입증할 수 있어야 한다.
환형대기 조건은 자원에 할당 순서를 정하고 그 순서대로만 요청하게 하여 제거하며, 순서를 어긴 요청은 거부한다는 설명이 옳다.
를 보다 먼저 할당하기로 정했다면, 를 가진 프로세스 B가 를 요청하는 것은 순서 위반이므로 거부되어 순환 대기가 생기지 않는다.
- 상호배제는 자원 고유의 성질이라 제거하기 어렵고, 점유 중인 자원을 다른 프로세스에도 동시에 할당한 뒤 나중에 철회하는 방식은 교착상태 예방 기법이 아니다.
- 할당받지 못하면 점유한 자원을 반납하게 하는 것은 비선점 조건을 제거하는 방법이므로, 점유대기 제거로 설명한 것은 틀리다.
- 시작 시점에 필요한 자원을 일괄 할당받는 것은 점유대기 조건을 제거하는 방법이므로, 비선점 제거로 설명한 것은 틀리다.
- ㄱ. 순차 파일에서의 데이터 레코드 증가는 적용된 순차 기준으로 마지막 위치에서 이루어진다.
- ㄴ. 순차 파일에서는 접근 조건으로 제시된 순차 대상 필드 값 범위에 해당하는 대량의 데이터 레코드들을 접근할 때 효과적이다.
- ㄷ. 순차 파일에서의 데이터 레코드 증가는 오버플로 블록을 생성시키지 않는다.
- ㄹ. 인덱스 순차 파일의 인덱스에는 인덱스 대상 필드 값과 그 값을 가지는 데이터 레코드를 접근할 수 있게 하는 위치 값이 기록된다.
- ㅁ. 인덱스 순차 파일에서는 인덱스 갱신없이 데이터 레코드를 추가하거나 삭제하는 것이 가능하다.
- ㅂ. 인덱스 순차 파일에서는 접근 조건에 해당하는 인덱스 대상 필드값을 가지는 소량의 데이터 레코드를 순차 파일보다 효과적으로 접근할 수 있다.
- ㅅ. 인덱스를 다중레벨로 구성할 경우, 최하위 레벨은 순차 파일 형식으로 구성된다.
public class B extends A {
int a = 20;
public B() {
System.out.print("다");
}
public B(int x) {
System.out.print("라");
}
}public class A {
int a = 10;
public A() {
System.out.print("가");
}
public A(int x) {
System.out.print("나");
}
public static void main(String[] a) {
B b1 = new B();
A b2 = new B(1);
System.out.print(b1.a + b2.a);
}
}실행 결과는 가다가라30이다.
하위 클래스 생성자는 첫 줄에서 상위 클래스의 기본 생성자 super()를 암묵적으로 호출한다. new B()는 "가" 다음 "다"를, new B(1)도 A(int)가 아닌 A()를 먼저 호출해 "가" 다음 "라"를 출력한다.
필드는 재정의되지 않고 참조 변수의 선언 타입으로 결정된다. b1(B형).a는 20, b2(A형).a는 10이므로 합은 30이다.
- 다라30: 상위 클래스 생성자 A()가 먼저 실행되는 과정을 빠뜨린 결과다.
- 다라40: 생성자 호출 순서와 필드 결정 규칙을 모두 잘못 적용한 결과다.
- 가다가라40: b2.a를 실제 객체 B의 필드 20으로 본 결과로, 필드는 다형성이 적용되지 않는다.
#include <stdio.h>
double h(double *f, int d, double x) {
int i;
double res = 0.0;
for(i=d-1; i >= 0; i--) {
res = res * x + f[i];
}
return res;
}
int main() {
double f[] = {1, 2, 3, 4 };
printf("%3.1f \n", h(f, 4, 2));
return 0;
}
출력 결과는 49.0이다.
함수 h는 호너(Horner) 방식으로 다항식 의 값을 x=2에서 계산한다.
i=3: res = 0×2+4 = 4
i=2: res = 4×2+3 = 11
i=1: res = 11×2+2 = 24
i=0: res = 24×2+1 = 49
%3.1f 형식이므로 49.0이 출력된다.
- 11.0: 반복을 두 번(i=3, i=2)만 수행했을 때의 중간값이다.
- 26.0: 계수를 f[0]부터 높은 차수로 잘못 대응시킨 값(1·8+2·4+3·2+4)이다.
- 112.0: 반복 횟수나 곱셈 순서를 잘못 추적한 값으로, 실제 계산과 맞지 않는다.
- (가) 사용자 컴퓨터의 데이터를 암호화시켜 파일을 사용할 수 없도록 한 후 암호화를 풀어주는 대가로 금전을 요구하는 악성 프로그램
- (나) ‘○○○초대장’ 등의 내용을 담은 문자 메시지 내에 링크된 인터넷 주소를 클릭하면 악성 코드가 설치되어 사용자의 정보를 빼가거나 소액결제를 진행하는 악성 프로그램
(가)는 랜섬웨어, (나)는 스미싱(Smishing)이다.
랜섬웨어는 파일을 암호화해 인질로 잡고 복호화 대가를 요구하며, 스미싱은 SMS와 피싱의 합성어로 문자 메시지 링크를 통해 악성 앱을 설치시켜 정보 탈취나 소액결제를 일으킨다.
- 스파이웨어, 트로이목마: 스파이웨어는 몰래 정보를 수집할 뿐 파일을 암호화해 금전을 요구하지 않고, 트로이목마는 정상 프로그램으로 위장한 악성 코드로 문자 메시지 수법을 특정하지 않는다.
- 랜섬웨어, 파밍: 파밍은 DNS나 hosts 파일을 변조해 정상 주소 입력 시에도 가짜 사이트로 유도하는 수법이다.
- 스파이웨어, 피싱: 피싱은 주로 이메일·가짜 사이트로 개인정보를 낚는 수법이며, (가)도 스파이웨어가 아니다.

설명하는 디자인 패턴은 퍼사드(facade) 패턴이다.
퍼사드 패턴은 복잡한 서브시스템 앞에 하나의 창구 객체를 두어 단순화된 통합 인터페이스를 제공한다. 클라이언트는 서브시스템 내부를 몰라도 되므로 클래스 간 의존관계와 복잡성이 줄어든다.
- MVC pattern: 모델·뷰·컨트롤러로 역할을 분리하는 아키텍처 패턴으로, 서브시스템 앞의 단일 창구 개념이 아니다.
- mediator pattern: 여러 객체 간의 상호작용을 중재자 객체가 조정하는 행위 패턴으로, 클라이언트에게 서브시스템의 단순 인터페이스를 주는 목적과 다르다.
- bridge pattern: 추상화와 구현을 분리해 각각 독립적으로 확장하게 하는 구조 패턴이다.
DDL·DML·DCL 순서로 바르게 짝지은 것은 RENAME, SELECT, COMMIT이다.
DDL은 객체 구조를 정의·변경(CREATE·ALTER·DROP·RENAME), DML은 데이터를 조회·조작(SELECT·INSERT·UPDATE·DELETE), DCL은 권한·트랜잭션을 제어(GRANT·REVOKE·COMMIT·ROLLBACK)한다.
- UPDATE, SELECT, GRANT: UPDATE는 데이터를 수정하는 DML이므로 DDL 자리에 맞지 않다.
- RENAME, ALTER, COMMIT: ALTER는 테이블 구조를 변경하는 DDL이므로 DML 자리에 맞지 않다.
- UPDATE, ALTER, GRANT: UPDATE는 DML, ALTER는 DDL이라 앞의 두 자리가 서로 뒤바뀌었다.
( ㉠ )은/는 구글에서 개발해서 공개한 인공지능 응용프로그램 개발용 오픈소스 프레임워크이다. 이 프레임워크를 사용할 때 인공지능 소프트웨어가 이미지 및 음성을 인식하기 위해서는 신경망의 ( ㉡ ) 모델을 주로 사용한다.
㉠은 텐서플로우(TensorFlow), ㉡은 합성곱 신경망(CNN)이다.
텐서플로우는 구글이 공개한 오픈소스 머신러닝 프레임워크이고, 합성곱 신경망은 합성곱 필터로 국소 특징을 추출해 이미지·음성 인식에 널리 쓰인다.
- 텐서플로우, 논리곱 신경망: 이미지 인식에 쓰이는 대표 신경망 모델로 논리곱 신경망이라는 것은 없다.
- 알파고, 퍼셉트론: 알파고는 바둑 인공지능 프로그램이지 개발용 프레임워크가 아니며, 퍼셉트론은 초기의 단층 신경망 모델이다.
- 노드레드, 인공 신경망: 노드레드(Node-RED)는 IoT 장치 연결용 흐름 기반 개발 도구이며, 인공 신경망은 특정 모델이 아닌 포괄적 용어다.





K-map을 간소화하면 이고, 이를 NAND-NAND 2단으로 구현한 회로가 정답이다.
1인 칸 중 b=1·d=1인 네 칸이 bd, ab=00·01의 cd=00 두 칸이 , ab=10의 cd=00·01 두 칸이 로 묶인다.
곱의 합(SOP)은 1단 NAND에 각 곱항의 입력을, 2단 NAND에 그 출력을 넣으면 그대로 구현된다. 따라서 첫 단 NAND 입력이 (a, b̄, c̄), (ā, c̄, d̄), (b, d)인 회로가 맞다.
- 입력이 (a, b, d), (b, c, d̄), (ā, d)인 회로: abd·bcd̄·ād를 구현해 K-map의 0인 칸(예: ab=01, cd=10)을 1로 만든다.
- 입력이 (a, b, c̄), (a, d̄), (b, d̄)인 회로: ad̄·bd̄ 항이 ab=11, cd=00처럼 0인 칸을 1로 만든다.
- 입력이 (a, c, d), (b, c̄), (b̄, d)인 회로: b̄d 항이 ab=00, cd=01처럼 0인 칸을 1로 만든다.
#include <stdio.h>
#include <stdlib.h>
void a (int n, int *num) {
for (int i = 0; i < n; i++)
scanf("%d", &(num[i]));
}
void c(int *a, int *b) {
int t;
t = *a; *a = *b; *b = t;
}
void b(int n, int *lt) {
int a, b;
for (a = 0; a < n-1; a++)
for (b = a + 1; b < n; b++)
if (lt[a] > lt[b]) c ( ㉠ , ㉡ )
;
} int main() {
int n;
int *num;
printf("How many numbers?");
scanf("%d", &n);
num = (int *)malloc(sizeof(int) * n);
a(n, num);
b(n, num);
for (int i = 0; i < n; i++)
printf("%d ", num[i]);
}
㉠은 lt+a, ㉡은 lt+b이고 출력 결과는 1 2 4이다.
함수 c는 int 포인터 두 개를 받아 가리키는 값을 교환하므로, 배열 원소의 주소인 lt+a(=<[a])와 lt+b를 넘겨야 한다. 함수 b는 앞 원소가 더 크면 교환하는 선택 정렬 방식의 오름차순 정렬이다.
입력 3 2 1 4에서 첫 값 3은 개수 n으로 읽히고, 이어지는 2 1 4만 배열에 저장된다. 이를 오름차순 정렬하면 1 2 4가 출력된다.
- lt+a, lt+b, 1 2 3 4: 첫 입력 3을 개수가 아닌 데이터로 본 결과다.
- lt[a], lt[b], 4 3 2 1: lt[a]는 int 값이므로 포인터 매개변수에 넘길 수 없고, 정렬도 오름차순이다.
- lt[a], lt[b], 4 2 1: 인자 형식이 맞지 않으며 정렬 방향도 반대다.
| A | |
|---|---|
| 1 | 3 |
| 2 | 7 |
| 3 | 5 |
| 4 | 3 |
| 5 | 0 |
| 6 | 1 |
값이 나머지와 다른 수식은 =GCD(A1,A6)으로, 결과가 1이다. 나머지는 모두 3이다.
A1=3, A6=1이고, A1:A6은 3, 7, 5, 3, 0, 1이다. 3과 1의 최대공약수는 1이다.
- =MEDIAN(A1:A6): 정렬하면 0, 1, 3, 3, 5, 7이고 짝수 개이므로 가운데 두 값 3과 3의 평균인 3이다.
- =MODE(A1:A6): 가장 자주 나타나는 값(최빈값)은 두 번 나온 3이다.
- =POWER(A1,A6): 3의 1제곱이므로 3이다.
- ㄱ. 칩 제작을 위한 R&D 비용이 감소한다.
- ㄴ. 개별 명령어 디코딩 시간이 CISC(Complex Instruction Set Computer)보다 많이 소요된다.
- ㄷ. 동일한 기능을 구현할 경우, CISC보다 적은 수의 레지스터가 필요하다.
- ㄹ. 복잡한 연산을 수행하려면 명령어를 반복수행하여야 하므로 CISC의 경우보다 프로그램이 복잡해진다.
- ㅁ. 각 명령어는 한 클럭에 실행하도록 고정되어 있어 파이프라인 성능을 향상시킬 수 있다.
- ㅂ. 마이크로코드 설계가 어렵다.
- ㅅ. 고정된 명령어이므로 명령어 디코딩 속도가 빠르다.
RISC에 대한 옳은 설명은 ㄱ, ㄹ, ㅁ, ㅅ으로 총 4개이다.
RISC는 단순·고정 길이 명령어를 하드와이어드 제어로 빠르게 해독하고 한 클럭 실행을 지향해 파이프라인에 유리하다. 설계가 단순해 칩 개발 비용이 줄지만, 복잡한 연산은 여러 명령어 조합으로 처리해야 해 프로그램이 길어진다.
- ㄴ(틀림): 명령어 형식이 단순·고정되어 있어 디코딩 시간은 CISC보다 짧다.
- ㄷ(틀림): 메모리 접근을 load/store로 제한하므로 CISC보다 많은 레지스터를 사용한다.
- ㅂ(틀림): 마이크로코드 설계가 복잡한 것은 CISC의 특징이며, RISC는 주로 하드와이어드 제어를 쓴다.
참조하는 릴레이션(외래 키를 가진 쪽)에서 튜플을 삭제해도 참조 무결성은 위배되지 않으므로 옳지 않은 설명이다.
참조 무결성이 깨질 수 있는 경우는 참조하는 릴레이션에 대한 삽입·외래 키 수정, 그리고 참조되는 릴레이션(기본 키 쪽)에 대한 삭제·기본 키 수정이다.
- 검색 연산은 데이터를 변경하지 않으므로 어떤 무결성 제약조건도 위배하지 않는다.
- 외래 키 값은 참조되는 릴레이션의 기본 키 값 중 하나이거나 널 값이어야 한다는 것이 참조 무결성의 정의이다.
- 참조 무결성 제약조건은 DBMS가 연산 시 자동으로 검사·유지한다.
스택 영역은 쓰레드마다 따로 할당되므로, 한 쓰레드가 바꾼 스택 데이터를 다른 쓰레드가 확인할 수 있다는 설명은 옳지 않다.
같은 프로세스의 쓰레드들은 코드·데이터(정적)·힙 영역을 공유하고, 레지스터와 스택은 각자 독립적으로 가진다.
- 쓰레드는 같은 주소 공간을 공유하므로 커널 개입 없이 통신할 수 있어 프로세스 간 통신보다 효율적이다.
- 멀티프로세서에서는 각 프로세서가 쓰레드를 병렬로 실행할 수 있어 처리율이 향상된다.
- 정적 영역(전역·정적 변수)은 프로세스 내 모든 쓰레드가 공유한다.