Tech Trail

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

Learning/정보처리기사

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

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

2021년 3회 1번 문제

다음은 자바 코드이다. 출력 결과를 쓰시오.

class Soojebi {
    static private Soojebi instance = null; // 정적(private) 멤버 변수로 싱글톤 객체를 저장
    private int count = 0; // 객체의 상태를 나타내는 멤버 변수

    // 외부에서 객체를 생성하는 것을 막기 위해 생성자를 private로 선언
    private Soojebi() {}

    // 정적(public) 메서드를 통해 싱글톤 객체에 접근하고 생성
    static public Soojebi get() {
        if (instance == null) {
            instance = new Soojebi(); // 처음 호출 시에만 객체 생성
        }
        return instance; // 이미 생성된 객체 반환
    }

    // 객체의 상태(count)를 증가시키는 메서드
    public void count() {
        count++;
    }

    // 객체의 상태(count)를 반환하는 메서드
    public int getCount() {
        return count;
    }
}

public class Soojebi2 {
    public static void main(String[] args) {
        Soojebi s1 = Soojebi.get(); // 싱글톤 객체 생성 또는 기존 객체 반환
        s1.count(); // 상태(count)를 증가시킴
        Soojebi s2 = Soojebi.get(); // 싱글톤 객체 재사용
        s2.count(); // 상태(count)를 증가시킴
        Soojebi s3 = Soojebi.get(); // 싱글톤 객체 재사용
        s3.count(); // 상태(count)를 증가시킴
        System.out.print(s1.getCount()); // 상태(count) 출력, 결과는 3
    }
}

코드에서 Soojebi 클래스가 싱글톤 패턴을 따르고 있습니다.

  • Soojebi 클래스는 생성자(private Soojebi())를 private으로 선언하여 외부에서 객체를 직접 생성할 수 없게 합니다.
  • 정적 메서드인 get()을 사용하여 싱글톤 객체에 접근하고 객체를 생성합니다. 만약 이미 객체가 생성되어 있다면 기존 객체를 반환합니다.
  • Soojebi.get() 메서드를 사용하여 Soojebi 객체를 얻고, count() 메서드를 호출하여 상태를 1씩 증가시킵니다.
  • getCount() 메서드를 사용하여 객체의 상태를 출력하면, 세 번의 count() 호출로 인해 상태가 3이 출력됩니다.

<출력>

3

이렇게 싱글톤 패턴을 사용하면 한 번의 객체 생성만으로 여러 곳에서 동일한 객체를 공유하고 데이터를 일관되게 유지할 수 있습니다.

 

2021년 3회 11번 문제

다음은 자바 코드이다. 출력 결과를 쓰시오.

public class Soojebi {
    public static void main(String[] args) {
        int a = 3, b = 4, c = 3, d = 5;
        if ((a == 2 | a == c) & !(c > d) & (1 == b ^ c != d)) {
            a = b + c;
            if (7 == b ^ c != a) {
                System.out.println(a);
            } else {
                System.out.println(b);
            }
        } else {
            a = c + d;
            if (7 == c ^ b != a) {
                System.out.println(a);
            } else {
                System.out.println(d);
            }
        }
    }
}
  1. (a == 2 | a == c): 먼저, a == 23 == 2이므로 False입니다. a == c에서 3 == 3은 True입니다. | (OR) 연산자가 있으므로 (a == 2 | a == c)는 True입니다.
  2. !(c > d): c > d에서 3 > 5는 False이지만 ! (NOT) 연산자가 있으므로 !(c > d)는 True입니다.
  3. (1 == b ^ c != d): 1 == b에서 1 == 4는 False입니다. c != d에서 3과 5는 같지 않으므로 True입니다. ^ (Exclusive OR) 연산자가 있으므로 (1 == b ^ c != d)는 True가 됩니다.
  4. 따라서, ((a == 2 | a == c) & !(c > d) & (1 == b ^ c != d))는 True이므로 if문 블록이 실행됩니다.
  5. a = b + c로 계산하면 4 + 3으로 a는 7이 됩니다.
  6. if문에서 7 == b에서 7 == 4는 False입니다. c != a에서 3과 7은 같지 않으므로 True입니다. ^(Exclusive OR)를 하면 최종적으로 (7 == b ^ c != a)는 True가 되므로 System.out.println(a);가 실행됩니다.
  7. 따라서, a의 값인 7이 출력됩니다.

<출력>

7

 

2021년 3회 12번 문제

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

#include <stdio.h>

