🍉 2022년 1회 14번
출력 결과
// 입력값이 5일 때 출력값
#include <stdio.h>
int fn(int a) {
if(a <= 1) return 1;
return a * fn(a - 1);
}
void main() {
int a;
scanf("%d", &a); // 5 입력
printf("%d", fn(a));
}
답 : 120
fn() 메서드의 반환값에서 동일한 메서드를 호출한다.
무한 루프에 빠지지 않고 매개 변수 a의 값이 1보다 작거나 같을 때 fn() 메서드를 호출하지 않고 1을 반환한다.
이를 풀어보면 5 * 4 * 3 * 2 * 1 = 120이다.
🍉 2022년 1회 15번
빈 칸
// 밑줄 친 곳의 연산자를 이용하여 정수를 역순으로 출력하는 프로그램이다.
#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);
}
① >
② %
③ /
number의 값인 1234를 역순인 4321로 출력하는 코드이다.
이를 위해선 아래와 같은 일련의 과정을 반복한다.
1. result의 현재 값에 10배 연산을 해준다.
2. result의 값에 number의 값을 10으로 나눴을 때의 나머지 값을 더해준다.
3. number의 값에서 1의 자리의 값을 버릴 수 있도록 10으로 나눠준다.
🍉 2022년 2회 8번
출력 결과
#include <stdio.h>
struct student {
int n, g;
};
int main() {
struct student st[2];
int i = 0;
for(i;i < 2;i++) {
st[i].n = i;
st[i].g = i + 1;
}
printf("%d", st[0].n + st[1].g);
return 0;
}
답 : 2
🍉 2022년 2회 15번
출력 결과
#include <stdio.h>
int len(char* p);
int main() {
char *p1 = "2022";
char *p2 = "202207";
printf("%d", len(p1) + len(p2));
return 0;
}
int len(char* p) {
int r = 0;
while(*p != '\0') {
p++;
r++;
}
return r;
}
답 : 10
len() 함수는 *p의 길이를 구하는 함수이다.
'\0'은 문자열의 끝을 의미하므로, while문에서 *[p가 가리키는 주소의 실제 값에서 문자가 없을 때까지 반복한다.
반복한 횟수가 곧 해당 포인터 변수의 길이가 된다.
따라서 len(p1) + len(p2) = 4 + 6 = 10
🍉 2022년 3회 1번
출력 결과
#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 filed[4][4] = {{0, 1, 0, 1}, {0, 0, 0, 0}, {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 1 3 2
3 4 5 3
3 5 6 4
3 5 5 3
그냥 보면 어려워 보이지만, 지뢰찾기 문제이다. (해당 위치를 포함한 옆칸(대각 포함)의 1 개수)
배열명이 mines, filed로 되어있는 거가 힌트이다.
여러 반복문에 많은 변수가 있어서 헷갈릴 수 있으므로, 각 변수가 어떤 용도인지 파악해야 한다.
또한 이차원 배열 문제는 표로 직접 그려보면 훨씬 풀기 수월하다.
반복문에서 조건을 찾고 어떤 유형의 문제인지 파악하는 것이 중요해보인다.
🍉 2022년 3회 13번
출력 결과
#include <stdio.h>
void 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);
}
답 : 2
규칙성이 안 보인다. 노가다로 풀어야 하는 것 같다.
if(s == i)를 만족하는 i의 값은 6, 28 뿐이다.
'정보처리기사 > 기출' 카테고리의 다른 글
[정보처리기사] 기출문제_DB (2020년 실기) (0) | 2024.04.27 |
---|---|
[정보처리기사] 기출문제_C언어 (2023년 실기) (1) | 2024.04.21 |
[정보처리기사] 기출문제_C언어 (2021년 실기) (0) | 2024.04.18 |
[정보처리기사] 기출문제_C언어 (2020년 실기) (0) | 2024.04.18 |
[정보처리기사] 기출문제_JAVA (2023년 실기) (0) | 2024.04.17 |