Tech Trail

[정보처리기사 실기] 2023년 1회 기출 코드 해설 (C언어, Java, Python) 본문

Learning/정보처리기사

[정보처리기사 실기] 2023년 1회 기출 코드 해설 (C언어, Java, Python)

_밍지_ 2023. 11. 16. 09:32
728x90
반응형
SMALL

2023년 1회 1번 문제

다음은 JAVA 언어 코드이다. 실행 결과를 쓰시오.

class Static {
    public int a = 20;
    static int b = 0;
}

public class Soojebi {
    public static void main(String[] args) {
        int a;
        a = 10;
        Static.b = a;
        Static st = new Static();
        System.out.println(Static.b++);
        System.out.println(st.b);
        System.out.println(a);
        System.out.print(st.a);
    }
}

1. Static 클래스 정의

class Static {
    public int a = 20;     // 인스턴스 변수
    static int b = 0;     // 정적(static) 변수
}
  • Static 클래스는 두 개의 변수를 가집니다.
  • a는 인스턴스 변수로, 클래스의 객체(인스턴스)를 생성할 때마다 개별적인 값이 할당됩니다.
  • b는 정적(static) 변수로, 클래스 자체에 속하는 변수이며 모든 객체가 공유합니다.

2. main 메서드 정의

public class Soojebi {
    public static void main(String[] args) {
        int a;              // 지역 변수 a 선언
        a = 10;             // a에 10 할당

        Static.b = a;       // 정적 변수 Static.b에 a의 값인 10을 할당
        Static st = new Static();  // Static 클래스의 인스턴스(st) 생성

        System.out.println(Static.b++); // Static.b를 출력하고 1을 증가시킴
        System.out.println(st.b);        // st.b는 Static.b와 같은 값이므로 출력
        System.out.println(a);           // 지역 변수 a 출력
        System.out.print(st.a);          // st 객체의 인스턴스 변수 a 출력
    }
}
  • a라는 지역 변수를 선언하고 10으로 초기화합니다.
  • Static.ba의 값을 할당합니다. 이로써 Static 클래스의 정적 변수 b의 값은 10이 됩니다.
  • Static 클래스의 인스턴스 st를 생성합니다.
  • 각각의 System.out.println 문을 사용하여 다양한 변수들을 출력합니다.

3. 출력 결과

  • Static.b 값인 10을 출력하고 1을 증가시켜 11이 됩니다.. 따라서 첫 번째 출력은 10입니다.
  • st.bStatic.b와 같은 값을 가지므로 11을 출력합니다.
  • a 변수의 값인 10을 출력합니다.
  • st.ast 객체의 인스턴스 변수로 20을 출력합니다.
10
11
10
20
 

 

 

2023년 1회 2번 문제

다음은 JAVA 언어 코드이다. 실행 결과를 쓰시오.

#include <stdio.h>

void main() {
    char a[] = "Art";
    char *p = NULL;
    int i = 0;

    p = a;
    printf("%s\n", a);
    printf("%c\n", *p);
    printf("%c\n", *a);
    printf("%s\n", p);

    for (i = 0; a[i] != '\0'; i++)
        printf("%c", a[i]);
}

main 함수에서 a 배열에는 문자열 "Art"가 저장됩니다. 이 배열의 각 요소는 다음과 같이 매핑됩니다.

  • a[0]에는 'A'가 저장됩니다.
  • a[1]에는 'r'이 저장됩니다.
  • a[2]에는 't'가 저장됩니다.
  • a[3]에는 NULL 문자('\0')가 저장됩니다.

char *p = NULL;

p라는 포인터는 NULL 값으로 초기화됩니다.

p = a
  • p[0]에는 'A'가 저장됩니다.
  • p[1]에는 'r'이 저장됩니다.
  • p[2]에는 't'가 저장됩니다.
  • p[3]에는 NULL 문자('\0')가 저장됩니다.

