Tech Trail

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

Learning/정보처리기사

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

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

2022년 2회 7번 문제

다음 JAVA 코드의 실행 결과를 쓰시오.

public class Soojebi {
    public static void main(String[] args) {
        int i = 3;
        int k = 1;

        switch(i) {
            case 1: k += 1;
            case 2: k++;
            case 3: k = 0;
            case 4: k += 3;
            case 5: k -= 10;
            default: k--;
        }
        System.out.printf("%d", k);
    }
}
  1. i의 값은 3이므로 case 3에서 분기합니다.
  2. case 3에서 k는 0으로 초기화됩니다.
  3. 그런데, case 블록이 끝나지 않고 연속된 case들이 있으므로 case 4, case 5, default 또한 실행됩니다. (break가 없음)
  4. case 4에서 k에 3을 더합니다. 따라서 k는 3이 됩니다.
  5. case 5에서 k에서 10을 뺍니다. 따라서 k는 -7이 됩니다.
  6. 마지막으로 default 블록에서 k에서 1을 뺍니다. 따라서 k는 -8이 됩니다.

<출력>

-8

 

2022년 2회 8번 문제

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

#include <stdio.h>

struct student {
    int n, g;
};

int main() {
    struct student st[2];
    int i = 0;
    
    for (i; i < 2; i++) {
        st[i].n = i;
        st[i].g = i + 1;
    }
    
    printf("%d", st[0].n + st[1].g);
    
    return 0;
}
  1. student라는 구조체를 정의합니다. 이 구조체에는 ng라는 두 개의 멤버 변수가 있습니다.
  2. 구조체 student로 이루어진 배열 st[2]를 선언합니다. 1차원 배열인 st[2]student라는 구조체의 인스턴스를 두 개 저장하는 배열입니다. 각 student 인스턴스 안에는 ng 두 개의 변수가 있으며, 이 변수들은 한 쌍으로 이루어진 데이터 덩어리로 생각할 수 있습니다.
  3. 반복문인 for문을 사용하여 i를 0부터 시작하고, i가 2보다 작을 때까지 (즉, i가 0 또는 1일 때) 아래의 작업을 수행합니다.
  • st[i].n = i; 이 코드는 st 배열의 i번째 요소의 n 필드에 i의 값을 할당합니다. 처음에 i는 0이므로, st[0].n에 0이 할당됩니다.
  • st[i].g = i + 1; 이 코드는 st 배열의 i번째 요소의 g 필드에 (i + 1)의 값을 할당합니다. 여기서 i가 0이므로, st[0].g에 1이 할당됩니다.
st[0]
n g
0 1
 

이제 i의 값이 1로 증가하여 반복문이 다시 실행됩니다.

  • st[i].n = i; 이 코드는 st 배열의 i번째 요소의 n 필드에 i의 값을 할당합니다. 현재 i는 1이므로, st[1].n에 1이 할당됩니다.
  • st[i].g = i + 1; 이 코드는 st 배열의 i번째 요소의 g 필드에 (i + 1)의 값을 할당합니다. 여기서 i가 1이므로, st[1].g에 2이 할당됩니다.
st[1]
n g
1 2
 

<출력>

2

2022년 2회 14번 문제

다음 Python 코드의 실행 결과를 쓰시오.

a = "REMEMBER NOVEMBER"
b = a[:3] + a[12:16]
c = "R AND %S" % "STR"
print(b + c)

1. 문자열 "REMEMBER NOVEMBER"를 변수 a에 할당합니다.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
R E M E M B E R   N  O  V  E  M  B  E  R

2. 변수 b에는 a의 첫 3개 문자(a[:3])인 "REM"과 a의 12번째 문자부터 15번째 문자(a[12:16])인 "EMBE"를 합친 결과가 저장됩니다. 따라서 b에는 "REMEMBE"가 들어갑니다.

3. 변수 c에는 "R AND %S" 문자열 내의 "%S" 부분을 "STR" 문자열로 대체한 결과가 저장됩니다. 따라서 c에는 "R AND STR"가 들어갑니다.

4. 마지막으로 변수 b와 변수 c를 합쳐서 출력합니다. 따라서 출력은 "REMEMBER AND STR"가 됩니다.

<출력>

REMEMBER AND STR

 

2022년 2회 15번 문제

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

#include <stdio.h>

int len(char* p);

int main() {
    char *p1 = "2022";
    char *p2 = "202207";
    printf("%d", len(p1) + len(p2));
    return 0;
}

int len(char* p ) {
    int r = 0;
    while (*p != '\0') {
        p++;
        r++;
    }
    return r;
}

