본문 바로가기

Studying/정보처리기사

[정보처리기사 실기]_2021년_프로그래밍

[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