Tech Trail

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

Learning/정보처리기사

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

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

2022년 1회 3번 문제

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

class A {
    int a;
    int b;
}

public class Soojebi {

    static void func1(A m){
        m.a *= 10;
    }

    static void func2(A m){
        m.a += m.b;
    }

    public static void main(String args[]){
        A m = new A();
        m.a = 100;
        func1(m);
        m.b = m.a;
        func2(m);

        System.out.printf("%d", m.a);
    }
}

<풀이>

먼저, A 클래스를 정의하고, int 형식의 ab 멤버 변수를 갖습니다.

class A {
    int a;
    int b;
}

Soojebi 클래스에서는 다음과 같은 과정이 일어납니다.

  1. A m = new A();에서 A 클래스의 인스턴스인 m을 생성합니다. 이 인스턴스는 ab라는 두 개의 멤버 변수를 가집니다.
  2. m.a = 100;m 인스턴스의 a 멤버 변수에 100을 할당합니다. 따라서 m.a는 100이 됩니다.
  3. func1(m); 함수를 호출합니다. 이 함수는 A 클래스의 인스턴스를 받아서 해당 인스턴스의 a 값을 10배로 만듭니다. 따라서 m.a는 1000이 됩니다. (m.a = m.a * 10 = 100 * 10 = 1000)
  4. m.b = m.a;m.a의 값을 m.b에 할당합니다. 따라서 m.b도 1000이 됩니다.
  5. func2(m); 함수를 호출합니다. 이 함수는 A 클래스의 인스턴스를 받아서 해당 인스턴스의 a 값을 ab의 합으로 만듭니다. 따라서 m.a는 m.a + m.b = 1000 + 1000 = 2000이 됩니다.
  6. System.out.printf("%d", m.a);를 통해 m.a의 값을 출력합니다. 따라서 최종 출력 결과는 2000이 됩니다.

<출력>

2000

 

2022년 1회 6번 문제

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

def func(num1, num2=2):
    print('a=', num1, 'b=', num2)

func(20)

1. def func(num1, num2=2):

  • 이 부분은 func라는 함수를 정의하는 부분입니다.
  • num1num2 두 개의 매개변수를 가집니다.
  • num2는 기본값이 2로 설정되어 있어, 함수를 호출할 때 num2에 값을 전달하지 않으면 2가 기본값으로 사용됩니다.

2. print('a=', num1, 'b=', num2)

  • 이 부분은 함수 내에서 실행되는 코드입니다.
  • print 함수를 사용하여 num1num2의 값을 출력합니다.
  • 문자열과 변수 값을 함께 출력하기 위해 콤마(,)를 사용하였습니다.

3. func(20)

  • 이 부분은 함수를 호출하는 부분입니다.
  • func 함수를 호출하면서 num1에는 20이 전달되었습니다.
  • num2는 전달하지 않았으므로 기본값 2가 사용됩니다.

<출력>

a= 20 b= 2

 

2022년 1회 11번 문제

다음은 스레드에 관한 코드이다. 빈칸에 알맞은 코드를 쓰시오.

class Car implements Runnable {
    int a;

    public void run() {
        // ...
    }
}

public class Soojebi {
    public static void main(String args[]) {
        Thread t1 = new Thread(new 빈칸());
        t1.start();
    }
}

Runnable은 인터페이스이며, new 다음에는 클래스 이름이 와야 합니다.

따라서 Car 클래스의 인스턴스를 생성하여 Thread 생성자에 전달해야 하는데, 이를 통해 Car 객체가 Runnable로 사용됩니다. 이렇게 하는 이유는 Java에서 스레드를 관리하고 실행하기 위해 스레드 클래스에 Runnable 인터페이스를 구현한 객체를 전달하여 사용하는 것이 일반적인 패턴이기 때문입니다.

class Car implements Runnable {
    int a;

    public void run() {
        // ...
    }
}

public class Soojebi {
    public static void main(String args[]) {
        Thread t1 = new Thread(new Car());
        t1.start();
    }
}
답: Car

 

 

2022년 1회 14번 문제

다음은 소스 코드에 입력값이 5가 들어왔을 때 출력값을 쓰시오.