printf("%s\n", a);
printf("%c\n", *p);
printf("%c\n", *a);
printf("%s\n", p);

printf 문은 다음을 수행합니다.

%s 포맷 지정자는 NULL 문자를 만날 때까지 문자열을 출력합니다.

%c 포맷 지정자는 포인터가 가리키는 문자를 출력합니다.

문자열과 포인터 간에는 서로 바로 출력할 수 있으며, 포인터는 배열처럼 사용될 수 있습니다.

  • printf("%s\n", a); // a는 a[0]의 주소와 같으며, a[0]부터 NULL 문자 전까지의 문자열을 출력합니다. 결과: Art
  • printf("%c\n", *p); // *p는 현재 가리키고 있는 문자를 출력합니다. 현재 p는 a와 같으므로 a[0]의 값인 'A'를 출력합니다.
  • printf("%c\n", *a); // *a는 a[0]의 값을 출력합니다. 따라서 'A'를 출력합니다.
  • printf("%s\n", p); // 문자열 p를 출력합니다. 현재 p는 a와 같으므로 a 배열의 내용인 "Art"를 출력합니다.

for (i = 0; a[i] != '\0'; i++)
        printf("%c", a[i]);
  1. 초기 반복 (i=0): a[i]는 'A'와 NULL 문자('\0')와 다릅니다. 따라서 'A'가 출력됩니다.
  2. 두 번째 반복 (i=1): a[i]는 'r'과 NULL 문자('\0')와 다릅니다. 따라서 'r'이 출력됩니다.
  3. 세 번째 반복 (i=2): a[i]는 't'와 NULL 문자('\0')와 다릅니다. 따라서 't'가 출력됩니다.
  4. 네 번째 반복 (i=3): a[i]는 NULL 문자('\0')와 NULL 문자('\0')와 같습니다. 따라서 반복문을 종료합니다.

이러한 반복을 통해 문자열 "Art"의 각 문자가 차례로 출력됩니다.

<출력>

Art
A
A
Art
Art

 

 

 

2023년 1회 번 문제

다음은 C 코드이다. 실행 결과를 쓰시오.

#include <stdio.h>

int main() {
    char *a = "qwer";
    char *b = "qwety";
    int i, j;

    for (i = 0; a[i] != '\0'; i++) {
        for (j = 0; b[j] != '\0'; j++) {
            if (a[i] == b[j]) {
                printf("%c", a[i]);
            }
        }
    }

    return 0;
}

1. a라는 포인터 배열은 "qwer" 문자열을 저장하고 있습니다.

  • q -> a[0]
  • w -> a[1]
  • e -> a[2]
  • r -> a[3]
  • NULL -> a[4]

2. b라는 포인터 배열은 "qwety" 문자열을 저장하고 있습니다.

  • q -> b[0]
  • w -> b[1]
  • e -> b[2]
  • t -> b[3]
  • y -> b[4]
  • NULL -> b[5]

3. i가 0일 때

  • a[0]은 'q'이며, a[0] != '\0'가 참(True)입니다. 따라서 j for 루프로 이동합니다.

j가 0일 때:

  • b[0]은 'q'이며, b[0] != '\0'가 참입니다. 따라서 if 문으로 진행합니다.
  • a[0] == b[0]은 참(True)이므로 'q'를 출력합니다.

j가 1일 때:

  • b[1]은 'w'이며, b[1] != '\0'가 참입니다. 하지만 a[0] == b[1]은 거짓(False)이므로 if 문을 실행하지 않습니다.

j가 2일 때:

  • b[2]은 'e'이며, b[2] != '\0'가 참입니다. 하지만 a[0] == b[2]는 거짓(False)이므로 if 문을 실행하지 않습니다.

j가 3일 때:

  • b[3]은 't'이며, b[3] != '\0'가 참입니다. 하지만 a[0] == b[3]은 거짓(False)이므로 if 문을 실행하지 않습니다.

