두 수를 비트별로 XOR 하면 01011010 이 되고, 이를 16진수로 바꾸면 5A이다.
XOR는 두 비트가 서로 다르면 1, 같으면 0 을 낸다.
4비트씩 끊어 16진수로 바꾼다.
- 6B 는 01101011 로, 계산 결과와 비트 패턴이 다르다.
- A5 는 상위·하위 4비트를 뒤바꾼 값이다.
- B6 은 10110110 으로, 계산 결과와 다르다.
NFC는 액세스 포인트 없이 가까이 댄 두 장치가 직접 통신하는 근거리 무선 방식이므로 옳다.
NFC 는 수 cm 이내의 아주 짧은 거리에서 기기끼리 1:1 로 데이터를 주고받으며, 결제·출입 태그 등에 쓰인다.
- 블루투스는 프로파일만 맞으면 스마트폰·헤드셋·키보드처럼 서로 다른 유형의 기기 간에도 통신할 수 있다.
- NFC 는 블루투스보다 최대 전송 속도가 느리다.
- 통신 거리는 NFC 가 가장 짧고 블루투스, Wi-Fi, LTE 순으로 길어지므로, NFC 를 Wi-Fi 와 LTE 사이에 둔 나열은 틀렸다.
<보기>
| 프로세스 | 도착시간 | 실행시간 |
|---|---|---|
| P1 | 0 | 3 |
| P2 | 1 | 4 |
| P3 | 3 | 2 |
평균 응답시간은 약 5.7이다.
시간 할당량 2로 실행하면 P1(0~2) → P2(2~4) → P1(4~5, 종료) → P3(5~7, 종료) → P2(7~9, 종료) 순이다. 시각 2에는 대기 큐에 P2만 있고, P3은 시각 3에 도착해 시각 4에 선점된 P2보다 앞에 선다.
응답시간(종료 − 도착)은 P1 5, P2 8, P3 4이다.
소수점 둘째자리에서 반올림하면 5.7이 된다.
- 6.0: 응답시간 합이 18일 때의 값으로, 실제 합 17과 맞지 않는다.
- 7.0: 응답시간 합이 21일 때의 값으로, 실제 합 17과 맞지 않는다.
- 7.3: 응답시간 합이 22일 때의 값으로, 실제 합 17과 맞지 않는다.
#include <stdio.h>
int main() {
int a=120, b=45;
while ( a != b ) {
if ( a > b) a = a - b;
else b = b -a;
}
printf("%d", a);
}
출력값은 15로, 두 수의 최대공약수를 구하는 코드이다.
큰 수에서 작은 수를 빼는 과정을 두 수가 같아질 때까지 반복한다. (120, 45) → (75, 45) → (30, 45) → (30, 15) → (15, 15)에서 반복이 끝나고 a의 값 15가 출력된다.
- 5: 120과 45의 공약수이지만 최대공약수가 아니다.
- 20: 반복 중 어느 단계에서도 나타나지 않는 값이다.
- 25: 반복 중 어느 단계에서도 나타나지 않는 값이다.
<보기>
- 단계 0 : 6 5 8 9 4 2
- 단계 1 : 6 5 8 2 4 9
- 단계 2 : 6 5 4 2 8 9
- 단계 3 : 2 5 4 6 8 9
- 단계 4 : 2 4 5 6 8 9
- 단계 5 : 2 4 5 6 8 9
각 단계마다 남은 구간의 최댓값을 골라 끝자리와 한 번 교환하므로 선택 정렬이다.
단계 1에서 9와 2, 단계 2에서 8과 4, 단계 3에서 6과 2를 교환했고 단계 4에서는 5와 4를 교환했다. 한 단계에 교환이 한 번만 일어나는 것이 선택 정렬의 특징이다.
- 쉘 정렬: 일정 간격으로 떨어진 원소끼리 묶어 삽입 정렬하는 방식이라 이런 교환 형태가 나오지 않는다.
- 히프 정렬: 먼저 배열을 히프로 재구성하므로 단계 1부터 원소 배치가 크게 바뀐다.
- 버블 정렬: 인접 원소를 연속 교환하므로 단계 1 결과가 5 6 8 4 2 9처럼 되어야 한다.
값이 비어 있는지 비교할 때는 IS NULL 을 쓰므로, 입사년도가 NULL 인 직원을 조회하는 문장이 문법적으로 옳다.
NULL 은 '알 수 없는 값'이라 = 로 비교할 수 없고, 반드시 IS NULL 또는 IS NOT NULL 로 검사한다.
- 그룹화는 GROUP BY 부서 로 써야 하며, BY 가 빠지면 문법 오류이다.
- % 같은 와일드카드 패턴 검색은 = 가 아니라 LIKE '최%' 로 써야 한다.
- 여러 값 중 하나와 일치하는지는 = 가 아니라 IN (2014, 2015) 로 써야 한다.
<보기>
- 실린더 (cylinder) 개수: 32,768 개
- 면 (surface) 개수: 4개
- 트랙 (track) 당 섹터 (sector) 개수: 256 개
- 섹터크기 (sector size): 512 bytes
최대 저장 용량은 16GB이다.
용량 = 실린더 수 × 면 수 × 트랙당 섹터 수 × 섹터 크기이다.
이므로 16GB가 된다.
- 4GB: 면 수 4를 곱하지 않은 값이다.
- 64GB: 실제 값의 4배로, 면 수를 두 번 곱한 것과 같다.
- 1TB: 실제 값의 64배로 계산 결과와 거리가 멀다.
<보기>
직원(사번, 이름, 주민등록번호, 주소, 나이, 성별, 부서번호)
(이름, 나이)는 유일성을 만족하지 못해 후보키가 될 수 없다.
조건에서 나이가 같은 동명이인이 있을 수 있다고 했으므로 두 속성을 묶어도 튜플을 하나로 식별할 수 없다. 후보키는 유일성과 최소성을 모두 갖춰야 한다.
- 부서번호: 부서 테이블을 참조하는 속성이므로 외래키이다.
- 사번: 유일한 값을 가지므로 기본키로 정할 수 있다.
- 주민등록번호: 유일한 값을 갖는 후보키로, 사번을 기본키로 정하면 대체키가 된다.
내부 구현이 아니라 입력과 출력만으로 기능을 검사하는 것은 블랙박스 테스트이므로, 이를 화이트박스 테스트로 설명한 것이 옳지 않다.
화이트박스 테스트는 소스 코드의 논리 구조(분기·조건·반복 경로)를 들여다보며 검사하는 구조 기반 테스트이다.
- 베타 테스트는 개발자 없이 고객 사이트에서 실제 사용자가 수행하는 인수 테스트이다.
- 회귀 테스트는 수정한 부분이 기존의 다른 부분에 새 오류를 일으키지 않았는지 다시 검사한다.
- 스트레스 테스트는 비정상적으로 많은 양이나 빈도로 자원을 요구해 한계 상황에서의 동작을 확인한다.
<보기>
char A[20][30];
행 우선 주소는 1,247, 열 우선 주소는 1,148이다.
A는 20행 30열이다. 행 우선은 앞선 8개 행(행당 30개)을 지나 7칸 이동한다.
열 우선은 앞선 7개 열(열당 20개)을 지나 8칸 이동한다.
- 1,167, 1,148: 행 우선 주소를 한 행의 원소 수 20으로 잘못 잡아 계산한 값이다.
- 1,167, 1,218: 행 우선·열 우선 모두 행과 열의 크기를 뒤바꿔 계산한 값이다.
- 1,247, 1,218: 열 우선 주소를 한 열의 원소 수 30으로 잘못 잡아 계산한 값이다.
IPv4는 32비트를 8비트씩 4부분으로, IPv6는 128비트를 16비트씩 8부분으로 나누어 표시한다.
IPv4 는 192.168.0.1 처럼 10진수 4부분을 점으로 구분하고, IPv6 는 2001:0db8:: 처럼 16진수 4자리씩 8부분을 콜론으로 구분한다.
- IPv6 를 8비트씩 16부분으로 나눈 조합은 표기 단위가 틀렸다.
- IPv4 를 64비트, IPv6 를 256비트로 본 조합들은 주소 길이 자체가 틀렸다.

