일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 리눅스
- IT
- 리눅스자격증
- IT자격증
- 장고
- 리눅스명령어
- python
- 자격증
- 정처기기출
- 정보처리기사
- 리눅스활용
- 프로그래밍
- 공부블로그
- 정처기실기
- 정처기
- 웹개발
- 파이썬
- 기사자격증
- 정보처리기사실기
- 코딩
- 머신러닝
- 리눅스마스터
- SW
- 리눅스마스터2급2차
- Django
- 정보처리기사기출
- Linux
- Java
- C
- 리눅스마스터2급
- Today
- Total
Tech Trail
[정보처리기사 실기] 2022년 3회 기출 코드 해설 (C언어, Java, Python) 본문
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;
}
이 코드는 "지뢰찾기"와 같은 게임에서 지뢰 주변에 있는 지뢰의 수를 계산하는 프로그램입니다.
- 먼저, calc 함수가 정의되어 있습니다. 이 함수는 w와 h가라는 네 개의 정수 매개변수를 받습니다. 이 함수는 주어진 좌표 (j, i)가 유효한 좌표인 경우 1을 반환하고, 그렇지 않으면 0을 반환합니다. 유효한 좌표는 i가 0보다 크고 h보다 작으며, j가 0보다 크거나 같고 w보다 작은 경우입니다.
- main 함수에서 field 배열과 mines 배열을 정의합니다. field 배열은 게임 판을 나타내며 0은 지뢰가 없음을, 1은 지뢰가 있음을 나타냅니다. mines 배열은 각 칸 주변에 있는 지뢰의 수를 저장할 배열입니다. w와 h는 게임 판의 너비와 높이를 나타냅니다.
- 중첩된 루프를 사용하여 field 배열을 순회합니다. 각 칸이 1인 경우, 즉 지뢰가 있는 경우, 그 주변의 칸에 대해 calc 함수를 호출하여 유효한 좌표인 경우 mines 배열의 해당 위치에 1을 더합니다. 이렇게 하면 해당 칸 주변에 지뢰가 있는 개수를 계산할 수 있습니다.
- 마지막으로, 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이 되면 j의 for 루프가 종료됩니다.
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이 되면, j의 for 루프가 종료됩니다.
11. 이어서 i=1, i<=1, j=0일 때 calc(4,4,0,1) 함수를 호출하면, 결과는 True이므로 mines[0][1]에 1이 추가됩니다.
여기서 잠깐 ~
calc 함수를 잘 보면 0 <= i < 4와 0 <= 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]);
}
}
}
- int[] result = new int[5];: 길이가 5인 정수 배열 result를 생성합니다. 이 배열은 arr 배열의 각 요소가 몇 번째로 작은지를 저장할 용도로 사용됩니다.
- int[] arr = {79, 34, 10, 99, 50};: 길이가 5인 정수 배열 arr를 생성하고 초기화합니다.
- 다음 부분은 중첩된 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을 더하는 작업을 수행하고, 그 결과를 다시 리스트로 만들어 출력하는 코드입니다.
- map 함수는 주어진 리스트 l의 각 원소에 함수를 적용하는데, 여기서는 람다 함수 lambda num: num + 100를 사용합니다. 이 함수는 각 원소 num에 100을 더합니다.
- map 함수의 결과는 이를 리스트로 변환하여 변수 l에 저장됩니다. 따라서 리스트 l에 있는 각 원소에 100이 더해진 새로운 리스트가 생성됩니다.
- 마지막으로 새로운 리스트인 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;
}
- int i, j, k, s;: 정수형 변수 i, j, k, s를 선언합니다.
- int el = 0;: el이라는 정수형 변수를 선언하고 0으로 초기화합니다. 이 변수는 완전수의 개수를 추적하기 위해 사용됩니다.
- for (i = 6; i <= 30; i++): i를 6부터 30까지 반복하면서 각 숫자를 검사합니다. 완전수는 일반적으로 큰 수가 아니기 때문에 6부터 30까지 검사합니다.
- s = 0;: s 변수를 0으로 초기화합니다. s 변수는 현재 숫자 i의 약수의 합을 나타냅니다.
- k = i / 2;: 현재 숫자 i의 약수를 찾을 때, i의 절반보다 큰 숫자는 약수가 될 수 없기 때문에 k를 i의 절반으로 설정합니다.
- for (j = 1; j <= k; j++): j를 1부터 k까지 반복하면서 i의 약수를 검사합니다.
- if (i % j == 0): i를 j로 나눈 나머지가 0인 경우, 즉 j가 i의 약수인 경우를 확인합니다.
- s = s + j;: j를 s에 더하여 현재까지의 약수 합을 업데이트합니다.
- if (s == i): s가 현재 숫자 i와 같으면, i는 완전수입니다. 따라서 el 변수를 증가시킵니다.
- printf("%d", el);: 완전수의 개수인 el을 출력합니다.
따라서 주어진 코드는 6부터 30까지의 숫자 중에서 완전수의 개수를 찾고, 결과로 2를 출력합니다. 6과 28이 6부터 30까지의 완전수 중 두 개이기 때문에 결과로 2가 출력됩니다.
2
<참고>
1. i가 6이므로 i <= 30은 True입니다.
- s는 0이고, k는 i의 절반인 3입니다.
- j는 1부터 3까지 반복하며 각각의 경우를 검사합니다.
- j가 1일 때, i % j == 0는 True이므로 s에 j 값을 더해 s는 1이 됩니다.
- j가 2일 때, i % j == 0는 True이므로 s에 j 값을 더해 s는 3이 됩니다.
- j가 3일 때, i % j == 0는 True이므로 s에 j 값을 더해 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이고, k는 i의 절반인 3입니다.
- j는 1부터 3까지 반복하며 각각의 경우를 검사합니다.
- j가 1일 때, i % j == 0는 True이므로 s에 j 값을 더해 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입니다.
- 위와 같은 방식으로 s와 k를 초기화하고 j를 반복합니다.
- j가 1일 때, i % j == 0는 True이므로 s에 j 값을 더해 s는 1이 됩니다.
- j가 2일 때, i % j == 0는 True이므로 s에 j 값을 더해 s는 3이 됩니다.
- j가 3일 때, i % j == 0는 True이므로 s에 j 값을 더해 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에 할당합니다. 이렇게 하면 intArr은 MakeArray 함수가 생성한 배열을 가리키게 됩니다.
- 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 실전 모의고사 기출 문제를 직접 풀고 정리한 것입니다.
틀린 부분이 있다면 언제든 댓글 남겨주세요 :)
'Learning > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] 2022년 3회 기출 : 브로드캐스트 주소 계산 문제 해설 (0) | 2023.11.16 |
---|---|
[정보처리기사 실기] 2023년 1회 기출 코드 해설 (C언어, Java, Python) (0) | 2023.11.16 |
[정보처리기사 실기] 2022년 2회 기출 코드 해설 (C언어, Java, Python) (2) | 2023.11.16 |
[정보처리기사 실기] 2022년 1회 기출 코드 해설 (C언어, Java, Python) (2) | 2023.11.16 |
[정보처리기사 실기] 2021년 3회 기출 코드 해설 (C언어, Java, Python) (0) | 2023.11.16 |