Tech Trail

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

Learning/정보처리기사

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

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

2022년 3회 1번 문제

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

#include <stdio.h>

int calc(int w, int h, int j, int i) {
    if (i > 0 && i < h && j >= 0 && j < w)
        return 1;
    return 0;
}

int main() {
    int field[4][4] = {{0, 1, 0, 1}, {0, 0, 0, 1}, {1, 1, 1, 0}, {0, 1, 1, 1}};
    int mines[4][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
    int w = 4, h = 4;
    int i, j, k, l;

    for (l = 0; l < h; l++) {
        for (k = 0; k < w; k++) {
            if (field[l][k] == 0)
                continue;

            for (i = l - 1; i <= l + 1; i++) {
                for (j = k - 1; j <= k + 1; j++) {
                    if (calc(w, h, j, i) == 1) {
                        mines[i][j] += 1;
                    }
                }
            }
        }
    }

    for (l = 0; l < h; l++) {
        for (k = 0; k < w; k++) {
            printf("%d ", mines[l][k]);
        }
        printf("\n");
    }

    return 0;
}

이 코드는 "지뢰찾기"와 같은 게임에서 지뢰 주변에 있는 지뢰의 수를 계산하는 프로그램입니다.

  1. 먼저, calc 함수가 정의되어 있습니다. 이 함수는 wh가라는 네 개의 정수 매개변수를 받습니다. 이 함수는 주어진 좌표 (j, i)가 유효한 좌표인 경우 1을 반환하고, 그렇지 않으면 0을 반환합니다. 유효한 좌표는 i가 0보다 크고 h보다 작으며, j가 0보다 크거나 같고 w보다 작은 경우입니다.
  2. main 함수에서 field 배열과 mines 배열을 정의합니다. field 배열은 게임 판을 나타내며 0은 지뢰가 없음을, 1은 지뢰가 있음을 나타냅니다. mines 배열은 각 칸 주변에 있는 지뢰의 수를 저장할 배열입니다. wh는 게임 판의 너비와 높이를 나타냅니다.
  3. 중첩된 루프를 사용하여 field 배열을 순회합니다. 각 칸이 1인 경우, 즉 지뢰가 있는 경우, 그 주변의 칸에 대해 calc 함수를 호출하여 유효한 좌표인 경우 mines 배열의 해당 위치에 1을 더합니다. 이렇게 하면 해당 칸 주변에 지뢰가 있는 개수를 계산할 수 있습니다.
  4. 마지막으로, mines 배열을 순회하면서 주변 지뢰의 수를 출력합니다. 각 행마다 배열 요소를 출력하고, 행이 끝날 때마다 새 줄로 이동합니다.

따라서 코드의 출력은 각 칸 주변에 있는 지뢰의 수를 나타냅니다.

예를 들어, 첫 번째 행에서 첫 번째 칸 주변에는 1개의 지뢰가 있고, 두 번째 칸 주변에는 1개의 지뢰가 있으며, 세 번째 칸 주변에는 3개의 지뢰가 있고, 네 번째 칸 주변에는 2개의 지뢰가 있다는 것을 나타냅니다. 이와 같은 방식으로 나머지 칸 주변의 지뢰 수도 계산되어 출력됩니다.

1 1 3 2
3 4 5 3
3 5 6 4
3 5 5 3

 

<참고>

1. l=0, k=0일 때, field[0][0]=0이므로 가장 가까운 상위 for 루프로 이동합니다.

2. l=0, k=1일 때, field[0][1]=1이므로 다음 for 루프로 진행합니다.

3. i=l-1=0-1=-1, i<=l+1=0+1=1, j=k-1=1-1=0, j<=k+1=1+1=2 조건을 평가합니다.

  • calc(4,4,0,-1) 함수를 호출하면, i>=0에서 -1>=0이 False이므로 0이 반환됩니다.
  • 결과적으로 calc(4,4,0,-1)은 False입니다.

4. j=1이 되어 j<=2 조건을 확인합니다.

  • calc(4,4,1,-1) 함수를 호출하면, i>=0에서 False이므로 0이 반환됩니다.
  • 결과적으로 calc(4,4,1,-1)은 False입니다.

5. j=2가 되어 j<=2 조건을 확인합니다.

  • calc(4,4,2,-1) 함수를 호출하면, i>=0에서 False이므로 0이 반환됩니다.
  • 결과적으로 calc(4,4,2,-1)은 False입니다.

6. j=3이 되면 jfor 루프가 종료됩니다.

7. 다시 i=0, i<=1, j=0, j<=2 조건을 검사합니다.

  • calc(4,4,0,0) 함수를 호출하면, i>=0, i<h, j<=0, j<w 모두 True이므로 1을 반환합니다.
  • 따라서 calc(4,4,0,0)은 True입니다.
  • 이로 인해 mines[0][0]의 값이 1 증가하게 되고, mines[0][0]은 이제 1입니다.

8. 다음 위치인 i=0, j=1에서 calc(4,4,1,0) 함수를 호출하면, 결과는 True이므로 mines[0][1]에 1이 추가됩니다.

9. 그리고 i=0, j=2일 때 calc(4,4,2,0) 함수를 호출하면, 결과는 True이므로 mines[0][2]에 1이 추가됩니다.

10. j=3이 되면, jfor 루프가 종료됩니다.

11. 이어서 i=1, i<=1, j=0일 때 calc(4,4,0,1) 함수를 호출하면, 결과는 True이므로 mines[0][1]에 1이 추가됩니다.

여기서 잠깐 ~

calc 함수를 잘 보면 0 <= i < 40 <= j < 4 조건을 모두 만족하는 경우에만 1을 반환합니다.

그렇게 조금만 더 힘을 내면,

mines
[0][0]
[0][1]
[0][2]
[0][3]
[0]
1
1
1
0
[1]
1
1
1
0
[2]
0
0
0
0
[3]
0
0
0
0

mines 배열의 여섯 개의 위치에 있는 값을 1로 바꾸게 되었습니다.

지금 우리가 filed[0][1]이 False라는 조건으로 인해 for 루프를 열심히 실행했잖아요?

field
[0][0]
[0][1]
[0][2]
[0][3]
[0]
0
1
0
1
[1]
0
0
0
1
[2]
1
1
1
0
[3]
0
1
1
1

지금처럼 field[0][1]이 1로 표시된 경우, mines 배열에서 해당 위치와 주변의 값을 1씩 증가시켜서 지뢰 주변에 있는 지뢰의 수를 나타냅니다. 이렇게 주위의 셀에 지뢰가 몇 개 있는지를 계산하는 문제였습니다.

 

2022년 3회 4번 문제

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

class Soojebi {
    public static void main(String[] args) {
        int[] result = new int[5];
        int[] arr = {79, 34, 10, 99, 50};
        
        for (int i = 0; i < 5; i++) {
            result[i] = 1;
            for (int j = 0; j < 5; j++) {
                if (arr[i] < arr[j]) {
                    result[i]++;
                }
            }
        }
        
        for (int k = 0; k < 5; k++) {
            System.out.print(result[k]); 
        }
    }
}
  1. int[] result = new int[5];: 길이가 5인 정수 배열 result를 생성합니다. 이 배열은 arr 배열의 각 요소가 몇 번째로 작은지를 저장할 용도로 사용됩니다.
  2. int[] arr = {79, 34, 10, 99, 50};: 길이가 5인 정수 배열 arr를 생성하고 초기화합니다.
  3. 다음 부분은 중첩된 for 루프를 사용하여 각 arr 요소가 몇 번째로 작은지 계산합니다. 첫 번째 for 루프에서 i는 0부터 4까지 변화하며, 두 번째 for 루프에서 j는 0부터 4까지 변화합니다.
  • result[i] = 1;: 먼저 result[i]를 1로 초기화합니다.
  • 그 다음, arr[i]arr[j]를 비교합니다. 만약 arr[i]arr[j]보다 작으면 result[i]를 1 증가시킵니다. 이렇게 함으로써 arr[i]가 몇 번째로 작은지를 나타내는 값을 계산합니다.

4. 마지막으로, for (int k = 0; k < 5; k++) 루프를 사용하여 result 배열의 값을 출력합니다.

  • System.out.print(result[k]);result 배열의 각 요소를 출력합니다.

5. 따라서 각 arr 요소가 몇 번째로 작은지를 계산한 결과는 다음과 같습니다.

  • 79은 2번째로 작음.
  • 34은 4번째로 작음.
  • 10은 5번째로 작음.
  • 99는 1번째로 작음.
  • 50은 3번째로 작음.

따라서 출력 결과는 이를 나타내는 "24513"이 됩니다.

24513

<참고>

1. i에 0을 대입하고, i < 5가 True이므로 result[0]에 1을 대입합니다.

2. 내부 루프에서 j를 0부터 4까지 반복합니다.

  • j가 0일 때, ary[0] < ary[0]은 False이므로 다음 루프로 이동합니다.
  • j가 1일 때, ary[0] < ary[1]은 False이므로 다음 루프로 이동합니다.
  • j가 2일 때, ary[0] < ary[2]는 False이므로 다음 루프로 이동합니다.
  • j가 3일 때, ary[0] < ary[3]은 True이므로 result[0]을 1 증가시켜 2가 됩니다.
  • j가 4일 때, ary[0] < ary[4]는 False이므로 다음 루프로 이동합니다.

3. 내부 루프를 마치고, i를 1로 증가시킵니다.

4. 다시 내부 루프에서 j를 0부터 4까지 반복합니다.

  • j가 0일 때, ary[1] < ary[0]은 True이므로 result[1]을 1 증가시켜 2가 됩니다.
  • j가 1일 때, ary[1] < ary[1]은 False이므로 다음 루프로 이동합니다.
  • j가 2일 때, ary[1] < ary[2]는 False이므로 다음 루프로 이동합니다.
  • j가 3일 때, ary[1] < ary[3]은 True이므로 result[1]을 1 증가시켜 3이 됩니다.
  • j가 4일 때, ary[1] < ary[4]은 True이므로 result[1]을 1 증가시켜 4가 됩니다.

5. 내부 루프를 마치고, i를 2로 증가시킵니다.

6. 다시 내부 루프에서 j를 0부터 4까지 반복합니다.

  • j가 0일 때, ary[2] < ary[0]은 True이므로 result[1]을 1 증가시켜 2가 됩니다.
  • j가 1일 때, ary[2] < ary[1]은 True이므로 result[1]을 1 증가시켜 3이 됩니다.
  • j가 2일 때, ary[2] < ary[2]는 False이므로 다음 루프로 이동합니다.
  • j가 3일 때, ary[2] < ary[3]은 True이므로 result[1]을 1 증가시켜 4가 됩니다.
  • j가 4일 때, ary[2] < ary[4]은 True이므로 result[1]을 1 증가시켜 5가 됩니다.

7. 내부 루프를 마치고, i를 2로 증가시킵니다.

8. 다시 내부 루프에서 j를 0부터 4까지 반복합니다.

  • j가 0일 때, ary[3] < ary[0]은 False이므로 다음 루프로 이동합니다.
  • j가 1일 때, ary[3] < ary[1]은 False이므로 다음 루프로 이동합니다.
  • j가 2일 때, ary[3] < ary[2]는 False이므로 다음 루프로 이동합니다.
  • j가 3일 때, ary[3] < ary[3]은 False이므로 다음 루프로 이동합니다.
  • j가 4일 때, ary[3] < ary[4]는 False이므로 다음 루프로 이동합니다. result[0]은 그대로 1입니다.

9. 내부 루프를 마치고, i를 2로 증가시킵니다.

10. 다시 내부 루프에서 j를 0부터 4까지 반복합니다.

  • j가 0일 때, ary[4] < ary[0]은 True이므로 result[1]을 1 증가시켜 2가 됩니다.
  • j가 1일 때, ary[4] < ary[1]은 False이므로 다음 루프로 이동합니다.
  • j가 2일 때, ary[4] < ary[2]는 False이므로 다음 루프로 이동합니다.
  • j가 3일 때, ary[4] < ary[3]은 True이므로 result[1]을 1 증가시켜 3이 됩니다.
  • j가 4일 때, ary[4] < ary[4]은 False이므로 다음 루프로 이동합니다.

이제 result 배열의 각 요소는 각각의 인덱스에 해당하는 원소가 몇 번째로 작은지를 나타내는 값들로 초기화되었습니다. 이를 출력하면 "24513"이 됩니다.

 

2022년 3회 9번 문제

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

l = [1, 2, 3, 4, 5]
l = list(map(lambda num: num + 100, l))
print(l)

리스트 l에 있는 각 원소에 100을 더하는 작업을 수행하고, 그 결과를 다시 리스트로 만들어 출력하는 코드입니다.

  1. map 함수는 주어진 리스트 l의 각 원소에 함수를 적용하는데, 여기서는 람다 함수 lambda num: num + 100를 사용합니다. 이 함수는 각 원소 num에 100을 더합니다.
  2. map 함수의 결과는 이를 리스트로 변환하여 변수 l에 저장됩니다. 따라서 리스트 l에 있는 각 원소에 100이 더해진 새로운 리스트가 생성됩니다.
  3. 마지막으로 새로운 리스트인 l을 출력하면, 각 원소에 100이 더해진 결과가 출력됩니다.

따라서 출력 결과는 [101, 102, 103, 104, 105]가 됩니다.

[101, 102, 103, 104, 105]

 

 

2022년 3회 13번 문제

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

#include <stdio.h>

int main() {
    int i, j, k, s;
    int el = 0;

    for (i = 6; i <= 30; i++) {
        s = 0;
        k = i / 2;
        for (j = 1; j <= k; j++) {
            if (i % j == 0) {
                s = s + j;
            }
        }
        if (s == i) {
            el++;
        }
    }

    printf("%d", el);
    return 0;
}
  1. int i, j, k, s;: 정수형 변수 i, j, k, s를 선언합니다.
  2. int el = 0;: el이라는 정수형 변수를 선언하고 0으로 초기화합니다. 이 변수는 완전수의 개수를 추적하기 위해 사용됩니다.
  3. for (i = 6; i <= 30; i++): i를 6부터 30까지 반복하면서 각 숫자를 검사합니다. 완전수는 일반적으로 큰 수가 아니기 때문에 6부터 30까지 검사합니다.
  4. s = 0;: s 변수를 0으로 초기화합니다. s 변수는 현재 숫자 i의 약수의 합을 나타냅니다.
  5. k = i / 2;: 현재 숫자 i의 약수를 찾을 때, i의 절반보다 큰 숫자는 약수가 될 수 없기 때문에 ki의 절반으로 설정합니다.
  6. for (j = 1; j <= k; j++): j를 1부터 k까지 반복하면서 i의 약수를 검사합니다.
  7. if (i % j == 0): ij로 나눈 나머지가 0인 경우, 즉 ji의 약수인 경우를 확인합니다.
  8. s = s + j;: js에 더하여 현재까지의 약수 합을 업데이트합니다.
  9. if (s == i): s가 현재 숫자 i와 같으면, i는 완전수입니다. 따라서 el 변수를 증가시킵니다.
  10. printf("%d", el);: 완전수의 개수인 el을 출력합니다.

따라서 주어진 코드는 6부터 30까지의 숫자 중에서 완전수의 개수를 찾고, 결과로 2를 출력합니다. 6과 28이 6부터 30까지의 완전수 중 두 개이기 때문에 결과로 2가 출력됩니다.

2

<참고>

1. i가 6이므로 i <= 30은 True입니다.

  • s는 0이고, ki의 절반인 3입니다.
  • j는 1부터 3까지 반복하며 각각의 경우를 검사합니다.
  • j가 1일 때, i % j == 0는 True이므로 sj 값을 더해 s는 1이 됩니다.
  • j가 2일 때, i % j == 0는 True이므로 sj 값을 더해 s는 3이 됩니다.
  • j가 3일 때, i % j == 0는 True이므로 sj 값을 더해 s는 6이 됩니다.
  • j가 4가 되면 j for 루프를 빠져나옵니다.
  • 마지막으로 s == i에서 6 == 6이므로 True입니다. 따라서 el을 1 증가시켜 el은 1이 됩니다.

2. i가 7로 증가합니다.

  • i가 7이므로 i <= 30은 True입니다.
  • s는 0이고, ki의 절반인 3입니다.
  • j는 1부터 3까지 반복하며 각각의 경우를 검사합니다.
  • j가 1일 때, i % j == 0는 True이므로 sj 값을 더해 s는 1이 됩니다.
  • j가 2일 때, i % j == 0는 False이므로 다음 루프로 이동합니다.
  • j가 3일 때, i % j == 0는 False이므로 다음 루프로 이동합니다.
  • j가 4가 되면 j for 루프를 빠져나옵니다.
  • 마지막으로 s == i에서 1 == 7이므로 False입니다. 따라서 el은 그대로 1입니다.

3. i가 8로 증가합니다.

  • i가 8이므로 i <= 30은 True입니다.
  • 위와 같은 방식으로 sk를 초기화하고 j를 반복합니다.
  • j가 1일 때, i % j == 0는 True이므로 sj 값을 더해 s는 1이 됩니다.
  • j가 2일 때, i % j == 0는 True이므로 sj 값을 더해 s는 3이 됩니다.
  • j가 3일 때, i % j == 0는 True이므로 sj 값을 더해 s는 6이 됩니다.
  • j가 4가 되면 j for 루프를 빠져나옵니다.
  • 마지막으로 s == i에서 6 == 8이므로 False입니다. 따라서 el은 여전히 1입니다.

이러한 과정을 반복하여 6부터 30까지의 수 중에서 완전수인 경우를 찾아 el을 증가시키고, 마지막으로 el을 출력합니다.

 

2022년 3회 19번 문제

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

public class Soojebi {
    static int[] MakeArray() {
        int[] tempArr = new int[4];
        for (int i = 0; i < tempArr.length; i++) {
            tempArr[i] = i;
        }
        return tempArr;
    }

    public static void main(String[] args) {
        int[] intArr;
        intArr = MakeArray();

        for (int i = 0; i < intArr.length; i++) {
            System.out.print(intArr[i]);
        }
    }
}

1. MakeArray 함수:

  • MakeArray 함수는 int 타입의 배열을 반환하는 정적 메서드입니다.
  • 먼저 int 타입의 배열 tempArr을 길이가 4인 배열로 생성합니다.
  • for 루프를 사용하여 배열 tempArr의 각 요소를 인덱스 i의 값으로 초기화합니다. 즉, 0부터 3까지의 값을 각각 배열 요소에 할당합니다.
  • 마지막으로 초기화된 배열 tempArr을 반환합니다.

2. main 함수:

  • int 타입의 배열 intArr을 선언합니다.
  • MakeArray 함수를 호출하여 반환된 배열을 intArr에 할당합니다. 이렇게 하면 intArrMakeArray 함수가 생성한 배열을 가리키게 됩니다.
  • for 루프를 사용하여 배열 intArr의 각 요소를 순회하며 출력합니다.

따라서 main 함수에서는 MakeArray 함수를 호출하여 생성된 배열을 받고, 해당 배열의 요소를 출력하므로 출력 결과로 "0 1 2 3"이 나타납니다.

0123

 

2022년 3회 20번 문제

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

public class Soojebi {
    public static void main(String[] args) {
        int a = 0;
        for (int i = 1; i < 999; i++) {
            if (i % 3 == 0 && i % 2 != 0)
                a = i;
        }
        System.out.print(a);
    }
}

주어진 문제에서는 i 값을 3으로 나눴을 때 나머지가 0이고, 동시에 2로 나눴을 때 나머지가 0이 아닌 경우에 해당하는 가장 큰 숫자 i를 찾아서 변수 a에 저장합니다.

이때, 범위가 너무 크기 때문에 i를 역순으로 검사하여 조건을 만족하는 가장 큰 i 값을 찾아보겠습니다. i를 1부터 998까지 돌릴 수는 없잖아...

1. i가 998일 때

  • i % 3 == 0 조건에서 i를 3으로 나누면 몫이 332이고 나머지가 2이므로 False.
  • i % 2 != 0 조건에서 i를 2로 나누면 나머지가 0이므로 False.
  • 따라서 i가 998일 때는 어떤 조건도 충족하지 않으므로 a에는 아무런 값도 저장되지 않음.

2. i가 997일 때

  • i % 3 == 0 조건에서 i를 3으로 나누면 몫이 332이고 나머지가 1이므로 False.
  • i % 2 != 0 조건에서 i를 2로 나누면 나머지가 1이므로 True.
  • 따라서 i가 997일 때는 두 번째 조건을 만족하므로 a에 997이 저장됨.

3. i가 996일 때

  • i % 3 == 0 조건에서 i를 3으로 나누면 몫이 332이고 나머지가 0이므로 True.
  • i % 2 != 0 조건에서 i를 2로 나누면 나머지가 0이므로 False.
  • 따라서 i가 996일 때는 첫 번째 조건을 만족하고 두 번째 조건을 만족하지 않으므로 a에는 아무런 값도 저장되지 않음.

4. i가 995일 때

  • i % 3 == 0 조건에서 i를 3으로 나누면 몫이 331이고 나머지가 2이므로 False.
  • i % 2 != 0 조건에서 i를 2로 나누면 나머지가 1이므로 True.
  • 따라서 i가 995일 때는 두 번째 조건을 만족하므로 a에 995가 저장됨.

5. i가 994일 때

  • i % 3 == 0 조건에서 i를 3으로 나누면 몫이 331이고 나머지가 1이므로 False.
  • i % 2 != 0 조건에서 i를 2로 나누면 나머지가 0이므로 False.
  • 따라서 i가 994일 때는 어떤 조건도 충족하지 않으므로 a에는 아무런 값도 저장되지 않음.

6. i가 993일 때

  • i % 3 == 0 조건에서 i를 3으로 나누면 몫이 331이고 나머지가 0이므로 True.
  • i % 2 != 0 조건에서 i를 2로 나누면 나머지가 1이므로 True.
  • 따라서 i가 993일 때는 두 번째 조건도 만족하므로 a에 993이 저장됨.

993이 가장 큰 조건을 만족하는 i 값이며, a에 저장되고 출력됩니다.

993

 

 

 

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

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

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

728x90
반응형
LIST