j가 4일 때:

  • b[4]는 'y'이며, b[4] != '\0'가 참입니다. 하지만 a[0] == b[4]는 거짓(False)이므로 if 문을 실행하지 않습니다.

j가 5일 때:

  • b[5]는 NULL이며, b[5] != '\0'가 거짓(False)입니다. 따라서 j for 루프를 빠져나옵니다.
  • i for 루프로 돌아가서 i가 1이 됩니다.

이쯤되면 규칙이 보입니다.

이 문제는 두 문자열 ab를 하나하나 비교하면서 동일한 문자가 나올 때 출력합니다.

  • 처음에 i가 0일 때, 'q'와 'q', 'w', 'e', 't', 'y'를 비교하게 되는데, 'q'와 'q'가 일치하므로 'q'를 출력합니다.
  • 그 다음으로 'w'와 'q', 'w', 'e', 't', 'y'를 비교하게 되는데, 'w'와 'w'가 일치하므로 'w'를 출력합니다.
  • 다음으로 'e'와 'q', 'w', 'e', 't', 'y'를 비교하게 되는데, 'e'와 'e'가 일치하므로 'e'를 출력합니다.
  • 그 다음 'r'과 'q', 'w', 'e', 't', 'y'를 비교하게 되는데, 'r'과는 일치하는 문자가 없으므로 출력하지 않습니다.
  • 마지막으로 'NULL'값과 비교하게 되는데, 'NULL'값은 문자열 끝을 나타내는 '\0'과 동일합니다. a 문자열은 "qwer"이므로 '\0'으로 끝납니다. b 문자열은 "qwety"로 더 길기 때문에 '\0'에 도달하지 못하면 루프를 종료합니다.

따라서 올바른 출력은 "qwe"입니다.

<출력>

qwe

 

 

2023년 1회 9번 문제

다음은 이진수를 십진수로 변환하는 C언어 코드이다. 빈칸에 적합한 코드를 작성하시오.

#include <stdio.h>

void main() {
    int input = 101110;
    int di = 1;
    int sum = 0;
    
    while (1) {
        if (input == 0) break;
        else {
            sum = sum + (input 빈칸1 빈칸2) * di;
            di = di * 2;
            input = input / 10;
        }
    }
    
    printf("%d", sum);
}

while(1)은 코드가 실행되면 항상 참(1)으로 평가되기 때문에 무한히 반복됩니다.

주어진 input 변수는 이진수를 십진수로 변환하기 위한 작업에서 사용됩니다.

이 작업은 이진수를 뒤에서부터 하나씩 처리하려는 목적을 가지고 있습니다.

예를 들어, 101110이라는 이진수가 주어졌을 때, 이를 십진수로 변환하기 위해 다음과 같이 작업합니다.

1. input을 10으로 나누면, 맨 끝 자릿수가 얻어집니다. 즉, input % 10은 맨 끝 자릿수의 값을 얻습니다.

2. 이 값을 sum에 더해줍니다. 그래서 sum은 현재까지 계산된 십진수 값입니다.

3. di는 현재 자릿수의 가중치를 나타냅니다.

  • 이진수를 십진수로 바꿀 때
1 | 0 | 1 | 1 | 1 | 0

2^5 2^4 2^3 2^2 2^1 2^0
 

di*2는 2^0에서 2^1로 넘어갈 때, 2^1에서 2^2로 넘어갈 때... 마다 값이 2배씩 증가한다는 것을 의미합니다.

4. input을 10으로 나누어 다음 자릿수로 이동합니다.

이 작업을 반복하면, 각 자릿수를 십진수로 변환하여 sum에 모두 더한 뒤, 최종적으로 sum에는 이진수를 십진수로 변환한 결과가 저장됩니다. 따라서 위 코드에서 input % 10 연산은 현재 처리 중인 이진수의 맨 끝 자릿수를 얻기 위해 사용되는 것입니다.

빈칸1: %
빈칸2: 10

 

 

2023년 1회 14번 문제

