정보처리기사 실기 2025년 1회차 기출 복원입니다. 각 문제 아래의 「정답·해설 보기」를 펼치면 정답과 해설이 나타나요. 실제 시험 환경(타이머·자동 채점·오답 누적)에서 풀어보고 싶다면 글 맨 아래 「직접 풀러가기」를 눌러주세요.
문제 1
4지선다다음 설명에 해당하는 네트워크 공격 기법으로 가장 적절한 것은?
<설명> 정상 사용자의 세션 상태를 탈취하거나 도용하여 인증 없이 통신을 가로채는 공격 기법이다. TCP 연결이 수립된 이후 공격자가 시퀀스 번호 등을 조작해 정상 세션을 장악하는 방식이 대표적이다.
- 1.세션 하이재킹
- 2.스니핑
- 3.스푸핑
- 4.랜드 어택
정답·해설 보기▾
정답
1번. 세션 하이재킹
해설
정답: 1. 세션 하이재킹은 정상 사용자의 세션을 가로채 권한을 탈취하는 공격 기법이다.
오답 풀이
- 1번: 세션을 탈취하거나 도용하는 공격이므로 정답이다.
- 2번: 스니핑은 네트워크 패킷을 몰래 엿보는 행위이다.
- 3번: 스푸핑은 IP, MAC, DNS 등을 위조하는 공격이다.
- 4번: 랜드 어택은 출발지와 목적지 IP를 같게 조작하는 DoS 공격이다.
보충 개념 세션 하이재킹은 인증 이후의 세션을 탈취한다는 점이 핵심이다. TCP 세션 하이재킹은 시퀀스 번호 예측이나 조작을 이용할 수 있다.
문제 2
4지선다다음 제약조건 설명과 용어의 연결로 가장 적절한 것은?
<설명> ㄱ. 특정 속성에 입력될 수 있는 값의 범위나 형식을 제한한다. ㄴ. 기본키는 NULL이 될 수 없고 중복될 수 없다는 무결성이다. ㄷ. 외래키 값은 참조하는 부모 테이블의 값과 일관성을 유지해야 한다.
<보기> 개체, 참조, 도메인
- 1.ㄱ-도메인, ㄴ-개체, ㄷ-참조
- 2.ㄱ-개체, ㄴ-도메인, ㄷ-참조
- 3.ㄱ-참조, ㄴ-개체, ㄷ-도메인
- 4.ㄱ-도메인, ㄴ-참조, ㄷ-개체
정답·해설 보기▾
정답
1번. ㄱ-도메인, ㄴ-개체, ㄷ-참조
해설
정답: 1. 값의 범위 제한은 도메인 무결성, 기본키 관련 제약은 개체 무결성, 외래키 관련 제약은 참조 무결성이다.
오답 풀이
- 1번: 세 무결성의 의미가 모두 올바르게 연결되었다.
- 2번: ㄱ과 ㄴ의 연결이 바뀌었다.
- 3번: ㄱ과 ㄷ의 연결이 바뀌었다.
- 4번: ㄴ과 ㄷ의 연결이 바뀌었다.
보충 개념 개체 무결성은 기본키, 참조 무결성은 외래키, 도메인 무결성은 속성 값의 범위와 형식 제약과 관련된다.
문제 3
4지선다다음 설명에 해당하는 오류 검출 기법의 영문 약자로 가장 적절한 것은?
<설명> 데이터 전송이나 저장 과정에서 오류를 감지하기 위해 사용하는 오류 검출 코드이다. 데이터에 검사 값을 추가하고, 수신 또는 읽기 시 다시 계산하여 데이터 변경 여부를 확인한다. 정해진 다항식을 기반으로 2진수 나눗셈을 수행하고 나머지를 검사 값으로 사용한다.
- 1.CRC
- 2.MAC
- 3.ARP
- 4.RARP
정답·해설 보기▾
정답
1번. CRC
해설
정답: 1. CRC는 순환 중복 검사로, 다항식 나눗셈의 나머지를 이용해 오류를 검출한다.
오답 풀이
- 1번: 데이터 오류 검출 기법이므로 정답이다.
- 2번: MAC은 매체 접근 제어 또는 메시지 인증 코드 등 다른 의미로 쓰인다.
- 3번: ARP는 IP 주소를 MAC 주소로 변환하는 프로토콜이다.
- 4번: RARP는 MAC 주소를 IP 주소로 변환하는 프로토콜이다.
보충 개념 CRC는 네트워크 프레임, 저장 장치 등에서 데이터 무결성 검사용으로 사용된다. 오류 정정이 아니라 오류 검출에 초점이 있다.
문제 4
4지선다다음 설명에 해당하는 악성 소프트웨어 유형으로 가장 적절한 것은?
<설명> 사용자에게 가짜 바이러스 경고나 시스템 문제를 보여 주어 공포심을 유발하고, 불필요한 결제나 소프트웨어 설치를 유도한다. '겁을 주다'라는 의미에서 유래한 용어이다.
- 1.애드웨어
- 2.스캐어웨어
- 3.그룹웨어
- 4.컴포넌트웨어
정답·해설 보기▾
정답
2번. 스캐어웨어
해설
정답: 2. 스캐어웨어는 사용자의 불안과 공포를 이용해 결제나 설치를 유도하는 악성 소프트웨어 유형이다.
오답 풀이
- 1번: 애드웨어는 광고를 노출하는 소프트웨어이다.
- 2번: 공포심을 이용하는 악성 소프트웨어이므로 정답이다.
- 3번: 그룹웨어는 협업 지원 소프트웨어이다.
- 4번: 컴포넌트웨어는 소프트웨어 부품화 개념과 관련된다.
보충 개념 스캐어웨어는 사회공학적 기법을 이용한다. 실제 감염 여부와 무관하게 경고를 띄우고 결제를 유도하는 경우가 많다.
문제 5
4지선다다음 Java 코드의 출력 결과로 가장 적절한 것은?
Javapublic class Main { public static void main(String[] args) { int a = 5, b = 0; try { System.out.print(a / b); } catch (ArithmeticException e) { System.out.print("출력1"); } catch (ArrayIndexOutOfBoundsException e) { System.out.print("출력2"); } catch (NumberFormatException e) { System.out.print("출력3"); } catch (Exception e) { System.out.print("출력4"); } finally { System.out.print("출력5"); } } }- 1.출력1출력5
- 2.출력2출력5
- 3.출력4출력5
- 4.출력5
정답·해설 보기▾
정답
1번. 출력1출력5
해설
정답: 1. 5를 0으로 나누면 ArithmeticException이 발생하여 첫 번째 catch가 실행되고, finally 블록도 실행된다.
오답 풀이
- 1번: ArithmeticException 처리 후 finally가 실행되므로 정답이다.
- 2번: 배열 인덱스 예외가 발생하지 않는다.
- 3번: ArithmeticException이 먼저 매칭되므로 Exception catch까지 가지 않는다.
- 4번: catch 블록 출력이 누락되었다.
보충 개념 Java에서 finally 블록은 예외 발생 여부와 관계없이 일반적으로 실행된다. 여러 catch가 있을 때는 위에서부터 타입이 맞는 catch가 실행된다.
문제 6
4지선다ARP와 RARP에 대한 설명으로 가장 적절한 것은?
- 1.ARP는 IP 주소를 MAC 주소로 변환하고, RARP는 MAC 주소를 IP 주소로 변환한다.
- 2.ARP는 MAC 주소를 IP 주소로 변환하고, RARP는 IP 주소를 MAC 주소로 변환한다.
- 3.ARP와 RARP는 모두 도메인 이름을 IP 주소로 변환한다.
- 4.ARP와 RARP는 모두 오류 검출 코드를 생성한다.
정답·해설 보기▾
정답
1번. ARP는 IP 주소를 MAC 주소로 변환하고, RARP는 MAC 주소를 IP 주소로 변환한다.
해설
정답: 1. ARP는 IP 주소에 대응하는 MAC 주소를 찾고, RARP는 MAC 주소에 대응하는 IP 주소를 찾는다.
오답 풀이
- 1번: 두 프로토콜의 역할이 올바르게 연결되었다.
- 2번: ARP와 RARP의 설명이 반대이다.
- 3번: 도메인 이름을 IP 주소로 변환하는 것은 DNS이다.
- 4번: 오류 검출 코드는 CRC와 관련된다.
보충 개념 ARP는 같은 네트워크 내 통신에서 IP 주소를 기반으로 MAC 주소를 알아내는 데 사용된다. RARP는 과거 디스크 없는 장비가 자신의 IP를 알아낼 때 사용되었다.
문제 7
4지선다다음 SQL 실행 결과로 가장 적절한 것은?
<조건> emp 테이블과 sal 테이블을 id 기준으로 조인하고, incentive가 500 이상인 행만 조회한다. 조건을 만족하는 행은 이순신 1건이며 incentive 값은 1000이다.
SQLSELECT name, incentive FROM emp, sal WHERE emp.id = sal.id AND incentive >= 500;- 1.이순신 | 1000
- 2.이순신 | 500
- 3.강감찬 | 1000
- 4.결과 없음
정답·해설 보기▾
정답
1번. 이순신 | 1000
해설
정답: 1. id가 일치하고 incentive가 500 이상인 행이 이순신 1건이며 값은 1000이다.
오답 풀이
- 1번: 조인 조건과 필터 조건을 모두 만족하는 결과이다.
- 2번: incentive 값을 잘못 제시했다.
- 3번: 조건을 만족하는 이름이 다르다.
- 4번: 조건을 만족하는 행이 존재한다.
보충 개념 구식 조인 문법에서는 FROM 절에 테이블을 나열하고 WHERE 절에 조인 조건과 필터 조건을 함께 작성한다. 컬럼명이 여러 테이블에 동시에 존재할 수 있으면 테이블 별칭을 붙여 명확히 작성하는 것이 좋다.
문제 8
4지선다다음 데이터베이스 용어와 설명의 연결로 가장 적절한 것은?
<설명>
- 릴레이션에서 속성의 개수
- 릴레이션에서 튜플의 개수
- 다른 릴레이션의 기본키를 참조하는 속성
- 특정 속성에 입력될 수 있는 값의 유형이나 범위
<보기> ㄱ. domain ㄴ. primary ㄷ. degree ㄹ. candidate ㅁ. cardinality ㅂ. attribute ㅅ. foreign
- 1.1-ㄷ, 2-ㅁ, 3-ㅅ, 4-ㄱ
- 2.1-ㅁ, 2-ㄷ, 3-ㅅ, 4-ㄱ
- 3.1-ㄷ, 2-ㅁ, 3-ㄴ, 4-ㅂ
- 4.1-ㅂ, 2-ㄹ, 3-ㅅ, 4-ㄱ
정답·해설 보기▾
정답
1번. 1-ㄷ, 2-ㅁ, 3-ㅅ, 4-ㄱ
해설
정답: 1. 속성 수는 degree, 튜플 수는 cardinality, 참조 속성은 foreign key, 값의 범위는 domain이다.
오답 풀이
- 1번: 모든 연결이 적절하다.
- 2번: degree와 cardinality가 바뀌었다.
- 3번: 외래키를 primary로 잘못 연결했다.
- 4번: degree와 cardinality의 의미가 맞지 않는다.
보충 개념 릴레이션의 차수(degree)는 속성 수, 카디널리티(cardinality)는 튜플 수이다. 도메인은 속성이 가질 수 있는 값의 범위이다.
문제 9
4지선다IP 주소가
192.168.35.10, 서브넷 마스크가255.255.252.0인 PC와 같은 네트워크에 속하는 IP로 가장 적절한 것은?<보기> ㄱ. 192.168.34.1 ㄴ. 192.168.32.19 ㄷ. 192.168.35.200 ㄹ. 192.168.33.138 ㅁ. 192.168.35.50
- 1.ㄱ, ㄴ, ㄷ, ㄹ, ㅁ
- 2.ㄱ, ㄷ, ㅁ
- 3.ㄴ, ㄹ
- 4.ㄷ, ㅁ
정답·해설 보기▾
정답
1번. ㄱ, ㄴ, ㄷ, ㄹ, ㅁ
해설
정답: 1. 255.255.252.0은 /22이며, 192.168.35.10은 192.168.32.0~192.168.35.255 범위에 속한다. 제시된 IP는 모두 이 범위에 포함된다.
오답 풀이
- 1번: 모든 IP가 같은 /22 네트워크 범위에 포함된다.
- 2번: ㄴ과 ㄹ도 같은 네트워크에 속한다.
- 3번: ㄱ, ㄷ, ㅁ도 같은 네트워크에 속한다.
- 4번: 일부만 포함한 선택지이다.
보충 개념 /22는 세 번째 옥텟 단위로 4씩 증가하는 네트워크 블록을 만든다. 35가 포함되는 블록은 32~35이다.
문제 10
4지선다다음 C 코드의 출력 결과로 가장 적절한 것은?
C#include <stdio.h> char Data[5] = {'B', 'A', 'D', 'E'}; char c; int main() { int i, temp, temp2; c = 'C'; printf("%d\n", Data[3] - Data[1]); for (i = 0; i < 5; ++i) { if (Data[i] > c) break; } temp = Data[i]; Data[i] = c; i++; for (; i < 5; ++i) { temp2 = Data[i]; Data[i] = temp; temp = temp2; } for (i = 0; i < 5; i++) { printf("%c", Data[i]); } }- 1.4
- 2.4
- 3.3
- 4.4
정답·해설 보기▾
정답
1번. 4
해설
정답: 1. 'E' - 'A'는 ASCII 코드 차이로 4이고, 'C'를 첫 번째로 자신보다 큰 문자 D 위치에 삽입하면 배열은 B, A, C, D, E가 된다.
오답 풀이
- 1번: 첫 줄 4와 최종 문자열 BACDE가 맞다.
- 2번: 삽입 후 뒤 원소 이동이 잘못 계산되었다.
- 3번: ASCII 코드 차이를 잘못 계산했다.
- 4번: 기존 배열 순서를 완전 정렬한 것이 아니다.
보충 개념 문자끼리 뺄셈하면 해당 문자의 정수 코드값 차이가 계산된다. C의 전역 char 배열은 명시하지 않은 마지막 원소가 '\0'으로 초기화된다.
문제 11
4지선다다음 C 코드의 출력 결과로 가장 적절한 것은?
C#include <stdio.h> #include <stdlib.h> void set(int** arr, int* data, int rows, int cols) { for (int i = 0; i < rows * cols; ++i) { arr[((i + 1) / rows) % rows][(i + 1) % cols] = data[i]; } } int main() { int rows = 3, cols = 3, sum = 0; int data[] = {5, 2, 7, 4, 1, 8, 3, 6, 9}; int** arr = (int**)malloc(sizeof(int*) * rows); for (int i = 0; i < cols; i++) { arr[i] = (int*)malloc(sizeof(int) * cols); } set(arr, data, rows, cols); for (int i = 0; i < rows * cols; i++) { sum += arr[i / rows][i % cols] * (i % 2 == 0 ? 1 : -1); } for (int i = 0; i < rows; i++) { free(arr[i]); } free(arr); printf("%d", sum); }- 1.13
- 2.12
- 3.9
- 4.15
정답·해설 보기▾
정답
1번. 13
해설
정답: 1. set 함수 수행 후 배열은 [9,5,2], [7,4,1], [8,3,6] 형태가 된다. 이후 짝수 인덱스는 더하고 홀수 인덱스는 빼면 9-5+2-7+4-1+8-3+6 = 13이다.
오답 풀이
- 1번: 배열 배치와 부호 계산을 올바르게 추적한 결과이다.
- 2번: 일부 원소의 부호를 잘못 적용한 값이다.
- 3번: 배열 배치 순서를 단순 행 우선으로 착각한 값이다.
- 4번: 특정 원소를 누락하거나 중복 계산한 값이다.
보충 개념 포인터 배열로 만든 2차원 배열은 인덱스 계산을 정확히 추적해야 한다.
%와/연산이 행과 열 계산에 어떻게 사용되는지 확인해야 한다.문제 12
4지선다다음 결합도 설명과 용어의 연결로 가장 적절한 것은?
<설명>
- 다른 모듈 내부의 변수나 기능을 직접 사용하는 경우
- 모듈 간 인터페이스로 배열, 객체, 자료구조 등이 전달되는 경우
- 파라미터가 아닌 모듈 밖 전역 변수를 참조하거나 갱신하는 경우
<보기> ㄱ. 자료 결합도 ㄴ. 스탬프 결합도 ㄷ. 제어 결합도 ㄹ. 공통 결합도 ㅁ. 내용 결합도 ㅂ. 외부 결합도
- 1.1-ㅁ, 2-ㄴ, 3-ㄹ
- 2.1-ㄱ, 2-ㄴ, 3-ㄷ
- 3.1-ㄹ, 2-ㅁ, 3-ㄴ
- 4.1-ㅂ, 2-ㄱ, 3-ㄹ
정답·해설 보기▾
정답
1번. 1-ㅁ, 2-ㄴ, 3-ㄹ
해설
정답: 1. 모듈 내부를 직접 참조하면 내용 결합도, 자료구조 전달은 스탬프 결합도, 전역 변수 공유는 공통 결합도이다.
오답 풀이
- 1번: 세 설명과 결합도 유형이 모두 올바르게 연결되었다.
- 2번: 내부 직접 참조를 자료 결합도로 잘못 연결했다.
- 3번: 세 연결이 모두 부적절하다.
- 4번: 자료구조 전달은 자료 결합도가 아니라 스탬프 결합도이다.
보충 개념 결합도는 모듈 간 의존 정도를 의미한다. 일반적으로 내용 결합도가 가장 강하고, 자료 결합도가 가장 약한 결합도에 속한다.
문제 13
4지선다다음 Java 코드의 출력 결과로 가장 적절한 것은?
Javapublic class Main { public static void main(String[] args) { new Child(); System.out.println(Parent.total); } } class Parent { static int total = 0; int v = 1; public Parent() { total += (++v); show(); } public void show() { total += total; } } class Child extends Parent { int v = 10; public Child() { v += 2; total += v++; show(); } @Override public void show() { total += total * 2; } }- 1.54
- 2.18
- 3.36
- 4.72
정답·해설 보기▾
정답
1번. 54
해설
정답: 1. Parent 생성자에서 Parent의 v가 1에서 2가 되어 total은 2가 된다. 생성자 안의 show()는 동적 바인딩으로 Child의 show()가 호출되어 total은 6이 된다. 이후 Child 필드 v가 10으로 초기화되고 Child 생성자에서 v += 2로 12가 된 뒤 total에 12를 더해 18이 된다. 마지막 show()로 total은 54가 된다.
오답 풀이
- 1번: 생성자 호출 순서와 오버라이딩 메서드 호출을 올바르게 반영했다.
- 2번: 마지막 show 호출을 누락한 값이다.
- 3번: show의 계산식을 잘못 적용한 값이다.
- 4번: total 누적 과정을 과대 계산한 값이다.
보충 개념 Java 생성자 실행 중에도 오버라이딩된 메서드는 동적 바인딩으로 자식 클래스 메서드가 호출될 수 있다. 이 경우 필드 초기화 순서에 주의해야 한다.
문제 14
4지선다다음 설명에 해당하는 디자인 패턴으로 가장 적절한 것은?
<설명> 서로 다른 인터페이스를 가진 클래스들을 함께 사용할 수 있도록 변환한다. 기존 클래스 객체를 감싸 원하는 인터페이스에 맞게 연결해 주는 역할을 한다.
- 1.Adapter
- 2.Singleton
- 3.Observer
- 4.Factory Method
정답·해설 보기▾
정답
1번. Adapter
해설
정답: 1. Adapter 패턴은 호환되지 않는 인터페이스를 가진 객체들을 함께 사용할 수 있도록 중간에서 변환해 준다.
오답 풀이
- 1번: 인터페이스 변환 역할을 하므로 정답이다.
- 2번: Singleton은 인스턴스를 하나만 생성하도록 보장하는 패턴이다.
- 3번: Observer는 상태 변화 알림을 구독자에게 전달하는 패턴이다.
- 4번: Factory Method는 객체 생성 책임을 하위 클래스에 위임하는 패턴이다.
보충 개념 Adapter 패턴의 주요 구성 요소는 Target, Adapter, Adaptee, Client이다. 기존 코드를 수정하지 않고 인터페이스를 맞출 때 유용하다.
문제 15
4지선다다음 코드에 대해 문장 커버리지 테스트를 수행하려고 한다. 문장 번호와 실행 순서로 가장 적절한 것은?
Cint main(int b[], int m, int x) { int a = 0; // ① while (a < m && b[a] < x) { // ② if (b[a] < 0) // ③ b[a] = -b[a]; // ④ a++; // ⑤ } return 1; // ⑥ }<조건> 문장 ④가 한 번 실행되고, 그 다음 while 조건이 거짓이 되어 반복문을 종료하는 테스트 경로를 기준으로 한다.
- 1.①→②→③→④→⑤→②→⑥
- 2.①→②→③→⑤→②→⑥
- 3.①→②→⑥
- 4.②→③→④→⑤→①→⑥
정답·해설 보기▾
정답
1번. ①→②→③→④→⑤→②→⑥
해설
정답: 1. 초기화 문장 ①을 수행한 뒤 while 조건 ②가 참이 되어 반복문에 진입한다. if 조건 ③이 참이면 문장 ④가 실행되고, 이후 증가 문장 ⑤가 실행된다. 다음 while 조건 ②가 거짓이 되면 반복문을 빠져나와 return 문장 ⑥을 실행한다.
오답 풀이
- 1번: 조건에서 제시한 테스트 경로의 실행 순서와 일치한다.
- 2번: 문장 ④가 실행되는 경로가 아니다.
- 3번: 반복문 내부 문장이 실행되지 않는 경로이다.
- 4번: 초기화 문장 ①이 조건 검사보다 먼저 실행되어야 하므로 순서가 틀렸다.
보충 개념 문장 커버리지는 프로그램의 모든 문장이 최소 한 번 이상 실행되도록 테스트 경로를 선정하는 기준이다. 실행 순서를 묻는 문항은 입력 조건 또는 테스트 경로가 명확히 제시되어야 한다.
문제 16
4지선다다음 Java 코드의 출력 결과로 가장 적절한 것은?
Javapublic class Main { public static void main(String[] args) { int[] data = {3, 5, 8, 12, 17}; System.out.println(func(data, 0, data.length - 1)); } static int func(int[] a, int st, int end) { if (st >= end) return 0; int mid = (st + end) / 2; return a[mid] + Math.max(func(a, st, mid), func(a, mid + 1, end)); } }- 1.20
- 2.17
- 3.25
- 4.8
정답·해설 보기▾
정답
1번. 20
해설
정답: 1. 최초 호출 func(a,0,4)에서 mid는 2이므로 a[2]=8을 더한다. 왼쪽 func(a,0,2)는 8, 오른쪽 func(a,3,4)는 12를 반환하므로 8 + max(8, 12) = 20이다.
오답 풀이
- 1번: 재귀 호출과 Math.max 결과를 올바르게 계산한 값이다.
- 2번: 배열의 마지막 값과 혼동한 값이다.
- 3번: 여러 값을 단순 합산한 값이다.
- 4번: 최초 mid 값만 반환한 경우이다.
보충 개념 재귀 함수는 종료 조건과 분할 범위를 정확히 추적해야 한다. 이 코드는 중간값을 더하고 양쪽 재귀 결과 중 큰 값을 선택한다.
문제 17
4지선다다음 Python 코드의 출력 결과로 가장 적절한 것은?
Pythonclass Node: def __init__(self, value): self.value = value self.children = [] def tree(li): nodes = [Node(i) for i in li] for i in range(1, len(li)): nodes[(i - 1) // 2].children.append(nodes[i]) return nodes[0] def calc(node, level=0): if node is None: return 0 return (node.value if level % 2 == 1 else 0) + sum(calc(n, level + 1) for n in node.children) li = [3, 5, 8, 12, 15, 18, 21] root = tree(li) print(calc(root))- 1.13
- 2.3
- 3.33
- 4.26
정답·해설 보기▾
정답
1번. 13
해설
정답: 1. calc는 홀수 레벨의 노드 값만 더한다. 루트 3은 레벨 0이라 제외되고, 레벨 1의 값 5와 8이 더해져 13이 출력된다.
오답 풀이
- 1번: 홀수 레벨 값 5와 8의 합이다.
- 2번: 루트 값만 계산한 값이다.
- 3번: 일부 자식 노드까지 잘못 포함한 값이다.
- 4번: 짝수 레벨 또는 전체 합 일부를 혼동한 값이다.
보충 개념 완전 이진트리 배열 표현에서 인덱스 i의 부모는
(i-1)//2이다. 재귀 함수의 level 값이 어떤 노드를 포함할지 결정한다.문제 18
4지선다다음 C 코드의 출력 결과로 가장 적절한 것은?
C#include <stdio.h> #include <stdlib.h> typedef struct Data { int value; struct Data *next; } Data; Data* insert(Data* head, int value) { Data* new_node = (Data*)malloc(sizeof(Data)); new_node->value = value; new_node->next = head; return new_node; } Data* reconnect(Data* head, int value) { if (head == NULL || head->value == value) return head; Data *prev = NULL, *curr = head; while (curr != NULL && curr->value != value) { prev = curr; curr = curr->next; } if (curr != NULL && prev != NULL) { prev->next = curr->next; curr->next = head; head = curr; } return head; } int main() { Data *head = NULL, *curr; for (int i = 1; i <= 5; i++) head = insert(head, i); head = reconnect(head, 3); for (curr = head; curr != NULL; curr = curr->next) printf("%d", curr->value); return 0; }- 1.35421
- 2.12345
- 3.54321
- 4.34521
정답·해설 보기▾
정답
1번. 35421
해설
정답: 1. insert는 새 노드를 head 앞에 붙이므로 최초 리스트는 5→4→3→2→1이다. reconnect(head, 3)은 값 3 노드를 맨 앞으로 옮기므로 3→5→4→2→1이 된다.
오답 풀이
- 1번: 연결 리스트 삽입 순서와 재연결 결과가 맞다.
- 2번: 뒤에 삽입되는 방식으로 착각한 값이다.
- 3번: reconnect 수행 전 리스트이다.
- 4번: 4와 5의 순서를 잘못 계산한 값이다.
보충 개념 단일 연결 리스트에서 노드를 앞으로 이동하려면 이전 노드의 next를 현재 노드 다음으로 바꾸고, 현재 노드의 next를 기존 head로 연결해야 한다.
문제 19
4지선다다음 C 코드의 출력 결과로 가장 적절한 것은?
C#include <stdio.h> typedef struct student { char* name; int score[3]; } Student; int dec(int enc) { return enc & 0xA5; } int sum(Student* p) { return dec(p->score[0]) + dec(p->score[1]) + dec(p->score[2]); } int main() { Student s[2] = { "Kim", {0xA0, 0xA5, 0xDB}, "Lee", {0xA0, 0xED, 0x81} }; int result = 0; for (int i = 0; i < 2; i++) { result += sum(&s[i]); } printf("%d", result); return 0; }- 1.908
- 2.806
- 3.512
- 4.1024
정답·해설 보기▾
정답
1번. 908
해설
정답: 1. 각 점수에 대해 비트 AND 연산
enc & 0xA5를 수행하면 160, 165, 129, 160, 165, 129가 된다. 이를 모두 합산하면 908이다.오답 풀이
- 1번: 비트 AND 결과를 모두 합산한 값이다.
- 2번: 일부 16진수 값을 10진수로 잘못 변환한 값이다.
- 3번: AND 연산 대신 일부 값만 더한 경우이다.
- 4번: 16진수 자리수를 단순 합산한 값과 혼동한 것이다.
보충 개념 C에서
&는 비트 단위 AND 연산자이다. 16진수 값을 2진수로 변환해 같은 자리의 비트가 모두 1인 경우만 1로 남는다.문제 20
4지선다다음 Java 코드의 출력 결과로 가장 적절한 것은?
Javapublic class Main { public static void main(String[] args) { System.out.println(calc("5")); } static int calc(int value) { if (value <= 1) return value; return calc(value - 1) + calc(value - 2); } static int calc(String str) { int value = Integer.valueOf(str); if (value <= 1) return value; return calc(value - 1) + calc(value - 3); } }- 1.4
- 2.5
- 3.7
- 4.8
정답·해설 보기▾
정답
1번. 4
해설
정답: 1. main에서는 문자열 인자를 전달하므로 calc(String)이 먼저 호출된다. calc("5")는 calc(4) + calc(2)를 계산하고, int 버전의 재귀 결과는 각각 3과 1이므로 합은 4이다.
오답 풀이
- 1번: 오버로딩 선택과 재귀 계산을 올바르게 반영했다.
- 2번: 일반 피보나치 F(5)와 혼동한 값이다.
- 3번: calc(5) int 버전 결과와 혼동한 값이다.
- 4번: 재귀 호출 범위를 과대 계산한 값이다.
보충 개념 Java 오버로딩은 컴파일 시점의 인자 타입에 따라 호출 메서드가 결정된다. 문자열 "5"는 calc(String)을 호출하고, 그 내부의 정수 연산 결과는 calc(int)를 호출한다.