주어진 전위식을 후위 표기로 바꾸면 a e f * + b c / - d +이다.
전위식은 연산자 뒤에 피연산자 둘이 오므로 안쪽부터 묶는다. * e f는 e*f, + a (e*f)는 a+e*f, / b c는 b/c이고, 이 둘을 -로 묶은 뒤 d와 +로 묶으면 ((a+e*f)-(b/c))+d이다.
이 구조를 피연산자 뒤에 연산자가 오도록 옮기면 a e f * +, b c /, -, d, + 순서가 된다.
- a e f * + b - c / d +는 ((a+e*f)-b)/c+d를 뜻하므로, b/c를 따로 계산하는 원래 식과 다르다.
- a e f * + b c / d + -는 (a+e*f)-(b/c+d)를 뜻하므로, d가 뺄셈 안쪽으로 들어가 원래 식과 다르다.
- a e + f * b / - c d +는 a+e를 먼저 더해 e*f 구조가 깨지고, -를 만날 때 피연산자가 하나뿐이라 식이 성립하지 않는다.
- a e + f * - b / c d +도 a+e를 먼저 더하며, -를 만날 때 피연산자가 하나뿐이라 식이 성립하지 않는다.
int x = 5;
void func(int a) {
a += x++;
printf("func: %d\n", a);
}
int main() {
int x = 2;
func(x++);
printf("main: %d\n", x);
return 0;
}
프로그램의 출력은 func: 7, main: 3이다.
main의 지역 변수 x(값 2)가 전역 x(값 5)를 가린다. func(x++)는 후위 증가이므로 2를 전달한 뒤 main의 x가 3이 된다.
func 안의 x는 전역 x이다. a += x++에서 a는 2+5=7이 되고 그 뒤 전역 x가 6이 되므로 func: 7이 출력되며, 이어서 main의 지역 x를 출력해 main: 3이 나온다.
- func: 7 main: 2는 인자 전달 뒤 main의 x가 3으로 증가한다는 점을 놓친 결과이다.
- func: 8 main: 3은 증가 전 값 2가 아니라 증가 후 값 3이 전달된다고 본 결과이다.
- func: 8 main: 2는 증가된 값을 전달했다고 보면서 main의 x는 그대로라고 본 것이어서 앞뒤가 맞지 않는다.
- func: 8 main: 1은 x를 감소시키는 연산이 없으므로 나올 수 없다.

