Tech Trail

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

Learning/정보처리기사

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

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

2020년 3회 2번 문제

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

 

#include <stdio.h>
void main() {
    int i=0, c=0;
    while (i<10) {
        i++;
        c*=i;
    }
    printf("%d", c);
}
  1. int i=0, c=0; : 정수형 변수 i와 c를 선언하고 각각 0으로 초기화합니다.
  2. while (i<10) : i가 10보다 작은 동안 아래의 코드 블록을 반복합니다.
  3. i++;: 각 반복에서 i를 1씩 증가시킵니다.
  4. c*=i;: 변수 c를 i과 곱하고 그 결과를 다시 c에 저장합니다. ( c = c * i)
  5. c는 이미 0이므로 어떤 값을 곱해도 0이 되며, 이 작업은 c의 값에 아무런 변화를 주지 않습니다.

따라서 이 코드에서 c 변수의 값은 항상 0으로 유지됩니다.

0

 

c 변수에 대한 어떠한 변경도 없으므로 printf 문에서 0이 출력됩니다.

 

2020년 3회 13번 문제

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

 

#include <stdio.h>

int r1() {
    return 4;
}

int r10() {
    return (30 + r1());
}

int r100() {
    return (200 + r10());
}

int main() {
    printf("%d\n", r100());
    return 0;
}
  1. main 함수에서는 printf 함수를 사용하여 r100() 함수의 결과를 정수로 출력하려고 합니다.
  2. r100() 함수는 r10() 함수를 호출합니다. r10() 함수 내부에서는 30에 r1() 함수의 결과를 더한 값을 반환합니다.
  3. r1() 함수는 4를 반환합니다.
  4. 따라서 r10() 함수는 30 + 4 = 34를 반환합니다.
  5. 이제 r100() 함수에서는 200에 r10() 함수의 결과인 34를 더한 값을 반환합니다.
  6. 따라서 r100() 함수는 200 + 34 = 234를 반환합니다.
  7. 마지막으로 main 함수에서 printf를 통해 r100() 함수의 결과값인 234를 출력합니다.

234
 

main() 함수에서는 r100() 함수를 호출하여 그 결과를 출력합니다. 따라서 출력 결과는 234가 됩니다.

 

2020년 3회 15번 문제

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

abstract class Vehicle {
    private String name;
    abstract public String getName(String val);
    public String getName() {  // 인자가 없음
        return "Vehicle name:" + name;
    }
    public void setName(String val) {
        name(val);
    }
}

class Car extends Vehicle {
    public Car(String val) {
        setName(val);
    }
    public String getName(String val) {  // 인자가 있음 (오버로딩)
        return "Car name :" + val;
    }
    public String getName(byte val[]) {  // 인자가 있음 (오버로딩)
        return " Car name :" + val;
    }
}

public class Soojebi {
    public static void main(String[] args) {
        Vehicle obj = new Car("Spark");
        System.out.print(obj.getName());  // 인자 없는 메서드
    }
}
 

이 코드는 클래스와 상속, 추상 클래스와 메서드 오버라이딩에 관한 문제입니다.

  1. Vehicle 클래스는 name 필드와 추상 메서드 getName(String val)을 가지고 있습니다. 또한, getName() 메서드가 매개변수 없이 정의되어 있습니다.
  2. Car 클래스는 Vehicle 클래스를 상속하고 있습니다. Car 클래스의 생성자는 setName(val) 메서드를 호출하여 name 필드에 값을 설정합니다. 또한, Car 클래스에는 getName(String val) 메서드와 getName(byte val[]) 메서드가 오버로딩되어 있습니다.

이제 main 함수에서 다음을 실행합니다:

Vehicle obj = new Car("Spark");
System.out.print(obj.getName());

3. Vehicle 클래스의 객체 obj를 생성하고, 이 객체를 Car("Spark")로 초기화합니다. 이로써 Car 클래스의 생성자가 호출되고, "Spark"를 인자로 받아 name 필드에 "Spark"가 설정됩니다.

따라서 Vehicle obj = new Car("Spark"); 코드를 실행하면, 자식 클래스인 Car의 생성자가 호출되어 "Spark"를 받아옵니다. 이 "Spark" 값을 부모 클래스인 Vehicle의 생성자에게 전달하고, 부모 클래스의 생성자를 통해 name 필드에 "Spark"가 설정됩니다. 결과적으로 obj 객체는 "Spark" 값을 가진 name 필드를 가지게 됩니다.