#include <stdio.h>

unsigned int fn(int a) {
    if (a <= 1) return 1;
    return a * fn(a - 1);
}

void main() {
    int a;
    scanf("%d", &a);
    printf("%d", fn(a));
}

1. 먼저 int a;를 통해 정수형 변수 a를 선언합니다.

2. scanf("%d", &a);를 통해 사용자로부터 정수 값을 입력받아 a 변수에 저장합니다. 여기서 입력값은 5이므로 a는 5가 됩니다.

3. fn(a)를 호출하면서 a 값을 인자로 전달합니다. 함수 fn은 재귀적으로 계승(factorial) 값을 계산하는 함수입니다.

4. fn(5) 호출:

  • if (a <= 1) 조건에서 5는 1보다 크므로 False가 되어 계속 진행됩니다.
  • return a * fn(a - 1);에서 5 * fn(4)를 계산하고 반환합니다.

5. fn(4) 호출:

  • 4 * fn(3)을 계산하고 반환합니다.

6. fn(3) 호출:

  • 3 * fn(2)를 계산하고 반환합니다.

7. fn(2) 호출:

  • 2 * fn(1)을 계산하고 반환합니다.

8. fn(1) 호출:

  • if (a <= 1) 조건에서 1은 1보다 작거나 같으므로 True가 되어 1을 반환합니다.

9. 이제 모든 재귀 호출이 완료되어 함수 호출 스택이 역순으로 해제됩니다.

따라서 fn(5)는 5 * 4 * 3 * 2 * 1 = 120을 반환합니다.

printf("%d", fn(a));를 통해 결과값 120이 출력됩니다.

120

<참고>

  • fn(1) = 1
  • fn(2) = 2 * fn(1) = 2 * 1 = 2
  • fn(3) = 3 * fn(2) = 3 * 2 = 6
  • fn(4) = 4 * fn(3) = 4 * 6 = 24
  • fn(5) = 5 * fn(4) = 5 * 24 = 120

 

2022년 1회 15번 문제

빈칸에 연산자 이용해 정수를 역순으로 출력하는 프로그램을 완성하시오. 예를 들어 1234의 역순은 4321이고, 1230처럼 0으로 끝나는 정수는 고려하지 않는다.

#include <stdio.h>
void nain() {
    int number = 1234;
    int div = 10;
    int result = 0;
    while (number 빈칸1 0) {
        result = result * div;
        result = result + number 빈칸2 div;
        number = number 빈칸3 div;
    }

    printf("%d", result);
}

 

#include <stdio.h>

void main() {
    int number = 1234;
    int div = 10;
    int result = 0;
    while (number > 0) {  // != 또는 >
        result = result * div;
        result = result + number % div;
        number = number / div;
    }

    printf("%d", result);
}

 

1. 빈칸1에는 > 연산자가 들어가야 합니다. 이 연산자는 현재 숫자가 0보다 큰지 확인하여 while 루프를 계속해서 실행할지 결정합니다.

2. result는 0으로 초기화되었으므로 result = result * div 연산은 아무런 영향을 주지 않습니다.

3. result = result + number 빈칸2 div;

  • 역순으로 출력해야 하기 때문에, 예를 들어 1234가 있으면 4부터 출력해야 합니다.
  • 이를 위해 1234를 10으로 나누면 나머지가 4가 되는 것을 고려해야 합니다.
  • 따라서 빈칸2에는 % (나머지 연산자)가 들어가야 합니다. 이렇게 하면 현재 숫자의 가장 오른쪽 자릿수를 먼저 처리하게 됩니다.

4. number = number 빈칸3 div;

  • 4를 출력한 후, 123으로 남은 숫자를 다시 10으로 나눠야 합니다.
  • 역순으로 출력한다는 것은 가장 오른쪽 자릿수부터 시작하여 왼쪽 자릿수로 이동하며 숫자를 출력하는 것을 의미하기 때문입니다.
  • 따라서 현재 숫자에서 가장 오른쪽 자릿수를 얻고 출력한 후, 그 자릿수를 제거해야 합니다.
  • 이를 위해 빈칸3에는 / (나누기 연산자)를 넣으면 됩니다. 그러면 1234 / 10 = 123.4가 되는데, 정수를 정수로 나누면 소수 부분은 버려지고 정수 부분만 남게 됩니다.
  • 이런 식으로 반복하면 모든 자릿수를 역순으로 출력할 수 있습니다.

 

