[1회]
5.
class Soojebi :
li = ["Seoul", "Kyeonggi", "Inchon", "Daejeon", "Daegu", "Pusan"]
s = Soojebi()
str01 = ''
for i in s.li :
str01 = str01 + i[0]
print(str01)
1) class Soojebi : li = ["Seoul", "Kyeonggi", "Inchon", "Daejeon", "Daegu", "Pusan"]
- Soojebi 클래스를 선언하고, 리스트 li에는 위에 값으로 초기화.
2) s = Soojebi()
- Soojebi() 클래스 객체 s 생성하고 클래스 변수 li는 개체 통해 접근 가능.
3) str01 = ''
- str01이라는 빈문자열 선언.
4) for i in s.li
- li 리스트의 각 항목(i)를 순회.
5) str01 = str01 + i[0]
- 각 문자열의 첫 번째 글자(i[0])를 추출하고, 이를 str01에 계속 덧붙임.
즉, 첫 번째 루프에서 "Seoul"의 첫 글자 "S"가 str01에 추가되고,
두 번째 루프에서 "Kyenggi"의 첫 글자 "K"가 추가되는 형식.
[출력]
SKIDDP
7.
public class Soojebi {
public static void main(String[] args) {
int[][]arr = new int[][] {{45, 50, 75}, {89}};
System.out.println(arr[0].length);
System.out.println(arr[1].length);
System.out.println(arr[0][0]);
System.out.println(arr[0][1]);
System.out.println(arr[1][0]);
}
}
1) int[][]arr = new int[][] {{45, 50, 75}, {89}};
- 정수형 이차원 배열 arr 선언하면서 초기화.
arr | arr[0] | 45 | 50 | 75 |
arr[1] | 89 |
2) 결과
① System.out.println(arr[0].length); → arr[0]의 길이를 구하는 것으로 {45, 50. 75]으로 3 출력.
② System.out.println(arr[1].length); → arr[1]의 길이를 구하는 것으로 {89}으로 1 출력.
③ System.out.println(arr[0][0]); → arr[0][0]의 요소를 구하는 것으로 45 춯력.
④ System.out.println(arr[0][1]); → arr[0][1]의 요소를 구하는 것으로 50 출력.
⑤ System.out.println(arr[1][0]); → arr[1][0]의 요소를 구하는 것으로 89 출력.
[출력]
3
1
45
50
89
15.
struct Soojebi {
char name[10];
int age;
};
void main() {
struct Soojebi s[] = { "Kim", 28, "Lee", 38, "Seo", 50, "Park", 35 };
struct Soojebi* p;
p = s;
p++;
printf("%s\n", p->name);
printf("%d\n", p->age);
}
▶ C언어에서 구조체 배열 사용하여 구조체 데이터 초기화하고, 포인터 통해 구조체 데이터 참조하는 예제.
1) Struct Soojebi 구조체 정의
- Struct Soojeci는 두 개의 필드 가짐
: name[10]은 길이가 10인 문자열 배열로 이름을 저장하고, age는 정수형 필드로 나이를 저장.
2) main
① struct Soojebi s[] = { "Kim", 28, "Lee", 38, "Seo", 50, "Park", 35 };
- s는 구조체 배열로 선언하면서 초기화.
- 이 배열은 각각 name과 age 필드에 해당하는 값을 차례대로 초기화.
- s[0] = { "Kim", 28" }
- s[1] = { "Lee", 38" }
- s[2] = { "Seo", 50" }
- s[3] = { "Park", 35" }
② p = s
- 구조체 배열 s의 첫 번째 요소를 가리키도록 포인터 p를 초기화.
③ p++ : 포인터를 두 번째 구조체 s[1]을 가리키도록 이동.
3) pritnf문
① printf("%s\n", p->name); → 두 번째 구조체(s[1])의 name 필드를 가리킴.
② printf("%d\n", p->age); → 두 번째 구조체(s[1])의 age 필드를 가리킴.
[출력]
Lee
38
17.
public class Soojebi {
public static void main(String[] args) {
int i, j;
for(j=0, i=0; i<=5; i++) {
j += i;
System.out.print(i);
if(i == 5) {
System.out.print("=");
System.out.print(j);
}
else {
System.out.print("+");
}
}
}
}
1) int i, j;
: 정수형 변수 i, j 선언.
2) for문
① i = 0 일 때
j = j + i = 0 + 0이므로, j = 0.
i 값 출력하면 0.
if문 조건 확인하면 현재 i는 0이므로 조건이 맞지 않아 else문으로 가서 + 출력.
0+
② i = 1 일 때
j = j + i = 0 + 1 = 1이므로, j = 1.
i 값 출력하면 1.
if문 조건 확인하면 현재 i는 1이므로 조건이 맞지 않아 else문으로 가서 + 출력.
0+1+
③ i = 2 일 때
j = j + i = 1 + 2 = 3이므로, j = 3.
i 값 출력하면 2.
if문 조건 확인하면 현재 i는 2이므로 조건이 맞지 않아 else문으로 가서 + 출력.
0+1+2+
④ i = 3 일 때
j = j + i = 3 + 3 = 6이므로, j = 6.
i 값 출력하면 3.
if문 조건 확인하면 현재 i는 3이므로 조건이 맞지 않아 else문으로 가서 + 출력.
0+1+2+3+
⑤ i = 4 일 때
j = j + i = 6 + 4 = 10이므로, j = 10.
i 값 출력하면 4.
if문 조건 확인하면 현재 i = 4이므로 조건이 맞지 않아 else문으로 가서 +출력.
0+1+2+3+4+
⑥ i = 5 일 때
j = j + i = 10 + 5 = 15이므로, j = 15.
i 값 출력하면 5.
if문 조건 확인하면 현재 i = 5이므로 조건이 맞기 때문에 = 출력하고 j값 출력 15.
0+1+2+3+4+5=15
[출력]
0+1+2+3+4+5=15
[2회]
3.
a = 100
i = 0
result = 0
for i in range(1, 3):
result = a >> i
result += 1
print(result)
for i in range(1, 3)은 i는 1부터 2까지 반복한다는 의미.
① i = 1 일 때
result = a >> i에서 a는 오른쪽으로 1만큼 시프트하면, 100 / 2^1은 100 / 2 = 50을 의미.
따라서 result에는 50을 저장하고, result += 1로 result = 51.
② i = 2 일 때
result = a >> i에서 a는 오른쪽으로 2만큼 시프트하면, 100 / 2^2는 100 / 4 = 25를 의미.
따라서 result에는 25를 저장하고, result += 1로 result = 26을 출력.
[출력]
26
5.
void main() {
int ary[3] = { 1 };
int s = 0;
int i = 0;
ary[1] = *(ary + 0) + 2;
ary[2] = *ary + 3;
for (i = 0; i < 3; i++) {
s = s + ary[i];
}
printf("%d", s);
}
1) int ary[3] = { 1 };
: 길이가 3인 정수형 배열 ary 선언하면서 초기화.
2) int s = 0; int i = 0;
: 정수형 s, i 선언하면서 각각 0으로 초기화.
3) ary[1] = *(ary + 0) + 2;
: 현재 ary는 100번지라고 가정하면, 100번지 + 0은 100번지이고, 100번지의 값은 1이며, 1 + 2 = 3이므로 ary[1] = 3을 저장.
4) ary[2] = *ary + 3;
: 현재 ary는 100번지이고, 100번지의 값은 1이며, 1 + 3 = 4이므로 ary[2] = 4를 저장.
5) for문
: for문은 ary배열을 돌면서 각각의 자리의 값들을 출력하며 덧붙임. 따라서 1 + 3 + 4 = 8을 s에 저장.
6) 출력
: s를 정수로 표시하며 출력하면 8
[출력]
8
10.
class ovr1 {
public static void main(String[] args) {
ovr1 al = new ovr1();
ovr2 a2 = new ovr2();
System.out.println(al.san(3, 2) + a2.san(3, 2));
}
int san(int x, int y) {
return x + y;
}
}
class ovr2 extends ovr1 {
int san(int x, int y) {
return x - y +super.san(x, y);
}
}
1) a1.san(3, 2)
: ovr1 클래스의 san 메서드를 호출하여 3 + 2 = 5를 출력함.
2) a2.san(3, 2)
: ovr2 클래스의 오버라이딩된 san 메서드를 호출하여 3 - 2 + (3 + 2) = 1 + 5 = 6을 출력함.
따라서 5 + 6 = 11을 최종 출력.
[출력]
11
11.
int Soojebi(int base, int exp) {
int i, result = 1;
for (i = 0; i < exp; i++)
result *= base;
return result;
}
void main() {
printf("%d", Soojebi(2, 10));
}
1) int i, result = 1;
: 정수형 변수 i, result 선언하면서 result = 1로 초기화.
2) for문
main 함수에서 Soojebi(2, 10) 호출하면서 base = 2, exp = 10이므로 i < 10까지 반복문 실행.
① i = 0 일 때 result = result * base = 1 * 2 = 2
② i = 1 일 때 result = result * baes = 2 * 2 = 4
③ i = 2 일 때 result = result * base = 4 * 2 = 8
이런식으로 진행하다보면 2의 거듭제곱 만큼 곱하여 결과를 반환함.
2 ^ 10 = 1024를 반환하고, printf로 출력.
[출력]
1024
[3회]
1.
class Soojebi {
static private Soojebi instance = null;
private int count = 0;
static public Soojebi get() {
if(instance == null) {
instance = new Soojebi();
}
return instance;
}
public void count() { count++; }
public int getCount() { return count; }
}
public class Soojebi2 {
public static void main(String[] args) {
Soojebi s1 = Soojebi.get();
s1.count();
Soojebi s2 = Soojebi.get();
s2.count();
Soojebi s3 = Soojebi.get();
s3.count();
System.out.println(s1.getCount());
}
}
▶ 싱글톤패턴은 인스턴스가 오직 하나임을 보장하는 것으로, 현재 이 문제는 싱글톤패턴의 문제.
1) class Soojebi
① static private Soojebi instance = null; → 클래스의 유일한 인스턴스를 저장하는 정적 필드. 초기에는 null로 설정.
② static public soojebi get()
- 정적 메서드는 싱글톤 인스턴스를 반환.
- 인스턴스가 null일 경우 새로운 Soojebi 객체를 생성하고, 그렇지 않으면 기존의 인스턴스 반환.
③ public void count() → count 변수를 1증가 시키는 메서드.
④ public int getCount() → 현재 count 값을 반환하는 메서드.
2) main 메서드
① Soojebi s1 = Soojebi.get();
- Soojebi 클래스의 인스턴스 반환 받음. 처음 호출이므로 새로운 인스턴스가 생성.
- 즉 get() 함수로 가서 if문 조건 확인한는데 처음 호출이므로 instance는 null이기 때문에 새로운 인스턴스 생성.
② s1.count();
- count 값을 1 증가 시킴. 현재 count = 1.
③ Soojebi s2 = Soojebi.get();
- Soojebi.get()을 다시 호출하면 동일한 Soojebi 인스턴스가 반환되어 if문 조건은 null이 아니므로 기존의 가지고 있는 인스턴스 반환.
④ s2.count();
- count 값을 1 증가 시킴. 현재 count = 2.
⑤ Soojebi s3 = Soojebi.get();
- Soojebi.get()을 다시 호출하면 동일한 Soojebi 인스턴스가 반환되어 if문 조건은 null이 아니므로 기존의 가지고 있는 인스턴스 반환.
⑥ s3.count();
- count 값을 1 증가 시킴. 현재 count = 3.
⑦ System.out.println(s1.getCount());
- s1의 count 값을 출력하므로 현재 count는 3을 출력.
여기서 s1.getCount() 뿐만 아니라, s2.getCount(), s3.getCount()를 해도 똑같이 3을 출력. 같은 인스턴스를 가지고 있기 때문.
[출력]
3
11.
public class Soojebi {
public static void main(String[] args) {
int a = 3, b = 4, c = 3, d = 5;
if((a == 2 | a == c) & !(c > d) & (1 == b ^ c != d)) {
a = b + c;
if(7 == b ^ c != a) {
System.out.println(a);
}
else {
System.out.println(b);
}
}
else {
a = c + d;
if (7 == c ^ d != a) {
System.out.println(a);
}
else {
System.out.println(d);
}
}
}
}
1) a == 2 | a == c
: a == 2는 false, a == c는 true이므로 결과는 true.
2) !(c > d)
: 3 > 5는 거짓이므로 false이지만 앞에 ! 붙었으므로 결과는 true.
3) 1 == b ^ c != d
: 1 == b는 false, c != d는 true이므로 결과는 true. (^는 두개의 결과가 달라야 true값을 반환.)
4). if((a == 2 | a == c) & !(c > d) & (1 == b ^ c != d))의 결과는 true이므로 다음 문장을 실행.
5) a = b + c = 4 + 3 = 7이므로 a = 7.
6) 7 == b ^ c != a
: 7 == b는 false, c != a는 true이므로 결과는 true.
따라서 a 값을 출력하므로 7을 출력 후 종료.
[출력]
7
12.
void main() {
int *arr[3];
int a = 12, b = 24, c = 36;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
printf("%d\n", *arr[1] + **arr + 1);
}
1) int *arr[3];
: 길이가 3인 정수형 배열 선언.
2) int a = 12, b = 24, c = 36;
; 정수형 변수 a, b, c 선언하면서 각각 값을 12, 24, 36으로 초기화.
3) arr[0] = &a. arr[1] = &b, arr[2] = &c
: arr 배열 공간에는 a, b, c의 주소값을 저장.
즉, arr의 배열을 100번지, a는 10번지, b는 20번지, c는 30번지로 가정.
arr | arr[0] | arr[1] | arr[2] | |
10 | 20 | 30 |
4) *arr[1]
: arr[1]의 값을 구하는 것으로 현재 arr[1]은 20번지를 가지고 있고, 20번지의 값은 b 값인 24를 출력.
5) **arr
: arr의 값의 값을 구하는 것으로 arr의 값은 100번지의 10을 말하고, 10번지의 값은 a 값인 12를 출력.
따라서 *arr[1] + **arr + 1 = 24 + 12 + 1 = 37
[출력]
37
14.
a, b = 100, 200
print(a==b)
[출력]
False
▶ 파이썬은 True / Fasle로 표시, 자바는 true / false로 표기, C언어는 true / false는 없고 0은 거짓이고 0이 아닌 값은 참으로 간주.
17.
#include<stdio.h>
struct Soojebi {
char name[20];
int os, db, hab1, hab2;
};
void main() {
struct Soojebi s[3] = { {"데이터1", 95, 88},
{"데이터2", 84, 91},
{"데이터3", 86, 75 } };
struct Soojebi* p;
p = &s[0];
(p + 1)->hab1 = (p + 1)->os + (p + 2)->db;
(p + 1)->hab2 = (p + 1)->hab1 + p->os + p->db;
printf("%d\n", (p + 1)->hab1 + (p + 1)->hab2);
}
▶ Soojebi 구조체 사용하여 데이터들을 처리하고, 포인터연산 통해 구조체 배열을 조작하는 코드.
1) struct Soojebi s[3]
- s[0]의 이름은 "데이터1", os는 95, db는 88.
- s[1]의 이름은 "데이터2", os는 84, db는 91.
- s[2]의 이름은 "데이터3", os는 86, db는 75.
2) struct Soojebi *p
구조체 포인터변수 p 선언.
3) p = &s[0];
- s 배열의 첫 번째 구조체 가리키는 포인터 p 설정.
4) (p + 1)->hab1 = (p + 1)->os + (p + 2)->db;
- p + 1은 s[1]을 가리키고, p + 2는 s[2]를 의미.
- hab1은 s[1].os + s[2].db를 의미.
- s[1].os = 84, s[2].db = 75이므로 84 + 75 = 159.
- 따라서 s[1]의 hab1은 159.
5) (p + 1)->hab2 = (p + 1)->hab1 + p->os + p->db;
- hab2는 s[1].hab1 + s[0].os + s[0].db
- s[1].hab1 = 159, s[0].os = 95, s[0].db = 88이므로 159 + 95 + 88 = 342.
6) (p + 1)->hab1 + (p + 1)->hab2
- s[1].hab1 + s[1].hab2 = 159 + 342 = 501을 정수로 출력.
[출력]
501
'Studying > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기]_2022년 2회 (2) | 2024.10.12 |
---|---|
[정보처리기사 실기]_2022년 1회 (5) | 2024.10.11 |
[정보처리기사 실기]_2021년 3회 (4) | 2024.10.11 |
[정보처리기사 실기]_2021년 2회 (4) | 2024.10.10 |
[정보처리기사 실기]_2021년 1회 (2) | 2024.10.10 |