4. 그런 다음 obj.getName()을 호출하면, 매개변수 없는 getName() 메서드가 호출됩니다. 이 메서드는 "Vehicle name:" 뒤에 name 필드의 값인 "Spark"를 반환합니다.

System.out.print(obj.getName());를 실행하면 "Vehicle name: Spark"가 출력됩니다.

<출력>

Vehicle name: Spark

따라서 출력 결과는 "Vehicle name: Spark"가 됩니다.

<참고>

만약 obj.getName() 대신 obj.getName("a")를 호출했다면, 자식 클래스인 Car에서 오버로딩한 getName(String val) 메서드가 아닌, 부모 클래스인 VehiclegetName() 메서드가 호출됩니다. 이것은 메서드 오버로딩 시 매개변수의 형식을 기반으로 호출할 메서드가 결정되기 때문입니다.

 

2020년 3회 17번 문제

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

public class Soojebi {
    public static void main(String[] args) {
        int i = 0;
        int sum = 0;
        while (i < 10) {
            i++;
            if (i % 2 == 1)
                continue;
            sum += i;
        }
        System.out.println(sum);
    }
}

이 코드는 1부터 10까지의 짝수를 찾아서 그 합을 계산하는 문제입니다.

  1. int i와 int sum 변수를 초기화합니다.
  2. while 루프를 시작합니다. i가 10보다 작을 동안 반복됩니다.
  3. i를 1씩 증가시킵니다.
  4. if (i % 2 == 1) 조건을 사용하여 i가 홀수인 경우에는 continue 문을 사용하여 다음 반복 단계로 건너뜁니다. 이로 인해 홀수는 덧셈이 되지 않습니다.
  5. 그렇지 않은 경우 (즉, i가 짝수인 경우), sum 변수에 현재의 i 값을 더합니다.
  6. 루프가 종료되면 sum 변수에는 1부터 10까지의 짝수의 합인 30이 저장되고, 이 값이 출력됩니다.
30
 

따라서 출력은 "30"이 됩니다.

<참고>

  • 처음에 i가 0인 상태에서 i++을 만나게 되면 i가 1이 되고, i%2==1은 참이 되어 continue를 실행한다.
  • i가 1인 상태에서 i++을 만나게 되면 i가 2가 되고, i%2==1은 거짓이 되어 sum+=i;를 실행하게 되는데, i값을 sum에 더하게 되므로 sum은 2가 된다.
  • 처음에 i가 2인 상태에서 i++을 만나게 되면 i가 3이 되고, i%2==1은 참이 되어 continue를 실행한다.
  • i가 3인 상태에서 i++을 만나게 되면 i가 4가 되고, i%2==1은 거짓이 되어 sum+=i;를 실행하게 되는데, i값을 sum에 더하게 되므로 sum은 기존 2에 4를 더한 6이 된다.
  • 이런 식으로 반복하게 되면 i가 2, 4, 6, 8, 10일 때 sum+=i;를 실행하게 되므로 2+4+6+8+10=30이 출력된다.

 

2020년 4회 5번 문제

다음은 n이 10일 때, 10을 2진수로 변환하는 자바 소스코드이다. 빈칸1, 빈칸2에 알맞은 값을 적으시오.

[출력 결과]

00001010
class Soojebi {
    public static void main(String[] args) {
        int[] a = new int[8];
        int i = 0;
        int n = 10; 
        
        while ( 빈칸1 ) { 
            a[i++] =  빈칸2 ;
            n /= 2;
        }
        
        for (i = 7; i >= 0; i--) { 
            System.out.print(a[i]);
        }
    }
}
class Soojebi {
    public static void main(String[] args) {
        int[] a = new int[8];
        int i = 0;
        int n = 10; 
        
        while (i < 8) {  // 빈칸1: i가 0부터 7까지 8번 반복
            a[i++] = n % 2;  // 빈칸2: n을 2로 나눈 나머지를 배열에 저장
            n /= 2;
        }
        
        for (i = 7; i >= 0; i--) { 
            System.out.print(a[i]);
        }
    }
}

<참고> 코드에서 10을 2진수로 변환하는 방법은 다음과 같습니다.

  1. 10을 2로 나눈 나머지를 배열 a에 저장하고, 10을 2로 나눈 몫을 다시 n에 저장합니다.
  2. 위 과정을 반복하면서 배열 a에 2진수의 각 자릿수를 저장합니다.
  3. 배열 a를 역순으로 출력하면 10의 2진수 표현인 "00001010"을 얻을 수 있습니다.