요구 사항 분석 다음의 설계 순서는 개념적 설계, 논리적 설계, 물리적 설계, 구현이다.
개념적 설계는 DBMS와 무관하게 개념 모델(E-R 다이어그램)을 만들고, 논리적 설계는 이를 특정 데이터 모델의 스키마로 변환한다. 물리적 설계는 저장 구조와 인덱스 등을 정하며, 구현은 설계 결과를 실제 DBMS에 만드는 단계이다. 즉 추상적 단계에서 구체적 단계로 내려간다.
- 논리적 설계를 먼저 두고 물리적 설계를 구현 뒤에 둔 배열은 두 단계의 앞뒤가 모두 뒤바뀌었다.
- 개념적 설계 다음에 곧바로 물리적 설계를 두고 튜닝으로 끝내는 배열은 논리적 설계가 빠졌다.
- 논리적 설계를 개념적 설계보다 앞에 두고 물리적 설계와 구현을 잇는 배열은 첫 두 단계의 순서가 뒤바뀌었다.
- 개념 스키마 정의와 관계형 모델 설계 뒤에 구현과 백업 구성을 두는 배열은 물리적 설계가 빠졌고, 백업은 설계 단계가 아니라 운영 작업이다.
ㄱ.Docker는 호스트 OS 위에서 컨테이너를 실행하고, VM은 하이퍼바이저 위에서 전체 OS를 실행한다.
ㄴ.Docker는 경량화된 가상화 방식으로 부팅 속도가 빠르며, VM은 별도의 OS가 필요해 더 무겁다.
ㄷ.VM은 애플리케이션 간 자원 격리가 가능하지만 Docker는 그렇지 않다.
ㄹ.Docker는 커널을 공유하므로 VM보다 자원 사용 효율이 높다.
ㅁ.VM은 호스트 OS와 커널을 공유하므로 컨테이너보다 보안성이 높다.
옳은 설명은 ㄱ, ㄴ, ㄹ이다.
Docker 컨테이너는 호스트 커널을 공유하는 프로세스 수준 격리이고, VM은 하이퍼바이저 위에서 게스트 OS 전체를 실행한다.
- ㄱ(옳음): 컨테이너는 호스트 OS 위에서, VM은 하이퍼바이저 위의 전체 OS로 실행된다.
- ㄴ(옳음): 컨테이너는 OS 부팅이 없어 빠르고, VM은 별도 OS가 필요해 더 무겁다.
- ㄷ(틀림): Docker도 네임스페이스와 cgroups로 애플리케이션 간 자원을 격리한다.
- ㄹ(옳음): 컨테이너는 커널을 공유하므로 VM보다 자원 사용 효율이 높다.
- ㅁ(틀림): 호스트와 커널을 공유하는 쪽은 VM이 아니라 컨테이너이다.
| R1: | 학생번호 | 학과명 | 학과장 |
| 001 | 전자 | 홍길동 | |
| 002 | 컴퓨터 | 이순신 | |
| 003 | 건축 | 임꺽정 | |
| 004 | 컴퓨터 | 이순신 |
| R2: | 학생번호 | 학과명 | R3: | 학과명 | 학과장 |
| 001 | 전자 | 전자 | 홍길동 | ||
| 002 | 컴퓨터 | 컴퓨터 | 이순신 | ||
| 003 | 건축 | 건축 | 임꺽정 | ||
| 004 | 컴퓨터 |
도메인 이름을 IP 주소로 변환해 주는 것은 DNS이다.
웹 브라우저는 URL의 호스트 이름을 DNS 서버에 질의해 받은 IP 주소로 웹 서버에 접속한다.
- ARP는 IP 주소로 같은 네트워크 장비의 MAC 주소를 알아내는 프로토콜이다.
- RARP는 반대로 MAC 주소로 IP 주소를 알아내는 프로토콜이다.
- DHCP는 단말에 IP 주소 등 네트워크 설정을 자동 할당하는 프로토콜이다.
- NAC는 단말의 네트워크 접속을 정책에 따라 통제하는 보안 기술이다.
옳지 않은 설명은 실행하는 동안 사용자 자신의 권한이 적용된다는 내용이다.
소유자 실행 자리의 s는 SetUID를 뜻하므로, 누가 실행하든 실행 중에는 파일 소유자(user1)의 권한이 적용된다.
- 소유자와 그룹 항목이 모두 user1이므로 소유자 ID와 그룹 이름 설명은 옳다.
- 권한 뒤의 1은 하드 링크 수, 4096은 파일 크기(바이트)이므로 옳다.
- 그룹과 기타 사용자의 권한이 모두 r-x여서 쓰기 권한이 없다는 설명은 옳다.
- chmod 4755는 SetUID(4)와 rwxr-xr-x(755)를 설정해 표시된 권한과 같으므로 옳다.
원소 19는 주소 16에 저장된다.
먼저 두 해시값을 구한다.
i를 늘리며 빈 주소를 찾는다.
: 36이 차지함
: 26이 차지함
: 비어 있음
- 주소 2는 첫 탐사 위치이지만 이미 36이 저장되어 있다.
- 주소 7은 증가폭 f(19)의 값일 뿐 탐사 주소가 아니다.
- 주소 9는 두 번째 탐사 위치이지만 이미 26이 저장되어 있다.
- 주소 15는 탐사 순서 2, 9, 16에 나타나지 않는다.
과적합 해결 방법이 아닌 것은 더 많은 특성 추가이다.
특성을 늘리면 모델 복잡도가 높아져 학습 데이터의 잡음까지 그대로 학습하기 쉬우므로 과적합이 오히려 심해질 수 있다.
- 정규화는 가중치 크기에 벌점을 주어 모델 복잡도를 억제한다.
- 드롭아웃은 학습 중 일부 뉴런을 무작위로 꺼 특정 뉴런 의존을 줄인다.
- 교차 검증은 일반화 성능을 점검해 과적합되지 않는 모델을 고르게 한다.
- 더 많은 데이터를 수집하면 모델이 일반적인 패턴을 학습하기 쉬워진다.
강화학습은 보상을 기반으로 최적의 행동을 학습하는 방식이다.
에이전트가 환경과 상호작용하며 행동을 시도하고, 받은 보상의 누적이 커지도록 정책을 개선한다.
- 라벨이 있는 데이터로 학습하는 것은 지도학습이다.
- 데이터를 군집으로 나누는 것은 비지도학습이다.
- 정적 데이터 분석이 아니라 환경과 주고받는 순차적 의사결정에 쓰인다.
- 인간의 감정 이해는 강화학습의 특징이 아니다.
㉠ 학생
㉡ 성적 >= 70
㉢ 학과
㉣ COUNT(*) >= 10
ORDER BY 인원수 DESC
빈칸은 차례로 FROM, WHERE, GROUP BY, HAVING이다.
대상 테이블을 FROM으로 지정하고, 행 조건(성적 >= 70)은 WHERE로 거른 뒤, 학과별로 GROUP BY 한다. 그룹에 대한 집계 조건(COUNT(*) >= 10)은 HAVING으로 건다.
- ㉢에 ORDER BY, ㉣에 GROUP BY를 넣는 조합은 정렬이 그룹화보다 앞서고 집계 조건을 표현하지 못한다.
- ㉡에 GROUP BY, ㉣에 WHERE를 넣는 조합은 WHERE가 그룹화 뒤에 오고 집계 함수를 조건으로 쓰게 되어 틀렸다.
- ㉠에 GROUP BY, ㉡에 FROM을 넣는 조합은 FROM이 SELECT 바로 뒤에 와야 한다는 구문 순서에 어긋난다.
- ㉢에 HAVING, ㉣에 GROUP BY를 넣는 조합은 HAVING이 GROUP BY 앞에 놓여 순서가 틀렸다.
Git의 주요 기능은 코드 변경 사항을 추적하는 것이다.
Git은 분산 버전 관리 시스템으로, 변경 이력을 커밋 단위로 기록해 이전 상태 복원과 브랜치 협업을 지원한다.
- 데이터 암호화는 암호화 도구의 기능이며 Git의 목적이 아니다.
- 데이터베이스 관리는 DBMS의 기능이다.
- 소프트웨어 평가는 품질 평가나 테스트 활동에 해당한다.
- 코드 컴파일은 컴파일러의 기능이다.
큐의 적용 대상은 운영체제의 작업 스케줄링이다.
큐는 먼저 들어온 것을 먼저 처리하는 FIFO 구조여서, 대기 중인 작업을 도착 순서대로 처리하는 데 알맞다.
- 실행 취소/재실행은 최근 작업부터 되돌리므로 스택을 쓴다.
- 깊이 우선 탐색은 마지막에 방문한 정점으로 되돌아가므로 스택을 쓴다.
- 괄호의 짝 검사는 가장 최근의 여는 괄호와 맞추므로 스택을 쓴다.
- 재귀 구현은 호출 정보를 쌓는 호출 스택을 쓴다.
ㄱ.a = np.array[1, 2, 3]
ㄴ.b = np.array((1, 2, 3))
ㄷ. c = np.arrange(0, 5)
ㄹ. d = np.linspace(0, 1, num=5)
ㅁ. e = np.zeros([2, 3])
해당 명령어는 netstat이다.
netstat은 TCP 등의 연결 상태, 라우팅 테이블, 네트워크 인터페이스 통계를 보여 주는 명령어이다.
- ping은 ICMP로 대상 호스트의 도달 가능 여부를 확인한다.
- tracert는 목적지까지 거치는 라우터 경로를 추적한다.
- nslookup은 DNS에 도메인과 IP 정보를 질의한다.
- ifconfig는 인터페이스의 주소 설정을 조회·변경하는 명령어로, 연결 정보나 라우팅 테이블을 다루지 않는다.
데브옵스의 주요 목적은 소프트웨어 개발과 배포의 자동화이다.
개발과 운영을 통합하고 CI/CD 등 자동화로 변경 사항을 빠르고 안정적으로 전달하는 것을 지향한다.
- 개발팀과 운영팀의 분리는 협업을 강조하는 데브옵스와 반대이다.
- 코드 품질 저하는 목적이 될 수 없으며, 자동 검증으로 품질을 높이려 한다.
- 수동 테스트를 늘리는 것은 테스트 자동화 방향과 반대이다.
- 환경 격리는 일반적인 배포 관행일 뿐, 데브옵스의 주된 목적은 아니다.
옳지 않은 용법은 동시 접근 스레드 수를 2개로 제한하는 것이다.
바이너리 세마포어는 0과 1만 가지므로 하나만 통과시킬 수 있다. 동일 자원 여러 개의 동시 접근 수를 세는 일은 카운팅 세마포어의 용도이다.
- 공유 자원 하나를 한 번에 한 스레드만 접근하게 하는 것은 대표 용법이다.
- 데이터 도착 시 처리 스레드를 시작시키는 것은 0으로 초기화해 쓰는 신호 용법이다.
- 이벤트 완료를 다른 스레드에 알리는 것도 같은 신호 용법이다.
- 상호 배제 구현은 값 1로 초기화해 쓰는 기본 용법이다.