다음은 자바 코드이다. 빈칸에 들어갈 코드를 쓰시오. (단, 변수명으로 쓰시오.)

class Soojebi {
    static void swap(int[] a, int idx1, int idx2) {
        int t = a[idx1];
        a[idx1] = a[idx2];
        a[빈칸1] = t;
    }

    static void Usort(int[] a, int len) {
        for (int i = 0; i < len - 1; i++) {
            for (int j = 0; j < len - i - 1; j++) {
                if (a[j] > a[j + 1]) {
                    swap(a, j, j + 1);
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] item = {5, 4, 9, 1, 3, 7};
        int nx = 6; 
        Usort(item, 빈칸2); 
        for (int data : item) {
            System.out.print(data + " ");
        }
    }
}

1. 정수형 배열 item을 선언하고 초기화합니다. 배열 내용: {5, 4, 9, 1, 3, 7}.

  • 정수형 배열을 선언할 때, 배열의 크기를 지정하고 배열의 이름 뒤에 대괄호 []를 사용하는데, 이 경우에는 마지막에 NULL이 추가되지 않습니다.

2. 정수형 변수 nx를 선언하고 6으로 초기화합니다.

3. Usort 메서드를 호출하고, item 배열과 nx 값을 인수로 전달합니다.

  • 메서드 Usortitem 배열과 빈칸2 값을 넘기기로 했습니다. 이미 배열의 이름으로 item을 사용했기 때문에 다른 변수명을 사용하는데 나온 변수명이 nx밖에 없습니다. 따라서 변수 nx를 사용하여 빈칸2에 nx 값을 전달합니다.
  • Usort 메서드는 버블 정렬(Bubble Sort) 알고리즘을 사용하여 배열을 정렬합니다. 버블 정렬은 인접한 두 원소를 비교하고 필요한 경우 서로 교환하는 방식으로 동작합니다.

4. nx 변수에는 6이 저장되어 있으므로 Usort 메서드가 호출될 때, a에는 item 배열이, len에는 nx 값인 6이 전달됩니다.

5. Usort 메서드 내에서 i0부터 시작하여 6보다 작을 때까지 반복됩니다.

6. 내부 반복문에서 j0부터 시작하여 6 - 0 - 1 = 5보다 작을 때까지 반복됩니다.

7. j0일 때, if 문에서 a[0] > a[1]5 > 4이므로 True가 되며, swap 메서드가 호출됩니다.

8. swap 메서드는 a=b, b=c, c=a와 같이 교환하는 역할을 합니다

  • int t = a[idx1]; // a 배열의 인덱스 idx1에 해당하는 값을 t라는 임시 변수에 저장합니다.
  • a[idx1] = a[idx2]; // a 배열의 인덱스 idx1에 a 배열의 인덱스 idx2에 해당하는 값을 대입하여 교환합니다.
  • a[idx2] = t; // a 배열의 인덱스 idx2에 t 변수에 저장한 값을 대입하여 두 변수의 값을 교환합니다.

따라서 빈칸1에는 idx2가 들어가야 합니다.

빈칸1: nx
빈칸2: idx2

 

2023년 1회 15번 문제

다음은 파이썬 코드이다. 실행 결과를 쓰시오.

a = {'한국', '중국', '일본'}
a.add('베트남')
a.add('중국')
a.remove('일본')
a.update({'홍콩', '한국', '태국'})
print(a)

<해설>

# 초기 세트 a를 생성합니다.
a = {'한국', '중국', '일본'} 

# 세트에 '베트남'을 추가합니다.
a.add('베트남')  # a = {'한국', '중국', '일본', '베트남'} 

# 세트에 '중국'을 추가합니다. (중복된 값이므로 아무런 변화 없음)
a.add('중국')  # a = {'한국', '중국', '일본', '베트남'} 

# 세트에서 '일본'을 제거합니다.
a.remove('일본')  # a = {'한국', '중국', '베트남'} 

# 세트를 업데이트합니다. (기존 원소는 중복을 허용하지 않으므로 중복 제거됨)
a.update({'홍콩', '한국', '태국'})  # a = {'한국', '중국', '베트남', '홍콩', '태국'} 

# 최종 결과를 출력합니다.
print(a)

<출력>

{'한국', '중국', '베트남', '홍콩', '태국'}

<참고> { } 중괄호: 세트형 (중복허용 안 함)

 

 

2023년 1회 17번 문제

다음은 자바 코드이다. 실행 결과를 쓰시오.

"2020년 3회 15번 문제와 동일합니다. 아래 링크를 참고해주세요."

 

[정보처리기사 실기] 2020년 3회, 4회 기출 코드 해설 (C언어, Java, Python) (tistory.com)

 

[정보처리기사 실기] 2020년 3회, 4회 기출 코드 해설 (C언어, Java, Python)

2020년 3회 2번 문제 다음은 C언어 소스 코드이다. 출력 결과를 쓰시오. #include void main() { int i=0, c=0; while (i= 0; i--) { System.out.print(a[i]); } } } 코드에서 10을 2진수로 변환하는 방법은 다음과 같습니다.

techtrail.tistory.com

 

 

 

 

2023년 1회 20번 문제

다음은 자바 코드이다. 실행 결과를 쓰시오.

class Parent {
    int x = 100;

    Parent() {
        this(500);
    }

    Parent(int x) {
        this.x = x;
    }

    int getX() {
        return x;
    }
}

class Child extends Parent {
    int x = 4000;

    Child() {
        this(5000);
    }

    Child(int x) {
        this.x = x;
    }
}

public class Soojebi {
    public static void main(String[] args) {
        Child obj = new Child();
        System.out.println(obj.getX());
    }
}

먼저 main 메서드를 시작으로 코드를 분석합니다. Child obj = new Child();에서 new 키워드를 사용하여 Child 클래스의 객체를 생성하면서 Child 클래스의 기본 생성자가 호출됩니다. 이때, 부모 클래스인 Parent의 생성자부터 호출되며, 생성자 호출 순서는 다음과 같습니다.

1. Parent 클래스의 기본 생성자인 Parent()이 호출됩니다.

  • Parent() 내에서 this(500);가 호출되어, 자기 자신인 Parent 클래스의 다른 생성자이며 정숫값을 받을 수 있는 Parent(int x)가 호출됩니다.
  • Parent(int x) 내에서 this.x = x;를 통해 Parent 클래스의 멤버 변수 x에 500이 대입됩니다. 따라서 Parent 클래스의 x 값은 500이 됩니다.

2. 부모 클래스 Parent의 생성자 호출이 완료되면, 자식 클래스인 Child의 생성자가 호출됩니다.

  • Child 클래스의 기본 생성자인 Child()가 호출됩니다.
  • Child() 내에서 this(5000);이 호출되어, 자기 자신인 Child 클래스의 다른 생성자 Child(int x)가 호출됩니다.
  • Child(int x) 내에서 this.x = x;를 통해 Child 클래스의 멤버 변수 x에 5000이 대입됩니다. 따라서 Child 클래스의 x 값은 5000이 됩니다.

이제 객체 obj의 생성이 완료되었습니다. obj.getX()가 호출되면 getX 메서드는 먼저 자식 클래스인 Child에서 찾아보게 됩니다. 하지만 Child 클래스에 getX 메서드가 없으므로 부모 클래스인 Parent에서 getX 메서드를 찾습니다. Parent 클래스의 getX 메서드는 x 값을 반환하며, 이때 가장 가까운 x 값은 Parent 클래스의 x 값인 500입니다. 따라서 obj.getX()는 500을 반환하고 출력됩니다.

<출력>

500

 

💡 이 게시글은 PC 환경에 최적화하여 작성되었습니다.

틀린 부분이 있다면 언제든 댓글 남겨주세요 :)

728x90
반응형
LIST