틀린 것은 후위순회 결과이다. 올바른 후위순회는 D → B → E → F → C → A이다.
후위순회는 왼쪽 서브트리 → 오른쪽 서브트리 → 루트 순이므로 루트 A가 맨 마지막에 와야 한다. 제시된 결과는 A가 중간에 있어 성립하지 않는다.
- 중위순회 D → B → A → E → C → F: 왼쪽 → 루트 → 오른쪽 순서와 맞다.
- 레벨순회 A → B → C → D → E → F: 위 레벨부터 왼쪽에서 오른쪽으로 방문한 결과와 맞다.
- 전위순회 A → B → D → C → E → F: 루트 → 왼쪽 → 오른쪽 순서와 맞다.
인터럽트 사이클은 실행 사이클이 끝난 뒤에 수행되므로, 순서는 인출 → 실행 → 인터럽트이다. 실행보다 인터럽트를 앞에 둔 설명이 옳지 않다.
CPU 는 현재 명령어 실행을 마친 다음 인터럽트 요청을 확인하고, 요청이 있으면 인터럽트 사이클에서 복귀 주소를 저장하고 처리 루틴으로 분기한다.
- 인터럽트는 입출력 완료, 하드웨어 고장, 0 나누기 같은 프로그램 오류 등으로 발생한다.
- 우선순위 판별에는 소프트웨어적인 폴링 방식과 하드웨어적인 데이지 체인 방식이 있다.
- 인터럽트 처리 전 PC 등 레지스터 문맥을 저장해 두어야 처리 후 원래 프로그램을 재개할 수 있다.
| A | B | C | |
|---|---|---|---|
| 1 | 성명 | 월적립액 | 만기지급금 |
| 2 | 김** | ₩ 30,000 | ₩ 1,145,440 |
| 3 | 이** | ₩ 50,000 | ₩ 1,909,070 |
올바른 수식은 =ROUNDDOWN(FV(4%/12, 3*12, -B2), -1)이다.
월 복리이므로 이율은 연이율을 12로 나눈 4%/12, 기간은 3*12=36개월이다. 적립액은 지출이므로 -B2로 넣어 양수 결과를 얻는다.
10원 단위 미만 절사는 일의 자리를 버리는 것이므로 ROUNDDOWN의 자릿수 인수는 -1이다. 결과 1,145,440의 일의 자리가 0인 것과도 맞는다.
- 연이율 4%를 그대로 쓰고 -1 자리 절사: 월 단위 기간에 연이율을 적용해 금액이 지나치게 커진다.
- 연이율 4%를 그대로 쓰고 -2 자리 절사: 이율과 절사 자릿수가 모두 틀렸다.
- 4%/12를 쓰고 -2 자리 절사: 100원 미만을 버려 1,145,400이 되므로 표의 값과 다르다.
정점이 n 개인 연결그래프의 신장트리는 항상 n-1 개의 간선을 가진다.
신장트리는 모든 정점을 사이클 없이 연결한 트리이며, 정점 n 개를 하나로 잇는 트리의 간선 수는 정확히 n-1 이다.
- 간선이 n 개면 반드시 사이클이 생겨 트리가 아니다.
- 는 무방향 완전그래프의 간선 수이다.
- 은 인접 행렬의 원소 수로, 신장트리의 간선 수와 무관하다.
<보기>
- ㄱ. 결정자가 후보키가 아닌 함수 종속성을 제거한다.
- ㄴ. 부분 함수 종속성을 제거한다.
- ㄷ. 속성을 원자값만 갖도록 분해한다.
- ㄹ. 이행적 함수 종속성을 제거한다.
정규화 순서는 ㄷ → ㄴ → ㄹ → ㄱ이다.
제1정규형은 속성을 원자값만 갖도록 분해하고, 제2정규형은 부분 함수 종속, 제3정규형은 이행적 함수 종속을 제거한다. BCNF는 결정자가 후보키가 아닌 함수 종속까지 제거한다.
- ㄱ → ㄴ → ㄷ → ㄹ: BCNF 작업인 ㄱ이 맨 앞에 와서 제1정규형이 될 수 없다.
- ㄱ → ㄷ → ㄹ → ㄴ: BCNF 작업이 맨 앞에 오고 부분 함수 종속 제거가 맨 뒤로 밀려 순서가 맞지 않는다.
- ㄷ → ㄱ → ㄴ → ㄹ: 제2정규형 자리에 BCNF 작업이 와서 순서가 맞지 않는다.
class Division {
public static void main(String[] args) {
int a, b, result;
a = 3;
b = 0;
try {
result = a / b;
System.out.print("A");
}
catch (ArithmeticException e) {
System.out.print("B");
}
finally {
System.out.print("C");
}
System.out.print("D");
}
}출력 결과는 BCD이다.
정수 3을 0으로 나누면 ArithmeticException이 발생해 try 블록의 나머지(A 출력)는 실행되지 않고 catch 블록에서 B를 출력한다. 이어 finally 블록은 항상 실행되어 C를, 예외 처리가 끝난 뒤 D를 출력한다.
- ACD: 예외가 발생하지 않았을 때의 흐름으로, A는 출력될 수 없다.
- ABCD: 예외 발생 지점 이후의 A 출력문까지 실행된 것으로 본 잘못된 결과이다.
- BACD: 예외 처리 후 try 블록으로 되돌아가지 않으므로 A가 나올 수 없다.
<보기>
- (1) A와 B는 개인키와 공개키 쌍을 각각 생성한다.
- (2) A는 ( ㉠ )를 사용하여 암호화한 메시지를 B에게 전송한다.
- (3) B는 ( ㉡ )를 사용하여 수신된 메시지를 해독한다.
㉠은 A의 개인키, ㉡은 A의 공개키이다.
전자 서명은 송신자만 가진 개인키로 암호화해 송신자 인증과 부인 방지를 제공한다. 누구나 얻을 수 있는 A의 공개키로 복호화되면 A가 보낸 메시지임이 확인된다.
- A의 개인키와 B의 공개키: 키 쌍이 서로 달라 복호화되지 않는다.
- A의 공개키와 B의 개인키: 공개키로 암호화하면 누구나 서명할 수 있어 서명이 되지 않으며 키 쌍도 맞지 않는다.
- B의 공개키와 B의 개인키: 기밀성을 위한 암호화 방식으로, 송신자를 인증하는 전자 서명이 아니다.
Python은 실행 중에 변수의 자료형이 정해지는 동적 타이핑 언어이며 인터프리터 방식으로 실행되므로, 정적 타이핑·컴파일러 방식이라는 설명이 옳지 않다.
Python 은 변수 선언 시 자료형을 쓰지 않고, 같은 변수에 다른 자료형의 값을 다시 대입할 수도 있다.
- Objective-C, Java, C# 은 클래스와 객체를 중심으로 하는 객체지향 언어이다.
- ASP, JSP, PHP 는 웹 서버에서 실행되어 결과를 HTML 로 보내는 서버 측 스크립트 언어이다.
- XML 은 사용자가 태그를 정의할 수 있는 확장 가능한 표준 마크업 언어이다.
<보기>
- 서비스 모델은 IaaS, PaaS, SaaS로 구분한다.
- 필요한 만큼 자원을 임대하여 사용할 수 있다.
- 가상화 기술, 서비스 프로비저닝(Provisioning) 기술, 과금체계 등을 필요로 한다.
설명에 해당하는 기술은 클라우드 컴퓨팅이다.
IaaS·PaaS·SaaS 서비스 모델, 필요한 만큼 자원을 빌려 쓰는 종량제 임대, 가상화와 프로비저닝 기술은 모두 클라우드 컴퓨팅의 특징이다.
- 빅데이터: 대용량 데이터를 수집·분석하는 기술로 서비스 모델 구분과 관련이 없다.
- 딥 러닝: 다층 신경망 기반 기계 학습 기법이다.
- 사물 인터넷: 사물에 센서와 통신 기능을 넣어 인터넷으로 연결하는 기술이다.