void main() {
    int *arr[3];
    int a = 12, b = 24, c = 36;
    arr[0] = &a;
    arr[1] = &b;
    arr[2] = &c;

    printf("%d\n", *arr[1] + **arr + 1);
}
  1. int *arr[3]; 라인에서 int형 포인터 배열 arr을 선언합니다. arr은 세 개의 포인터를 저장할 수 있는 배열입니다.
  2. int a = 12, b = 24, c = 36; 라인에서 세 개의 정수형 변수 a, b, c를 선언하고 초기값을 설정합니다.
  3. arr[0] = &a;, arr[1] = &b;, arr[2] = &c; 라인에서 포인터 배열 arr의 각 원소에 변수 a, b, c의 주소를 할당합니다. 즉, arr[0]a의 주소를, arr[1]b의 주소를, arr[2]c의 주소를 가리키게 됩니다.
  4. printf("%d\n", arr[1] + **arr + 1); 라인에서 다음의 식을 계산하여 출력합니다.
  • arr[1]두 번째 요소인 b의 주소를 가리킵니다.
  • *arr[1]b의 값을 가리키므로 24가 됩니다. (* 연산자는 포인터의 값을 가리키는 역할을 합니다.)
  • *arr은 포인터 배열 arr의 첫 번째 요소인 arr[0], 즉 a의 주소를 가리키고, **arr은 arr 배열의 첫 번째 요소인 arr[0]의 값, 즉 a의 값을 가리켜 12가 됩니다.
  • 따라서 arr[1] + **arr&b + 12가 되며, 이는 b의 주소에 12를 더한 값을 나타냅니다.
  • 마지막으로 1을 더하면 최종적으로 37이 됩니다.

<출력>

37

 

2021년 3회 14번 문제

다음은 파이썬 코드이다. 출력 결과를 쓰시오.

a, b = 100, 200
print(a==b)

a는 100, b는 200이므로 두 값은 서로 다릅니다.

따라서 a==bFalse가 되고, 이 결과가 화면에 출력됩니다.

<출력>

False

 

2021년 3회 17번 문제

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

#include <stdio.h>

struct Soojebi {
    char name[20];
    int os, db, hab1, hab2;
};

void main() {
    struct Soojebi s[3] = {
        {"데이터1", 95, 88},
        {"데이터2", 84, 91},
        {"데이터3", 86, 75}
    };
    struct Soojebi *p;

    p = &s[0];
    (p+1)->hab1 = (p+1)->os + (p+2)->db;
    (p+1)->hab2 = (p+1)->hab1 + p->os + p->db;

    printf("%d\n", (p+1)->hab1 + (p+1)->hab2);
}
  1. 구조체 정의
struct Soojebi {
    char name[20];
    int os, db, hab1, hab2;
};
 

Soojebi라는 구조체를 정의합니다.

이 구조체는 name, os, db, hab1, hab2라는 다섯 가지 멤버를 가집니다.

2. 배열 초기화

struct Soojebi s[3] = {
    {"데이터1", 95, 88},
    {"데이터2", 84, 91},
    {"데이터3", 86, 75}
};

크기가 3인 Soojebi 구조체 배열 변수 3을 선언하고 각각 초기화합니다.

  • s[0]의 name은 "데이터1", os는 95, db는 88, hab1은 0, hab2는 0이 됩니다.
  • s[1]의 name은 "데이터2", os는 84, db는 91, hab1은 0, hab2는 0이 됩니다.
  • s[2]의 name은 "데이터3", os는 86, db는 75, hab1은 0, hab2는 0이 됩니다.

3. 포인터 변수 선언과 초기화

struct Soojebi *p;
p = &s[0];

Soojebi 구조체를 가리키는 포인터 변수 p를 선언하고, 이를 s[0]의 주소로 초기화합니다.

따라서 p는 s[0], (p+1)는 s[1], (p+2)는 s[2]의 주소를 가리키게 됩니다.

4. 구조체 멤버 값 설정

(p+1)->hab1 = (p+1)->os + (p+2)->db;
(p+1)->hab2 = (p+1)->hab1 + p->os + p->db;

이 부분에서는 구조체 멤버인 hab1hab2의 값을 설정합니다.

(p+1)은 포인터 p가 가리키는 구조체의 다음 구조체를 가리킵니다. (p+1)->os는 다음 구조체의 os 멤버를 나타내며, (p+2)->db는 그 다음 구조체의 db 멤버를 나타냅니다.

  • (p+1)->os값 84와 (p+2)->db값 75를 합한 값 159를 (p+1)->hab1 변수에 대입합니다.
  • (p+1)->hab1 변숫값 159와 p->os값 95, p->db값 88을 합한 값인 342를 (p+1)->hab2에 대입합니다.

5. 결과 출력

printf("%d\n", (p+1)->hab1 + (p+1)->hab2);

최종적으로 (p+1)->hab1(p+1)->hab2의 합계를 계산하고 출력합니다.

(p+1)->hab1은 84 + 75 = 159이 되고, (p+1)->hab2는 159 + 95 + 88 = 342가 됩니다.

따라서 출력 결과는 159 + 342 = 501이 됩니다.

501

 

 

 

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

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

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

728x90
반응형
LIST