옳지 않은 설명은 도서 반납이 도서 검색에 포함되어 있다는 내용이다.
다이어그램에서 도서 반납과 도서 검색 사이에는 관계선이 없다. 두 유스케이스는 학생 액터에 각각 연결된 별개의 기능이며, 반납의 include 화살표는 학생 인증을 향한다.
include는 기준 유스케이스가 반드시 수행하는 기능을, extend는 상황에 따라 선택적으로 덧붙는 기능을 뜻한다.
- 대출과 반납에는 학생 인증으로 향하는 include가 있어, 인증이 필수로 수행된다는 설명은 옳다.
- 도서 위치 출력은 도서 검색을 extend하므로, 검색 중 선택적으로 수행된다는 설명은 옳다.
- 도서 등록과 삭제는 사서에 각각 연결되고 둘 사이에 관계선이 없어, 서로 독립적이라는 설명은 옳다.
- 연체 알림 문자 전송은 연체 도서 조회를 extend하므로, 조회 뒤 선택적으로 발송할 수 있다는 설명은 옳다.
핵심 특징이 아닌 것은 물리적 서버를 사용자가 직접 유지 관리한다는 내용이다.
클라우드에서는 물리 인프라를 서비스 제공자가 관리하고, 사용자는 필요한 만큼 자원을 빌려 쓴다.
- 자원 풀링은 제공자가 자원을 묶어 여러 사용자에게 나누어 주는 특징이다.
- 주문형 서비스는 사용자가 필요할 때 자원을 스스로 확보하는 특징이다.
- 확장성과 탄력성은 수요에 따라 자원을 늘리고 줄이는 특징이다.
- 광범위한 네트워크 접근은 다양한 단말에서 네트워크로 이용하는 특징이다.
순서(sequence) 번호: 2000
확인응답(acknowledgement) 번호: 190
B가 보내는 확인응답 번호는 2500이다.
TCP 확인응답 번호는 다음에 받기를 기대하는 바이트 번호이다.
순서 번호 2000부터 500바이트를 받았으므로 마지막 바이트는 2499이다.
- 500은 데이터 길이일 뿐 바이트 번호가 아니다.
- 690은 A가 보낸 확인응답 번호에 데이터 길이를 더한 값으로, 수신 위치와 무관하다.
- 2001은 1바이트만 받았을 때의 값이다.
- 2501은 다음에 받을 바이트 번호보다 1이 커서, 아직 받지 않은 바이트까지 받았다고 알리는 값이다.