2022년 1회 19번 문제

다음 소스 코드가 실행될 때 출력값을 적으시오.

#include <stdio.h>

// 소수인지를 판별하는 함수
int isPrime(int number) {
    int i;
    for (i = 2; i < number; i++) {
        // 2부터 number-1까지의 숫자로 나누어 떨어지는지 확인
        if (number % i == 0)
            return 0; // 나누어 떨어지면 소수가 아님
    }
    return 1; // 나누어 떨어지지 않으면 소수임
}

void main() {
    int number = 13195;   // 주어진 수
    int max_div = 0;      // 가장 큰 소인수를 저장할 변수
    int i;

    // 2부터 number-1까지 반복
    for (i = 2; i < number; i++) {
        // 소수인지 체크하고, number로 나누어 떨어지는지 확인
        if (isPrime(i) == 1 && number % i == 0)
            max_div = i; // 소수이면서 number로 나누어 떨어질 때 max_div를 업데이트
    }

    printf("%d", max_div); // 가장 큰 소인수 출력
}

이 소스 코드는 주어진 숫자인 13195의 가장 큰 소인수를 찾는 프로그램입니다.

i가 2인 경우:

  • isPrime(2) 호출 시, 2는 소수이므로 1을 반환합니다.
  • number % 2는 13195를 2로 나눈 나머지인 1을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 0이 출력됩니다.

i가 3인 경우:

  • isPrime(3) 호출 시, 3은 소수이므로 1을 반환합니다.
  • number % 3는 13195를 3으로 나눈 나머지인 2를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 0이 출력됩니다.

i가 4인 경우:

  • isPrime(4) 호출 시, 4는 소수가 아니므로 0을 반환합니다.
  • number % 4는 13195를 4로 나눈 나머지인 3을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 0이 출력됩니다.

i가 5인 경우:

  • isPrime(5) 호출 시, 5는 소수이므로 1을 반환합니다.
  • number % 5는 13195를 5로 나눈 나머지인 0을 반환합니다.
  • 이 때 max_div는 5로 업데이트됩니다.
  • 결과적으로 5가 출력됩니다.

i가 6인 경우:

  • isPrime(6) 호출 시, 6은 소수가 아니므로 0을 반환합니다.
  • number % 6는 13195를 6으로 나눈 나머지인 5를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 5가 출력됩니다.

i가 7인 경우:

  • isPrime(7) 호출 시, 7은 소수이므로 1을 반환합니다.
  • number % 7는 13195를 7로 나눈 나머지인 6을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 5가 출력됩니다.

i가 8인 경우:

  • isPrime(8) 호출 시, 8은 소수가 아니므로 0을 반환합니다.
  • number % 8는 13195를 8로 나눈 나머지인 3을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 5가 출력됩니다.

i가 9인 경우:

  • isPrime(9) 호출 시, 9는 소수가 아니므로 0을 반환합니다.
  • number % 9는 13195를 9로 나눈 나머지인 8을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 5가 출력됩니다.

i가 10인 경우:

  • isPrime(10) 호출 시, 10은 소수가 아니므로 0을 반환합니다.
  • number % 10는 13195를 10으로 나눈 나머지인 5를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 5가 출력됩니다.

i가 11인 경우:

  • isPrime(11) 호출 시, 11은 소수이므로 1을 반환합니다.
  • number % 11는 13195를 11로 나눈 나머지인 0을 반환합니다.
  • 이 때 max_div는 11로 업데이트됩니다.
  • 결과적으로 11이 출력됩니다.

i가 12인 경우:

  • isPrime(12) 호출 시, 12는 소수가 아니므로 0을 반환합니다.
  • number % 12는 13195를 12로 나눈 나머지인 11을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 11이 출력됩니다.

i가 13인 경우:

  • isPrime(13) 호출 시, 13은 소수이므로 1을 반환합니다.
  • number % 13는 13195를 13로 나눈 나머지인 9를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 11이 출력됩니다.

