안녕하세요. 2024년 2회 정보처리기사 실기 기출문제를 정리해보았습니다. 나름대로 공부를 하면서 이해하기 쉽게 해설을 달아 놓았습니다.
해당 복원된 기출문제가 많은 분들에게 도움이 되었으면 좋겠습니다.
문제 1. [Java] 코드 출력값 문제 (객체 비교)
다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오
class Main {
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(a, c);
check(b, c);
}
public static void check(int[] a, int[] b) {
if(a==b) {
System.out.print("O");
} else {
System.out.print("N");
}
}
}
Java에서 배열을 new int[]{} 구문으로 생성하면 각각 새로운 메모리 공간에 할당됩니다. 따라서 변수 a, b, c는 모두 서로 다른 배열 객체를 참조합니다. check 메소드에서 a == b 비교는 배열의 내용이 아닌 객체의 주소(참조)를 비교합니다. a, b, c는 모두 다른 객체이므로, check(a, b), check(a, c), check(b, c) 호출 시 비교 결과는 모두 false가 되어 "N"이 출력됩니다. 세 번의 호출 결과가 이어져 출력됩니다.
답 : NNN
문제 2. [용어] 데이터베이스 반정규화
다음 문제에서 설명하는 용어를 작성하시오
데이터를 중복시켜 성능을 향상시키기 위한 기법으로 데이터를 중복 저장하거나 테이블을 합치는 등으로 성능을 향상시키지만 데이터 무결성이 저하될 수 있는 기법
설명하는 용어는 '반정규화(Denormalization)'입니다. 정규화된 데이터베이스 모델에서 시스템 성능 향상, 개발 및 운영 편의성 등을 위해 의도적으로 정규화 원칙을 위배하는 행위를 말합니다. 조인(Join) 횟수를 줄이거나 테이블 접근 경로를 단순화하기 위해 테이블을 통합/분할하거나 중복된 데이터를 추가하는 등의 방법을 사용합니다. 이로 인해 조회 성능은 향상될 수 있으나, 데이터 중복으로 인한 저장 공간 낭비 및 데이터 일관성 유지가 어려워지는 단점이 있습니다.
답 : 반정규화
문제 3. [SQL] INSERT/SELECT/UPDATE 구문
다음은 SQL에 관한 문제이다. 아래 SQL 구문의 빈칸을 작성하시오
테이블 정의 사원[사원번호(PK), 이름, 나이, 부서] 부서[부서번호(PK), 부서명, 위치] (주어진 문제의 부서 테이블 정의가 불명확하여 일반적인 형태로 수정함)
INSERT INTO 사원 ( 사원번호, 이름, 나이, 부서) [ 1 ] (32431, ‘정실기’, 23, ‘영업’);
INSERT INTO 부서 ( 사원번호, 이름, 나이, 부서) [ 2 ] 사원번호, 이름, 나이, 23 FROM 사원 WHERE 이름 = ‘정실기’;
SELECT * [ 3 ] 사원;
UPDATE 사원 [ 4 ] 부서 = ‘퇴사’ WHERE 사원번호 = 32431;
1. VALUES: INSERT INTO 문에서 직접 값을 삽입할 때 사용하는 키워드입니다. 2. SELECT: INSERT INTO ... SELECT 문은 다른 테이블에서 조회한 결과를 현재 테이블에 삽입할 때 사용합니다. 3. FROM: SELECT 문에서 조회할 테이블을 지정하는 키워드입니다. 4. SET: UPDATE 문에서 변경할 컬럼과 값을 지정하는 키워드입니다.
답 : 1 - VALUES 2 - SELECT 3 - FROM 4 - SET
문제 4. [DB] 릴레이션 Cardinality/Degree
다음 릴레이션의 Cardinality 와 Degree를 작성하시오.
이름
나이
A
B
김
23
1
5
이
25
2
3
박
42
3
8
최
20
2
9
고
25
1
2
Cardinality (카디널리티): 릴레이션(테이블)에 포함된 튜플(Tuple, 행, Row)의 수를 의미합니다. 위 테이블에는 5개의 행이 있으므로 Cardinality는 5입니다. Degree (차수): 릴레이션(테이블)에 포함된 애트리뷰트(Attribute, 속성, 열, Column)의 수를 의미합니다. 위 테이블에는 '이름', '나이', 'A', 'B' 총 4개의 열이 있으므로 Degree는 4입니다.
답 : Cardinality : 5 Degree : 4
문제 5. [네트워크] 프로토콜 용어 (IPSec)
다음은 프로토콜에 대한 내용이다. 아래 내용을 읽고 알맞는 답을 작성하시오.
Network layer에서 IP패킷을 암호화하고 인증하는 등의 보안을 위한 표준이다.
기업에서 사설 인터넷망으로 사용할 수 있는 VPN(Virtual Private Network)을 구현하는데 사용되는 프로토콜이다.
AH(Authentication Header)와 ESP(Encapsulating Security Payload)라는 두 가지 보안 프로토콜을 사용한다.
제시된 설명은 IPSec (Internet Protocol Security) 프로토콜에 대한 내용입니다. IPSec은 IP 계층(네트워크 계층)에서 통신 세션의 각 IP 패킷을 인증하고 암호화하여 IP 통신을 보호하는 프로토콜 모음입니다. 특히 VPN 구현에 널리 사용되며, 인증(AH)과 암호화(ESP)를 통해 기밀성, 무결성, 데이터 출처 인증 등을 제공합니다.
답 : IPSec
문제 6. [Python] 코드 출력값 문제 (문자열 검색)
다음은 Python에 대한 문제이다. 아래 코드를 읽고 알맞는 출력 값을 작성하시오.
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
a = "abdcabcabca"
p1 = "ab";
p2 = "ca";
out = f"ab{fnCalculation(a,p1)}ca{fnCalculation(a,p2)}"
print(out)
1. a = "abdcabcabca": 대상 문자열입니다. 2. p1 = "ab": 첫 번째로 찾을 패턴입니다. 3. p2 = "ca": 두 번째로 찾을 패턴입니다. 4. fnCalculation(a, p1) 호출: "abdcabcabca"에서 "ab"를 찾습니다. 인덱스 0 ("ab"), 인덱스 4 ("ab"), 인덱스 7 ("ab")에서 총 3번 발견됩니다. 함수는 3을 반환합니다. 5. fnCalculation(a, p2) 호출: "abdcabcabca"에서 "ca"를 찾습니다. 인덱스 3 ("ca"), 인덱스 6 ("ca"), 인덱스 9 ("ca")에서 총 3번 발견됩니다. 함수는 3을 반환합니다. 6. out = f"ab{fnCalculation(a,p1)}ca{fnCalculation(a,p2)}": f-string을 사용하여 문자열을 조합합니다. fnCalculation(a,p1) 결과인 3과 fnCalculation(a,p2) 결과인 3가 각각 중괄호 안에 삽입됩니다. 7. 따라서 out 변수에는 "ab3ca2" 문자열이 저장됩니다.
답 : ab3ca3
문제 7. [암호화] 알고리즘 용어 (AES)
아래 설명하는 내용을 확인하여 알맞는 알고리즘을 작성하시오.
대칭키 알고리즘으로 1997년 NIST(미국 국립 기술 표준원)에서 DES를 대체하기 위해 생성되었다.
128비트, 192비트 또는 256비트의 가변 키 크기와 128비트의 고정 블록 크기를 사용한다.
높은 안전성과 효율성, 속도 등으로 인해 DES 대신 전 세계적으로 많이 사용되고 있다.
설명하는 알고리즘은 AES (Advanced Encryption Standard)입니다. AES는 1997년 미국 NIST에서 기존 DES(Data Encryption Standard)의 보안 취약점을 해결하고 대체하기 위해 공모를 통해 선정된 표준 대칭키 암호화 알고리즘입니다. Rijndael(라인달) 알고리즘에 기반하며, 128비트 블록 크기를 사용하고 키 길이는 128, 192, 256비트 중 선택할 수 있어 유연성과 높은 보안 강도를 제공합니다.
답 : AES
문제 8. [네트워크] 패킷 교환 방식
패킷 교환 방식 중에 연결형과 비연결형에 해당하는 방식을 작성하시오
연결형 교환 방식
비연결형 교환 방식
패킷 교환(Packet Switching)은 데이터를 작은 단위인 패킷으로 나누어 전송하는 방식입니다. 1. 연결형 교환 방식 (Connection-Oriented Switching): 데이터를 전송하기 전에 송신자와 수신자 사이에 논리적인 연결(경로)을 설정하고, 모든 패킷이 이 설정된 경로를 따라 순서대로 전송되는 방식입니다. 대표적으로 가상회선(Virtual Circuit) 방식이 있습니다. 패킷의 순서 보장 및 오류 제어가 용이하지만, 연결 설정 과정이 필요합니다. 2. 비연결형 교환 방식 (Connectionless Switching): 사전에 경로를 설정하지 않고, 각 패킷이 독립적으로 목적지 주소를 가지고 네트워크를 통해 최적의 경로를 찾아 전송되는 방식입니다. 대표적으로 데이터그램(Datagram) 방식이 있습니다. 유연하고 특정 경로의 장애에 강하지만, 패킷 도착 순서가 보장되지 않을 수 있고 수신 측에서 재조립이 필요할 수 있습니다. 인터넷의 IP가 대표적인 데이터그램 방식입니다.
답 : 1. 가상회선 2. 데이터그램
문제 9. [SW설계] 모듈 결합도
아래 내용을 확인하고 보기에서 알맞는 답을 고르시오.
실행 순서가 밀접한 관계를 갖는 기능을 모아 모듈로 구성한다. 한 모듈 내부의 한 기능 요소에 의한 출력 자료가 다음 기능 원소의 입력 자료로서 제공되는 형태이다.
순차적 결합도 (Sequential Coupling): 한 모듈 내의 한 활동의 출력이 다른 활동의 입력으로 사용될 때의 결합도입니다. 즉, 데이터가 순서대로 흘러가는 관계입니다. (두 번째 설명에 해당)
답 : ㅂ. 순차적 결합도(Sequential Coupling)
문제 10. [SW설계] 디자인 패턴 (Iterator)
아래는 디자인 패턴에 관한 설명이다. 아래 설명을 읽고 보기에서 알맞는 용어를 작성하시오.
컬렉션 객체(리스트, 배열 등)의 내부 구조를 노출하지 않고 요소들에 순차적으로 접근할 수 있게 하는 패턴이다. 이 패턴은 객체의 내부 표현 방식(예: 배열 기반 리스트, 연결 리스트)에 독립적으로 요소에 접근할 수 있도록 해준다. 반복 프로세스(순회)를 별도의 객체(Iterator 객체)에 캡슐화하여 클라이언트 코드가 컬렉션의 구체적인 구현에 종속되지 않도록 한다.
보기
생성 패턴
구조 패턴
행위 패턴
Singleton
Adapter
Iterator
Factory Method
Bridge
Visitor
Abstract Factory
Composite
Observer
설명하는 디자인 패턴은 Iterator (반복자) 패턴입니다. Iterator 패턴은 GoF(Gang of Four) 디자인 패턴 중 행위 패턴(Behavioral Pattern)에 속합니다. 이 패턴의 주요 목적은 집합 객체(컬렉션)의 내부 표현을 노출하지 않으면서 그 요소들에 순차적으로 접근하는 방법을 제공하는 것입니다. 이를 통해 클라이언트는 컬렉션의 구체적인 타입(ArrayList, LinkedList 등)을 몰라도 일관된 방식으로 요소들을 순회할 수 있습니다.
답 : Iterator
문제 11. [네트워크] RIP 최단 경로
아래 그림을 바탕으로 RIP을 구성하여 최단 경로 비용을 계산하여 흐름에 맞게 작성하시오.
RIP (Routing Information Protocol)는 대표적인 거리 벡터 라우팅 프로토콜로, 경로 선택의 기준으로 홉 수(Hop Count)를 사용합니다. 홉 수는 목적지 네트워크까지 도달하는 데 거쳐야 하는 라우터(노드)의 개수를 의미하며, 각 링크(직접 연결)의 비용은 1로 간주합니다. RIP는 홉 수가 가장 적은 경로를 최단 경로로 선택합니다.
경로 1: A → D → C → F 홉 수: A→D (1), D→C (2), C→F (3) = 3 홉 비용: Cost(A→D) + Cost(D→C) + Cost(C→F) = 1 + 2 + 5 = 8 경로 2: A → D → C → E → F 홉 수: A→D (1), D→C (2), C→E (3), E→F (4) = 4 홉 비용: Cost(A→D) + Cost(D→C) + Cost(C→E) + Cost(E→F) = 1 + 2 + 1 + 2 = 6
답 : A → D → C → F
문제 12. [운영체제] SRT 스케줄링 평균 대기시간
아래의 표를 확인하여 SRT(Shortest Remaining Time) 스케줄링의 평균 대기시간을 계산하여 작성하시오.
프로세스
도착 시간
서비스 시간 (총 실행 시간)
A
0
8
B
1
4
C
2
9
D
3
5
SRT (Shortest Remaining Time) 스케줄링은 선점형 SJF(Shortest Job First) 방식으로, 현재 실행 중인 프로세스의 남은 실행 시간보다 더 짧은 실행 시간을 가진 새로운 프로세스가 도착하면 실행 중인 프로세스를 중단하고 새 프로세스를 실행합니다.
시간 흐름에 따른 실행 (Gantt 차트):
시간 | 실행 중 | 남은 시간 (A,B,C,D) | 완료 | 설명
-----------------------------------------------------------------------
0 | A | (8, -, -, -) | | A 도착, 실행 시작
1 | B | (7, 4, -, -) | | B 도착. B(4) < A(7). A 선점, B 실행
2 | B | (7, 3, 9, -) | | C 도착. B(3)이 가장 짧음. B 계속 실행
3 | B | (7, 2, 9, 5) | | D 도착. B(2)이 가장 짧음. B 계속 실행
4 | B | (7, 1, 9, 5) | | B 실행 중
5 | D | (7, -, 9, 5) | B | B 완료. 남은 것 중 가장 짧은 D(5) 실행
...
10 | A | (7, -, 9, -) | B, D | D 완료. 남은 것 중 가장 짧은 A(7) 실행
...
17 | C | (-, -, 9, -) | B, D, A | A 완료. 남은 C(9) 실행
...
26 | - | (-, -, -, -) | B, D, A, C | C 완료. 모든 프로세스 종료
대기 시간 계산 (대기 시간 = 종료 시간 - 도착 시간 - 실행 시간): - A 대기 시간: 17(종료) - 0(도착) - 8(실행) = 9 - B 대기 시간: 5(종료) - 1(도착) - 4(실행) = 0 - C 대기 시간: 26(종료) - 2(도착) - 9(실행) = 15 - D 대기 시간: 10(종료) - 3(도착) - 5(실행) = 2
평균 대기 시간 계산: 총 대기 시간 = 9 + 0 + 15 + 2 = 26 평균 대기 시간 = 총 대기 시간 / 프로세스 수 = 26 / 4 = 6.5
1. `int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};`: 3x3 2차원 배열을 초기화합니다. 2. `int* parr[2] = {arr[1], arr[2]};`: `int*` (정수 포인터) 타입의 요소를 2개 가지는 배열 `parr`을 선언합니다. `parr[0]`에는 `arr[1]`의 시작 주소 (배열 `{4, 5, 6}`의 시작 주소)가 저장됩니다. `parr[1]`에는 `arr[2]`의 시작 주소 (배열 `{7, 8, 9}`의 시작 주소)가 저장됩니다. 3. `parr[1][1]`: `parr[1]`은 `arr[2]`를 가리키므로, `parr[1][1]`은 `arr[2][1]`과 같습니다. 값은 8입니다. 4. `*(parr[1]+2)`: `parr[1]`은 `arr[2]`의 시작 주소입니다. `parr[1]+2`는 `arr[2]`의 시작 주소에서 `int` 크기 * 2 만큼 뒤의 주소, 즉 `arr[2][2]`의 주소를 의미합니다. `*` 연산자로 해당 주소의 값을 가져오므로, 값은 9입니다. 5. `**parr`: `parr`는 포인터 배열 `parr`의 시작 주소입니다. `*parr`는 `parr[0]`의 값, 즉 `arr[1]`의 시작 주소입니다. `**parr`는 `arr[1]`의 시작 주소가 가리키는 값, 즉 `arr[1][0]`의 값입니다. 값은 4입니다. 6. 최종 계산: `parr[1][1] + *(parr[1]+2) + **parr` = 8 + 9 + 4 = 21.
답 : 21
문제 14. [Java] 코드 출력값 문제 (인터페이스 구현)
다음은 Java 언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
class Main {
public static void main(String[] args) {
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
ODDNumber OE = new ODDNumber();
System.out.print(OE.sum(a, true) + ", " + OE.sum(a, false));
}
}
interface Number {
int sum(int[] a, boolean odd);
}
class ODDNumber implements Number {
public int sum(int[] a, boolean odd) {
int result = 0;
for(int i = 0; i < a.length; i++) {
if((odd && a[i] % 2 != 0) || (!odd && a[i] % 2 == 0))
result += a[i];
}
return result;
}
}
1. `main` 메소드에서 정수 배열 `a = {1, 2, 3, 4, 5, 6, 7, 8, 9}`가 선언됩니다. 2. `Number` 인터페이스를 구현한 `ODDNumber` 클래스의 객체 `OE`가 생성됩니다. 3. `OE.sum(a, true)` 호출: `sum` 메소드의 `odd` 매개변수가 `true`입니다. `if` 조건 `(odd && a[i] % 2 != 0)` 부분이 `true`가 되는 경우만 `result`에 더해집니다. 즉, 배열 `a`의 요소 중 홀수만 더합니다. 홀수 합 = 1 + 3 + 5 + 7 + 9 = 25. 4. `OE.sum(a, false)` 호출: `sum` 메소드의 `odd` 매개변수가 `false`입니다. `if` 조건 `(!odd && a[i] % 2 == 0)` 부분이 `true`가 되는 경우만 `result`에 더해집니다. 즉, 배열 `a`의 요소 중 짝수만 더합니다. 짝수 합 = 2 + 4 + 6 + 8 = 20. 5. `System.out.print()`는 두 결과값을 ", "로 연결하여 출력합니다: "25, 20".
답 : 25, 20
문제 15. [C] 코드 출력값 문제 (문자열 처리)
다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
#include <stdio.h>
#include <string.h>
void sumFn(char* d, const char* s) {
while (*s) {
*d = *s;
d++;
s++;
}
*d = '\0';
}
int main() {
const char* str1 = "first";
char str2[50] = "teststring";
int result = 0;
sumFn(str2, str1);
for (int i = 0; str2[i] != '\0'; i++) {
result += i;
}
printf("%d", result);
return 0;
}
1. `sumFn` 함수는 두 번째 인자(문자열 포인터 `s`)가 가리키는 문자열을 첫 번째 인자(문자 배열 포인터 `d`)가 가리키는 메모리 공간으로 복사하는 함수입니다. (C 표준 라이브러리의 `strcpy` 함수와 유사한 기능) 2. `main` 함수에서 `str1`은 문자열 "first"를 가리키고, `str2`는 "teststring"으로 초기화된 크기 50의 문자 배열입니다. 3. `sumFn(str2, str1)` 호출 후, `str2` 배열의 내용은 "first"로 변경되고 마지막에 널 문자(`\0`)가 추가됩니다. (기존 "teststring" 내용은 덮어쓰입니다.) 4. `for` 루프는 `str2` 배열의 내용을 널 문자 전까지 순회합니다. `str2`는 "first"이므로, 인덱스 `i`는 0, 1, 2, 3, 4까지 변합니다. 5. 루프 내에서 `result += i`가 실행되므로, `result`의 값은 `0 + 1 + 2 + 3 + 4`가 됩니다. 6. 최종 `result` 값은 10이며, 이 값이 출력됩니다.
답 : 10
문제 16. [SW설계] 모듈 결합도 용어 (제어 결합도)
아래는 소프트웨어 설계에 대한 내용이다. 내용을 읽고 괄호안에 알맞는 답을 작성하시오.
어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하기 위해, 제어 신호(플래그, 스위치 등)를 전달하거나 다른 모듈의 제어 요소를 사용하는 결합도이다. 한 모듈이 다른 모듈에게 무엇을 해야 하는지 지시하는 경우나, 전달된 값에 따라 다른 모듈의 처리 절차가 달라지는 경우 발생한다.
( ) Coupling
설명하는 결합도는 제어 결합도 (Control Coupling)입니다. 제어 결합도는 한 모듈이 다른 모듈로 제어 신호(Control Signal, 예: 특정 동작을 지시하는 플래그 값)를 전달하여 다른 모듈의 내부 로직 흐름에 영향을 미치는 경우를 말합니다. 이는 호출하는 모듈이 호출되는 모듈의 동작 방식을 결정하게 만들어 모듈 간의 의존성을 높이는 결합도 유형입니다.
답 : 제어 또는 Control
문제 17. [Java] 코드 출력값 문제 (재귀, 문자열 중복 제거)
다음은 Java에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
class Main{
public static void main(String[] args) {
String str = "abacadcd";
boolean[] seen = new boolean[256];
System.out.print(calculFn(str, str.length()-1, seen));
}
public static String calculFn(String str, int index, boolean[] seen) {
if(index < 0) return "";
char c = str.charAt(index);
String result = calculFn(str, index-1, seen);
if(!seen[c]) {
seen[c] = true;
return c + result;
}
return result;
}
}
1. `calculFn` 함수는 재귀를 이용하여 문자열 `str`의 마지막 문자(index `str.length()-1`)부터 첫 문자(index 0)까지 역순으로 처리합니다. 2. `seen` 배열은 각 문자가 이전에 등장했는지를 추적합니다. 3. 재귀 호출이 가장 깊은 곳(index -1)에 도달하면 빈 문자열("")을 반환하기 시작합니다. 4. 재귀 호출이 반환되면서 각 문자를 확인합니다 (`index = 0` 부터 `index = 7` 순서로): `index = 0` ('a'): `seen['a']`는 false. `seen['a']=true`. 반환: "a". `index = 1` ('b'): `seen['b']`는 false. `seen['b']=true`. 반환: "b" + "a" = "ba". `index = 2` ('a'): `seen['a']`는 true. 이전 결과 "ba" 반환. `index = 3` ('c'): `seen['c']`는 false. `seen['c']=true`. 반환: "c" + "ba" = "cba". `index = 4` ('a'): `seen['a']`는 true. 이전 결과 "cba" 반환. `index = 5` ('d'): `seen['d']`는 false. `seen['d']=true`. 반환: "d" + "cba" = "dcba". `index = 6` ('c'): `seen['c']`는 true. 이전 결과 "dcba" 반환. `index = 7` ('d'): `seen['d']`는 true. 이전 결과 "dcba" 반환. 5. 최종적으로 `main` 함수에 반환되는 값은 "dcba"입니다. 이 결과는 원본 문자열에서 중복을 제거하고 각 문자가 마지막으로 나타난 순서대로 조합된 것입니다.
(참고: 문제에서 제시된 답 "daba"는 이 코드의 실제 실행 결과와 다릅니다. 코드 로직 상으로는 "dcba"가 출력됩니다. 문제 또는 답안에 오류가 있을 수 있습니다.)
답 : daba (문제 제시 답 기준) / dcba (코드 실행 결과 기준)
문제 18. [C] 코드 출력값 문제 (switch, fall-through, 변수 범위)
다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
#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);
return 0;
}
1. `swap` 함수는 '값에 의한 호출(call by value)'로 동작하므로, `main` 함수의 `a`, `b` 값은 변경되지 않습니다. (계속 `a=11`, `b=19`) 2. `switch(a)`에서 `a`는 11입니다. 3. `case 11:` 레이블과 일치하여 해당 코드 `b += 2;`가 실행됩니다. `b`는 19 + 2 = 21이 됩니다. 4. `case 11:` 블록 끝에 `break` 문이 없으므로, 실행은 다음 `default:` 레이블로 계속 이어집니다 (이를 'fall-through'라고 합니다). 5. `default:` 블록의 코드 `b += 3;`이 실행됩니다. `b`는 21 + 3 = 24가 됩니다. 6. `default:` 블록 끝에 `break` 문이 있으므로 `switch` 문을 종료합니다. 7. `printf("%d", a-b);`가 실행됩니다. `a`는 11, `b`는 24이므로, 11 - 24 = -13이 출력됩니다.
답 : -13
문제 19. [C] 코드 출력값 문제 (구조체 포인터)
다음은 C언어의 구조체에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
#include <stdio.h>
struct node {
int n1;
struct node *n2;
};
int main() {
struct node a = {10, NULL};
struct node b = {20, NULL};
struct node c = {30, NULL};
struct node *head = &a;
a.n2 = &b;
b.n2 = &c;
printf("%d\n", head->n2->n1);
return 0;
}
1. `struct node`는 정수 `n1`과 다음 `node`를 가리키는 포인터 `n2`를 가지는 자기 참조 구조체입니다. 2. `a`, `b`, `c` 구조체 변수가 각각 `n1` 값 10, 20, 30으로 초기화됩니다. 3. `head` 포인터는 `a` 노드를 가리킵니다. 4. `a.n2 = &b;` 와 `b.n2 = &c;` 를 통해 `a -> b -> c` 형태의 단순 연결 리스트(linked list)가 만들어집니다. 5. `head->n2->n1` 표현식을 해석하면: `head`는 `a`를 가리킵니다. `head->n2`는 `a`의 멤버 `n2`를 의미하며, 이는 `b` 노드의 주소입니다. `head->n2->n1`은 `b` 노드의 멤버 `n1`의 값을 의미합니다. 6. `b` 노드의 `n1` 값은 20이므로, 20이 출력됩니다.
답 : 20
문제 20. [Java] 코드 출력값 문제 (String split)
다음은 Java에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
class Main {
public static void main(String[] args) {
String str = "ITISTESTSTRING";
String[] result = str.split("T");
System.out.print(result[3]);
}
}
1. 문자열 `str`에 "ITISTESTSTRING"이 저장됩니다. 2. `str.split("T")` 메소드는 문자열 `str`을 구분자 "T"가 나타나는 지점을 기준으로 분리하여 문자열 배열을 반환합니다. 3. 분리 결과: 첫 "T" 앞: "I" -> `result[0]` 첫 "T"와 두 번째 "T" 사이: "IS" -> `result[1]` 두 번째 "T"와 세 번째 "T" 사이: "ES" -> `result[2]` 세 번째 "T"와 네 번째 "T" 사이: "S" -> `result[3]` 네 번째 "T" 뒤: "RING" -> `result[4]` 4. 따라서 `result` 배열은 `{"I", "IS", "ES", "S", "RING"}` 와 같이 됩니다. 5. `System.out.print(result[3]);`는 배열 `result`의 인덱스 3에 해당하는 요소인 "S"를 출력합니다.