<해설>

빈칸1 같은 경우는 i가 0부터 7까지 8번 반복해야 하므로 i < 8을 사용합니다. (i<a.length)

빈칸2에서는 n을 2로 나눈 나머지를 배열 a에 저장합니다. 따라서 n % 2를 사용합니다. 이렇게 하면 n의 2진수 표현을 역순으로 배열 a에 저장하고, 출력할 때 반대로 출력하여 올바른 2진수 값인 "00001010"을 얻을 수 있습니다.

<답>

빈칸1: i<8
빈칸2: n%2

 

 

2020년 4회 6번 문제

6. 다음은 자바 소스 코드이다. 출력 결과를 보고, (1), (2)에 알맞은 값을 적으시오.

[출력 결과]

1 4 7 10 13
2 5 8 11 14
3 6 9 12 15
3 6 9 12 15
public class Soojebi {
    public static void main(String[] args) {
        int[][] a = new int[빈칸1][빈칸2];
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                a[i][j] = j * 3 + (i + 1); 
                System.out.print(a[i][j] + " "); 
            }
            System.out.println();
        }
    }
}
public class Soojebi {
    public static void main(String[] args) {
        int[][] a = new int[3][5]; // 3x5 행렬을 생성합니다.
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 5; j++) {
                a[i][j] = j * 3 + (i + 1);
                System.out.print(a[i][j] + " "); 
            }
            System.out.println();
        }
    }
}

주어진 출력 결과를 보면 3x5 행렬을 형성하고 있습니다.

따라서 (1)에 들어갈 값은 행의 개수를 나타내고, (2)에 들어갈 값은 열의 개수를 나타내어야 합니다.

(1)은 행의 개수이므로 3이 들어가고, (2)는 열의 개수이므로 5가 들어갑니다.

<답>

빈칸1: 3
빈칸2: 5
 

2020년 4회 9번 문제

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

lol = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
print(lol[0])
print(lol[2][1])
for sub in lol: // lol에서 행의 개수만큼 반복한다.
   for item in sub: // sub 안에 있는 요소만큼 반복한다.
      print(item, end=' ') // sub 안의 요소들이 item이고, 안쪽 반복문이 반복될 때마다 하나씩 출력한다.
   print() // 행에 있는 값들을 모두 출력하고 Enter!

 

주어진 코드는 Python에서 2차원 리스트(lol)를 사용하여 요소를 출력하는 문제입니다.

  1. lol이라는 2차원 리스트를 정의합니다.
  2. lol[0]을 출력하면 첫 번째 리스트 [1, 2, 3]가 출력됩니다.
  3. lol[2][1]을 출력하면 세 번째 리스트의 두 번째 요소인 7이 출력됩니다.
  4. 두 개의 for 루프를 사용하여 lol 리스트를 순회합니다.
  • 외부 루프(for sub in lol)는 lol 리스트 안의 각 서브 리스트(sub-list)를 순회합니다.
  • 내부 루프(for item in sub)는 각 서브 리스트 내부의 항목(item)을 순회합니다.
  • print(item, end=' ')를 통해 항목을 출력하고, end=' '는 개행 없이 연속해서 작성하라는 지시입니다. (Enter 하지마!!!!!!!!!!)
  • 내부 루프가 끝날 때마다 print()를 호출하여 줄바꿈을 수행합니다.

따라서 위 코드의 실행 결과는

[1, 2, 3]
7
123
45
6789

2차원 리스트의 각 요소를 순회하고 출력하는 방법을 보여주는 문제입니다.

(Python에서 print는 자동으로 Enter)

 

2020년 4회 18번 문제

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

#include <stdio.h>

void main() {
    char *p="KOREA" ;
    printf("%s\n", p);
    printf("%s\n", p+3);
    printf("%c\n", *p);
    printf("%c\n", *(p+3));
    printf("%c\n", *p+2);
}
  1. char *p="KOREA"; : 포인터 변수 p를 선언하고 문자열 "KOREA"의 시작 주소를 가리키도록 초기화합니다.
  2. p와 해당 주소에 저장된 문자열 "KOREA"를 아래와 같이 표현할 수 있습니다.
 p  K  O  R  E  A
 10 10 11 12 13 14
 