i가 14인 경우:

  • isPrime(14) 호출 시, 14는 소수가 아니므로 0을 반환합니다.
  • number % 14는 13195를 14로 나눈 나머지인 11을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 11이 출력됩니다.

i가 15인 경우:

  • isPrime(15) 호출 시, 15는 소수가 아니므로 0을 반환합니다.
  • number % 15는 13195를 15로 나눈 나머지인 5를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 11이 출력됩니다.

i가 16인 경우:

  • isPrime(16) 호출 시, 16은 소수가 아니므로 0을 반환합니다.
  • number % 16는 13195를 16로 나눈 나머지인 3을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 11이 출력됩니다.

i가 17인 경우:

  • isPrime(17) 호출 시, 17은 소수이므로 1을 반환합니다.
  • number % 17는 13195를 17로 나눈 나머지인 10을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 11이 출력됩니다.

i가 18인 경우:

  • isPrime(18) 호출 시, 18은 소수가 아니므로 0을 반환합니다.
  • number % 18는 13195를 18로 나눈 나머지인 11을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 11이 출력됩니다.

i가 19인 경우:

  • isPrime(19) 호출 시, 19는 소수이므로 1을 반환합니다.
  • number % 19는 13195를 19로 나눈 나머지인 9를 반환합니다.
  • 따라서 max_div는 19로 업데이트되고, 결과적으로 19가 출력됩니다.

i가 20인 경우:

  • isPrime(20) 호출 시, 20은 소수가 아니므로 0을 반환합니다.
  • number % 20는 13195를 20로 나눈 나머지인 15를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 19가 출력됩니다.

i가 21인 경우:

  • isPrime(21) 호출 시, 21은 소수가 아니므로 0을 반환합니다.
  • number % 21는 13195를 21로 나눈 나머지인 20을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 19가 출력됩니다.

i가 22인 경우:

  • isPrime(22) 호출 시, 22는 소수가 아니므로 0을 반환합니다.
  • number % 22는 13195를 22로 나눈 나머지인 7을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 19가 출력됩니다.

i가 23인 경우:

  • isPrime(23) 호출 시, 23은 소수이므로 1을 반환합니다.
  • number % 23는 13195를 23로 나눈 나머지인 14를 반환합니다.
  • 따라서 max_div는 23으로 업데이트되고, 결과적으로 23이 출력됩니다.

i가 24인 경우:

  • isPrime(24) 호출 시, 24는 소수가 아니므로 0을 반환합니다.
  • number % 24는 13195를 24로 나눈 나머지인 19를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 23이 출력됩니다.

i가 25인 경우:

  • isPrime(25) 호출 시, 25는 소수가 아니므로 0을 반환합니다.
  • number % 25는 13195를 25로 나눈 나머지인 20을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 23이 출력됩니다.

i가 26인 경우:

  • isPrime(26) 호출 시, 26은 소수가 아니므로 0을 반환합니다.
  • number % 26는 13195를 26으로 나눈 나머지인 17을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 23이 출력됩니다.

i가 27인 경우:

  • isPrime(27) 호출 시, 27은 소수가 아니므로 0을 반환합니다.
  • number % 27는 13195를 27로 나눈 나머지인 14를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 23이 출력됩니다.

i가 28인 경우:

  • isPrime(28) 호출 시, 28은 소수가 아니므로 0을 반환합니다.
  • number % 28는 13195를 28로 나눈 나머지인 11을 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 23이 출력됩니다.

i가 29인 경우:

  • isPrime(29) 호출 시, 29는 소수이므로 1을 반환합니다.
  • number % 29는 13195를 29로 나눈 나머지인 20을 반환합니다.
  • 따라서 max_div는 29로 업데이트되고, 결과적으로 29가 출력됩니다.

i가 30인 경우:

  • isPrime(30) 호출 시, 30은 소수가 아니므로 0을 반환합니다.
  • number % 30는 13195를 30으로 나눈 나머지인 5를 반환합니다.
  • 따라서 max_div는 업데이트되지 않고, 결과적으로 29가 출력됩니다.

그만 할래...

<출력>

29

 

 

 

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

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

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

728x90
반응형
LIST