1. p1 포인터는 "2022" 문자열의 첫 번째 문자('2')의 주소를 가리킵니다.

  • 문자열 "2022"는 '2', '0', '2', '2'로 이루어져 있습니다.
  • p1은 첫 번째 '2'를 가리키며, 이후 순차적으로 문자를 탐색할 것입니다.

2. p2 포인터는 "202207" 문자열의 첫 번째 문자('2')의 주소를 가리킵니다.

  • 문자열 "202207"는 '2', '0', '2', '2', '0', '7'로 이루어져 있습니다.
  • p2는 첫 번째 '2'를 가리키며, 이후 순차적으로 문자를 탐색할 것입니다.

3. 문자열은 null 문자('\0')로 끝나며, 이것은 문자열의 끝을 나타냅니다. (암기 사항)

p1   2 0 2 2 \n

p2   2 0 2 2 0 7 \n
  • 따라서 문자열의 길이를 측정할 때 null 문자는 포함되지 않습니다.
  • len 함수는 문자열의 끝을 만날 때까지 문자를 하나씩 탐색하고, null 문자를 만나면 반복을 중단합니다.

4. 첫 번째 문자열 "2022"의 길이는 4, 두 번째 문자열 "202207"의 길이는 6입니다. 이 두 길이를 더하면 10이 되며, 이 값이 printf 함수를 통해 출력되어 결과로 나타납니다.

10

<참고>

0. 초기 상태:

  • 문자열 포인터 p가 "2022"를 가리키고 있음.
  • r 변수는 0입니다.

1. 첫 번째 반복:

  • p가 가리키는 값은 '2'입니다.
  • null 문자('\0')가 아니므로 반복문 진입.
  • p를 한 글자 앞으로 이동시키고(p++), r을 1 증가시킵니다(r++). 현재 r은 1입니다.

2. 두 번째 반복:

  • p가 가리키는 값은 '0'입니다.
  • null 문자('\0')가 아니므로 반복문 진입.
  • p를 한 글자 앞으로 이동시키고(p++), r을 1 증가시킵니다(r++). 현재 r은 2입니다.

3. 세 번째 반복:

  • p가 가리키는 값은 '2'입니다.
  • null 문자('\0')가 아니므로 반복문 진입.
  • p를 한 글자 앞으로 이동시키고(p++), r을 1 증가시킵니다(r++). 현재 r은 3입니다.

4. 네 번째 반복:

  • p가 가리키는 값은 '2'입니다.
  • null 문자('\0')가 아니므로 반복문 진입.
  • p를 한 글자 앞으로 이동시키고(p++), r을 1 증가시킵니다(r++). 현재 r은 4입니다.

5. 다섯 번째 반복:

  • p가 가리키는 값은 null 문자('\0')입니다.
  • null 문자('\0')를 만나면 반복문 종료.

따라서, 반복문이 종료된 후 r의 최종 값은 4입니다. 이것은 문자열 "2022"의 길이가 4라는 의미입니다.

2022년 2회 16번 문제

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

#include <stdio.h>

int main() {
    int a[4] = {0, 2, 4, 8};
    int b[3];
    int *pl;
    int sum = 0;
    for (int i = 1; i < 4; i++) {
        pl = a + i;  // 여기서 'a'는 배열의 첫 번째 요소인 a[0]의 주소를 나타냄.
        // 첫 번째 반복에서 i는 1이 되어 pl은 a+1의 주소를 가리키게 됨
        b[i - 1] = *pl - a[i - 1];
        sum = sum + a[i] + b[i - 1];
    }
    printf("%d", sum);
    return 0;
}
  1. 먼저, 정수 배열 a가 선언되고 초기화됩니다. a 배열에는 {0, 2, 4, 8} 값들이 들어가 있습니다.
  2. 정수 배열 b가 선언되지만 초기화되지 않습니다. 따라서 b 배열에는 초기값이 없어서 미정의 상태입니다.
  3. 포인터 pl이 선언되고 초기화되지 않았습니다.
  4. sum 변수가 선언되고 0으로 초기화됩니다. 이 변수는 결과값을 저장하는 데 사용됩니다.
  5. 반복문이 시작됩니다. i가 1에서 시작하여 4 미만인 동안 반복합니다.

<반복문>

0. 초기 상태:

  • i 값은 1입니다.
  • sum 값은 0입니다.
  • pl 포인터는 초기화되지 않았으며, b 배열 또한 초기화되지 않았습니다.

1. 첫 번째 반복 (i=1):

  • pl 포인터는 a 배열의 1번째 요소를 가리킵니다. (pl&a[1]과 같습니다.)
  • b[0]에는 *pl - a[i - 1] 값인 a[1] - a[0] 값이 저장됩니다. (b[0] = 2 - 0이므로 b[0]에는 2가 저장됩니다.)
  • sum 값은 sum + a[1] + b[0] 값인 0 + 2 + 2로 업데이트됩니다. 따라서 sum에는 4가 저장됩니다.

