< C++ >
# 1. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
[소스코드]
#include <stdio.h>
int main()
{
int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int* parr[2] = { arr[1], arr[2] };
printf("%d", parr[1][1] + *(parr[1] + 2) + **parr);
return 0;
}
시험에서 이 쉬운 포인터 문제를 인덱스를 헷갈려서 한 문제 차이로 떨어진 게 기억이 난다..
2차원 배열 arr을 { 1, 2, 3, 4, 5, 6, 7, 8, 9 }로 초기화
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
포인터 배열 parr을 { arr[1], arr[2] }로 초기화
parr[0] | 4 | 5 | 6 |
parr[1] | 7 | 8 | 9 |
parr[0] = arr[1], parr[1] = arr[2]
parr[1][1] = 8
*(parr[1] + 2) = 9
**parr = 4
[출력결과]
21
# 2. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
[소스코드]
#include <stdio.h>
#include <string.h>
void sumFn(char* d, const char* s)
{
int sum = 0;
while (*s)
{
*d = *s;
d++;
s++;
}
*d = '\0';
}
int main()
{
const char* str1 = "first";
char str2[50] = "teststring";
int result = 0;
sumFn(str2, str1);
for (int i = 0; str2[i] != '\0'; i++)
{
result += i;
}
printf("%d", result);
return 0;
}
포인터 str1을 문자열 리터럴 "first"로 초기화
배열 str2를 "teststring"으로 초기화
정수 result를 0으로 초기화
sumFn(str2, str1)
정수 sum을 0으로 초기화
반복문을 통해 str1의 "first"문자를 순차적으로 배열 str2의 인덱스에 초기화
"first\0ring"
반복문은 null 문자를 만나기 전까지 순회함
f일 때 result = 0
i일 때 result = 1
r일 때 result = 3
s일 때 result = 6
t일 때 result = 10
[출력결과]
10
# 3. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력 값을 작성하시오.
[소스코드]
#include <stdio.h>
void swap(int a, int b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int a = 11;
int b = 19;
swap(a, b);
switch (a)
{
case 1:
b += 1;
case 11:
b += 2;
default:
b += 3;
break;
}
printf("%d", a - b);
return 0;
}
정수 a, b를 각각 11, 19로 초기화
swap(a, b) // 파라미터로 전달받은 a, b를 뒤바꾸지만 메인함수에서는 a, b값이 변화하지 않음
만약 swap함수를 호출해서 메인함수의 a, b값을 변화시키려면 포인터를 사용하여 메인함숫값 자체를 변화시켜야 한다
switch(a) == switch(11)
case 11부터 break를 만날 때까지 실행
b += 2 // b를 21로 초기화
b += 3 // b를 24로 초기화
a - b = 11 - 24 = -13
[출력결과]
-13
# 4. 다음은 C언어의 구조체에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력 값을 작성하시오.
[소스코드]
#include <stdio.h>
struct node
{
int n1;
struct node* n2;
};
int main()
{
struct node a = { 10, NULL };
struct node b = { 20, NULL };
struct node c = { 30, NULL };
struct node* head = &a;
a.n2 = &b;
b.n2 = &c;
printf("%d\n", head->n2->n1);
return 0;
}
구조체 node 정의
구조체 변수 a를 { 10, NULL }로 초기화
구조체 변수 b를 { 20, NULL }로 초기화
구조체 변수 c를 { 30, NULL }로 초기화
구조체 포인터 head를 구조체 변수 a의 메모리주소로 초기화
a.n2 = &b // 구조체 변수 a의 멤버 n2를 구조체 변수 b의 메모리 주소로 초기화
b.n2 = &c // 구조체 변수 b의 멤버 n2를 구조체 변수 c의 메모리 주소로 초기화
head는 구조체 변수 a의 메모리 주소를 가리키고 있으니 head->n2 = a.n2
a.n2는 구조체 변수 b의 메모리 주소를 가리키고 있으니 a.n2->n1 = b->n1
해당 구조체 문제를 이해하기 위해 각 구조체의 메모리 주소를 출력하는 코드를 작성해 보자
#include <iostream>
struct node
{
int n1;
struct node* n2;
};
int main()
{
struct node a = { 10, NULL };
struct node b = { 20, NULL };
struct node c = { 30, NULL };
std::cout << "구조체 a의 메모리 주소:" << &a << std::endl;
std::cout << "구조체 b의 메모리 주소:" << &b << std::endl;
std::cout << "구조체 c의 메모리 주소:" << &c << std::endl;
struct node* head = &a;
std::cout << "포인터 head가 가리키는 메모리 주소:" << *&head << std::endl;
a.n2 = &b;
b.n2 = &c;
std::cout << "a.n2 = &b\nb.n2 = &c" << std::endl;
std::cout << "구조체 a의 n2가 가리키는 메모리 주소: " << *&a.n2 << std::endl;
std::cout << "구조체 b의 n2가 가리키는 메모리 주소: " << *&b.n2 << std::endl;
printf("%d\n", head->n2->n1);
return 0;
}
다음과 같이 출력된다
구조체 a의 메모리 주소:010FF734
구조체 b의 메모리 주소:010FF724
구조체 c의 메모리 주소:010FF714
포인터 head가 가리키는 메모리 주소:010FF734
a.n2 = &b
b.n2 = &c
구조체 a의 n2가 가리키는 메모리 주소: 010FF724
구조체 b의 n2가 가리키는 메모리 주소: 010FF714
20
[출력결과]
20
< Java >
# 1. 다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력값을 작성하시오.
[소스코드]
class good
{
public static void main(String[] args)
{
int[] a = new int[] {1, 2, 3, 4};
int[] b = new int[] {1, 2, 3, 4};
int[] c = new int[] {1, 2, 3};
check(a, b);
check(a, c);
check(b, c);
}
public static void check(int[] a, int[] b)
{
if (a == b)
System.out.print("O");
else
System.out.print("N");
}
}
간단하게 배열 a, b, c가 있는데 check메서드는 각 배열이 참조하는 객체가 같으면 "O", 다르면 "N"을 출력하는 문제다
서로 다른 배열이므로 NNN
[출력결과]
NNN
# 2. 다음은 Java 언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
[소스코드]
class good
{
public static void main(String[] args)
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
ODDNumber OE = new ODDNumber();
System.out.print(OE.sum(a, true) + ", " + OE.sum(a, false));
}
}
interface Number
{
int sum(int[] a, boolean odd);
}
class ODDNumber implements Number
{
public int sum(int[] a, boolean odd)
{
int result = 0;
for (int i = 0; i < a.length; i++)
{
if ((odd && a[i] % 2 != 0) || (!odd && a[i] % 2 == 0))
result += a[i];
}
return result;
}
}
ODDNumber 클래스에서 생성자를 호출해 새로운 객체 생성
OE.sum 메서드는 파라미터로 배열 a와 불리언값을 전달받는다
true가 전달되면 배열 a의 모든 홀수를 덧셈한다
false가 전달되면 배열 a의 모든 짝수를 덧셈한다
[출력결과]
25, 20
# 3. 다음은 Java에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
[소스코드]
class good
{
public static void main(String[] args)
{
String str = "abacabcd";
boolean[] seen = new boolean[256];
System.out.print(calculFn(str, str.length() - 1, seen));
}
public static String calculFn(String str, int index, boolean[] seen)
{
if (index < 0)
return "";
char c = str.charAt(index);
String result = calculFn(str, index - 1, seen);
if (!seen[c])
{
seen[c] = true;
return c + result;
}
return result;
}
}
스트링 str을 "abacabcd"로 초기화
배열 seen을 생성
calculFn(str, str.length() - 1, seen) // calculFn함수에 스트링 str, str의 마지막 인덱스, 배열 seen을 전달
인덱스가 0보다 작아질 때까지 재귀 호출문을 순회
만약 seen[c]가 false이면 seen[c]를 true로 초기화
c + result를 리턴
[출력결과]
dcba
# 4. 다음은 Java에 대한 문제이다. 아래 코드를 확인하여 알맞은 출력 값을 작성하시오.
[소스코드]
class good
{
public static void main(String[] args)
{
String str = "ITISTESTSTRING";
String[] result = str.split("T");
System.out.print(result[3]);
}
}
String str을 "ITISTESTSTRING"으로 초기화
str을 "T"로 split 한 결과를 result 배열에 초기화
result[0] = "I"
result[1] = "IS"
result[2] = "ES"
result[3] = "S"
result[4] = "RING"
[출력결과]
S
< Python >
# 1. 다음은 Python에 대한 문제이다. 아래 코드를 읽고 알맞은 출력 값을 작성하시오.
[소스코드]
def fnCalculation(x, y):
result = 0
for i in range(len(x)):
temp = x[i:i + len(y)]
if temp == y:
result += 1
return result
a = "abdcabcabca"
p1 = "ab"
p2 = "ca"
print(f"ab{fnCalculation(a, p1)}ca{fnCalculation(a, p2)}")
a = "abdcabcabca"
p1 = "ab", p2 = "ca"
fnCalculation함수는 전달받은 y의 길이만큼 x[i:i+2]로 문자열 a를 2개씩 검사하여 y와 일치하면 result += 1을 하고 있다
[출력결과]
ab3ca3
'정보처리기사' 카테고리의 다른 글
[2024년 1회] (2) | 2024.10.10 |
---|---|
[2023년 3회] (0) | 2024.10.07 |
[2023년 2회] (0) | 2024.10.07 |
[2023년 1회] (0) | 2024.10.07 |
[2022년 3회] (0) | 2024.10.04 |