포인터 p는 시작 지점인 10번지를 가리키고 있습니다.

  1. printf("%s\n", p); : 포인터 p가 가리키는 주소(10번지)에서부터 시작하여 문자열의 끝까지 출력합니다. 따라서 "KOREA"가 출력됩니다.
  2. printf("%s\n", p+3); : 포인터 p에 3을 더한 위치부터 시작하여 문자열의 끝까지 출력합니다. 따라서 p+3은 13번지부터 시작하여 "EA"가 출력됩니다.
  3. printf("%c\n", *p); : 포인터 p가 가리키는 주소에 있는 값을 하나의 문자로 해석하여 출력합니다. *p는 10번지의 값인 'K'를 출력합니다.
  4. printf("%c\n", *(p+3)); : 연산자 우선순위에 의해 포인터 p에 3을 더한 위치의 값을 하나의 문자로 해석하여 출력합니다. *(p+3)은 13번지의 값인 'E'를 출력합니다.
  5. printf("%c\n", *p+2); : 포인터 p가 가리키는 값 'K'에 2를 더한 값을 하나의 문자로 해석하여 출력합니다. 즉 ASCII 코드를 출력하게 되어 'K' 다음에 오는 알파벳 'L' 다음에 'M'이 출력됩니다.

<출력>

KOREA
EA
K
E
M

참고: 위의 코드에서 사용된 포맷 지정자와 그 의미

  • %s : 문자열을 출력하라는 포맷 지정자로, 주소값을 받고 해당 주소에서부터 문자열의 끝까지 출력합니다.
  • %c : 문자 하나를 출력하라는 포맷 지정자로, 주소에 있는 값을 하나의 문자로 해석하여 출력합니다.

2020년 4회 19번 문제

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

class Parent {
    public int compute(int num) {  // compute 메서드
        if (num <= 1)
            return num;
        return compute(num - 1) + compute(num - 2);
    }
}

class Child extends Parent {
    public int compute(int num) {  // 여기도 compute 메서드
        if (num <= 1)
            return num;
        return compute(num - 1) + compute(num - 3);
    }
}

public class Soojebi {
    public static void main(String[] args) {
        Parent obj = new Child();
        System.out.print(obj.compute(4));
    }
}

 

이 코드에서 Child 클래스는 Parent 클래스를 상속받고 있으며, 두 개의 메서드(compute)가 존재하며, 메서드 시그니처가 int num으로 동일한 형태를 갖고 있습니다. 이것을 메서드 오버라이딩이라고 합니다.

main 메서드에서 Parent obj = new Child();로 객체를 생성하고 있지만, 이것은 아버지 클래스인 Parent의 자식 클래스인 Child에서 재정의한 compute 메서드가 호출되는 상황입니다. 즉, 아버지 클래스로 생성한 객체 obj는 아버지가 가지고 있는 메서드만 사용 가능한 줄 알겠지만, 현재 코드에서는 자식 클래스에서 compute 메서드를 재정의하여 자식이 재정의한 메서드가 호출됩니다. 따라서 System.out.print(obj.compute(4));에서 4라는 값을 전달하면 실제로는 자식 클래스인 Child의 compute 메서드가 실행되게 됩니다.

주어진 compute 메서드를 살펴보면 다음과 같은 재귀적인 구조를 가지고 있습니다.

public int compute(int num) {
    if (num <= 1)
        return num;
    return compute(num - 1) + compute(num - 3);
}

여기서 compute 메서드는 입력값 num이 1 이하일 때에는 그대로 num을 반환하며, 그렇지 않을 경우 compute(num - 1)compute(num - 3)의 결과를 합하여 반환합니다.

obj.compute(4)를 계산해보면 다음과 같습니다.

  1. compute(4)를 호출하면, num에 4가 전달됩니다.
  2. 먼저 compute(4)compute(num-1) + compute(num-3) = compute(3) + compute(1)로 계산됩니다.
  3. compute(3)은 num(3)<=1가 False이기 때문에 compute(2) + compute(0)으로 계산됩니다.
  4. compute(2)num(2)<=1가 False이기 때문에 compute(1) + compute(-1)로 계산됩니다.
  5. compute(1)은 1을 반환하고, compute(-1)은 -1을 반환합니다. 따라서 compute(2)는 1 + (-1)로 0을 반환합니다.
  6. 이와 같은 방식으로 compute(3) = compute(2) + compute(0) = 0 + 1로 1을 반환합니다.
  7. 다시 compute(4) = compute(3) + compute(1) = 1 + 0 = 1을 반환합니다.

<출력>

1
728x90
반응형
LIST