2. 두 번째 반복 (i=2):

  • pl 포인터는 a 배열의 2번째 요소를 가리킵니다. (pl&a[2]와 같습니다.)
  • b[1]에는 *pl - a[i - 1] 값인 a[2] - a[1] 값이 저장됩니다. (b[1] = 4 - 2이므로 b[1]에는 2가 저장됩니다.)
  • sum 값은 sum + a[2] + b[1] 값인 4 + 4 + 2로 업데이트됩니다. 따라서 sum에는 10이 저장됩니다.

3. 세 번째 반복 (i=3):

  • pl 포인터는 a 배열의 3번째 요소를 가리킵니다. (pl&a[3]와 같습니다.)
  • b[2]에는 *pl - a[i - 1] 값인 a[3] - a[2] 값이 저장됩니다. (b[2] = 8 - 4이므로 b[2]에는 4가 저장됩니다.)
  • sum 값은 sum +a[3] + b[2] 값인 10 + 8 + 4로 업데이트됩니다. 따라서 sum에는 22가 저장됩니다.

4. 네 번째 반복 (i=4):

  • 반복문의 조건에 따라 i 값이 4가 되었으므로 반복문을 종료합니다.

<출력>

22

2022년 2회 17번 문제

다음 JAVA 코드의 실행 결과를 쓰시오.

public class Soojebi {
    int a;

    public Soojebi(int a) {
        this.a = a;
    }

    int func() {
        int b = 1;
        for (int i = 1; i < a; i++) {
            b = a * i + b;
        }
        return a + b;
    }

    public static void main(String[] args) {
        Soojebi obj = new Soojebi(3);
        obj.a = 5;
        int b = obj.func();
        System.out.print(obj.a + b);
    }
}

<풀이>

Soojebi obj = new Soojebi(3);

obj는 Soojebi 클래스의 인스턴스로 멤버 변수 a를 생성시킵니다. 위의 코드에서는 Soojebi 클래스의 생성자를 호출하고 있으며, 생성자에 3이라는 인자값을 전달하고 있습니다.

public Soojebi(int a) {
    this.a = a;
}

생성자는 클래스명과 동일한 이름을 가진 메서드입니다. 따라서 obj가 가지고 있는 멤버변수 a3을 할당합니다.

obj.a = 5;
int b = obj.func();

다시 main 메서드로 돌아와서 obj.a=5는 이전에 3으로 초기화한 obj 객체의 멤버 변수 a를 5로 변경합니다. 이전의 값 3은 더 이상 사용되지 않습니다. 그럴 거면 아까 3 왜 넣었니.

int b = obj.func(); 이 부분에서 변수 b는 main 메서드 내에서만 선언된 지역 변수로, main 메서드의 실행이 종료되면 메모리에서 사라집니다. 그리고 obj 인스턴스가 가지고 있는 func 메서드를 호출하게 됩니다.

int func() {
        int b = 1;
        for (int i = 1; i < a; i++) {
            b = a * i + b;
        }
        return a + b;
    }

참고: func 메서드 내부에서 선언된 int b와 main 메서드에서 선언된 int b는 서로 다른 변수입니다. 이 두 변수는 메모리에서 별개로 관리되며, 값이나 상태를 공유하지 않습니다.

여기서는 먼저 변수 b에 1을 초기화합니다.

그리고 i를 1부터 시작해서 i가 a보다 작을 때까지 반복하는데, 여기서 a는 obj 객체가 가지고 있는 값인 5입니다.

  • i=1일 때, i<a는 1<5로 True입니다. 그래서 b=a*i+b를 계산하면, b=5*1+1=6이 됩니다.
  • i=2일 때, i<a는 2<5로 True이므로, b=a*i+b를 계산하면, b=5*2+6=16이 됩니다.
  • i=3일 때, i<a는 3<5로 True이므로, b=a*i+b를 계산하면, b=5*3+16=31이 됩니다.
  • i=4일 때, i<a는 4<5로 True이므로, b=a*i+b를 계산하면, b=5*4+31=51이 됩니다.
  • i=5일 때, i<a는 5<5로 False이므로, 반복문을 종료합니다.

그리고 최종적으로 a+b를 계산하여 5+51=56을 반환합니다. 이 값은 int b = obj.func(); 이 코드에서 변수 b에 저장됩니다.

System.out.print(obj.a + b);

마지막으로 obj 객체가 가지고 있는 a의 값인 5와 반환된 값 56을 더해서 61을 출력합니다.

<출력>

61

 

 

 

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

💡 위 내용은 수제비 정보처리기사 실기 FINAL 실전 모의고사 기출 문제를 직접 풀고 정리한 것입니다.

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

728x90
반응형
LIST