본문 바로가기

Studying/정보처리기사

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

[1회]

 

1. 다음은 자바 코드이다. 출력 결과를 쓰시오.

class Static {
	public int a = 20;
	static int b = 0;
}
public class Soojebi {
	public static void main(String[] args) {
		int a;
		a = 10;
		Static.b = a;
		Static st = new Static();
		System.out.println(Static.b++);
		System.out.println(st.b);
		System.out.println(a);
		System.out.print(st.a);
	}
}

 

1) class Static

 ① public int a = 20;

     - 인스턴스 변수.

     - 객체가 생성될 때마다 각각의 객체가 독립적으로 가지는 변수.

     - 초기값은 20.

 ② static int b = 0;

     - 정적(static) 변수.

     - 클래스에 속하며 모든 객체가 공유하는 변수.

     - 초기값은 0

 

2) main 메서드

 ① int a; a = 10;

     - 정수형 변수 a 선언. 그다음 10으로 초기화.

 ② Static.b = a;

     - Static 클래스의 정적 변수 b에 지역 변수 a의 값 10을 할당.

     - 이 때 b의 값은 10으로 바뀜. ③ Static st = new Static();

     - Static 클래스의 객체 st 생성. 

3) 출력

 ① Static.b++

     - Static 클래스의 정적 변수 b의 값을 출력 후 ++ 연산 실행. 현재 정적 변수 b의 값은 10이므로 10을 출력 후 b의 값은 11로 변경.

 ② st.b

     - 객체 st를 통해 b를 출력. 하지만 b는 클래스에 속하는 정적 변수이므로 st 객체 통해 접근해도 11을 출력.

 ③ a

     - 지역변수 a의 값을 출력. main 메서드에서의 a의 값은 10이므로 10을 출력. 

④ st.a

     - 객체 st의 인스턴스 변수 a를 출력.     - 객체 a는 20으로 초기화되어있으므로 20을 출력.

 

[출력]

10
11
10
20

 

2. 다음은 C 코드이다. 출력 결과를 쓰시오.

#include<stdio.h>

int main() {
	char a[] = "Art";
	char* p = NULL;
	int i = 0;

	p = a;
	printf("%s\n", a);
	printf("%c\n", *p);
	printf("%c\n", *a);
	printf("%s\n", p);

	for (i = 0; a[i] != '\0'; i++)
		printf("%c", a[i]);
	return 0;
}

 

1) char a[] = "Art";

 - 문자형 변수 a 선언하면서 "Art"로 초기화.

 

2) char* p = NULL;

 - 문자 포인터 p를 선언하면서 NULL로 초기화.

 

3) int i = 0;

 - 정수형 변수 i 선언하면서 0으로 초기화.

 

4) p = a;

 - 포인터 p가 배열 a의 첫 번째 요소를 가리킴. 즉 p는 첫 번째 문자인 'A' 가리킴.

 

5) 출력

 ① printf("%s\n", a);

     - 배열 a 전체를 문자열로 출력하는 것으로 Art를 출력.

 ② printf("%c\n", *p);

     - 포인터 p가 가리키는 값을 문자로 출력하는 것으로 A를 출력.

 ③ printf("%c\n", *a);

     - 배열 a의 첫 번째 요소를 문자로 출력하는 것으로 A를 출력.

 ④ printf("%s\n", p);

     - 포인터 p가 가리키는 문자열을 출력하는 것으로 Art를 출력.

 

6) for문

 - i가 0부터 시작해서 NULL 만나기 전까지 반복문 실행.

 - a[0] 요소부터 NULL 전인 a[3]까지 반복문 돌면서 출력하므로 Art를 출력.

[출력]

Art
A
A
Art
Art

 

3. 다음은 C 코드이다. 출력 결과를 쓰시오.

#include<stdio.h>

void main() {
	char* a = "qwer";
	char* b = "qwety";
	int i, j;;
	for (i = 0; a[i] != '\0'; i++) {
		for (j = 0; b[j] != '\0'; j++) {
			if (a[i] == b[j])
				printf("%c", a[i]);
		}
	}
}

 

1) char* a = "qwer";

 - 문자열 "qwer"을 가리키는 포인터.

 

2) char* b = "qwety";

 - 문자열 "qwety"를 가리키는 포인터

 

3) for문

 - 외부 for문은 i를 사용하여 문자열 a의 각 문자를 순차적으로 탐색.

 - 내부 for문은 j를 사용하여 문자열 b의 각 문자를 순차적으로 탐색.

 - if문 조건은 a의 i번째와 b의 j번째 문자가 동일할 경우, 그 문자를 출력.

 

따라서 동일한 문자는 'q', 'w', 'e'를 출력함.

 

[출력]

qwe

 

9. 다음은 이진수를 십진수로 변환하는 c언어 코드이다. ⓐ, ⓑ에 적합한 코드를 작성하시오.

#include<stdio.h>

int main() {
	int input = 10110;
	int di = 1;
	int sum = 0;

	while (1) {
		if (input == 0) break;
		else {
			sum = sum + (input __ⓐ__ __ⓑ__) * di;
			di = di * 2;
			input = input / 10;
		}
	}
	printf("%d", sum);
	return 0;
}

 

ⓐ %

ⓑ 10


 

14. 다음은 자바 코드이다. 빈칸에 들어갈 코드를 쓰시오. (단, 변수명으로 쓰시오.)

public class Soojebi {
	static void swap(int[] a, int idx1, int idx2) {
		int t = a[idx1];
		a[idx1] = a[idx2];
		a[__①__] = t;
	}
	
	static void Usort(int[] a, int len) {
		for(int i=0; i<len; i++) {
			for(int j=0; j<len-i-1; j++) {
				if(a[j] > a[j+1]) {
					swap(a, j, j+1);
				}
			}
		}
	}
	public static void main(String[] args) {
		int[] item = {5, 4, 9, 1, 3, 7};
		int nx = 6;
		Usort(item, __②__);
		for(int data : item) {
			System.out.print(data + "");
		}
	}
}

 

① idx2 / ② nx

 

1) swap 메서드 → 배열의 두 요소를 서로 교환하는 함수.

 

2) main 메서드

 ① int[] item = {5, 4, 9, 1, 3, 7};

     - 정수형 배열 item 선언하면서 초기화.

 ② int nx = 6;

     - 정수형 변수 nx 선언하면서 6으로 초기화.

 ③ Usort(item, nx);

     - Usort 메서드 호출하고, item 배열과 nx 값을 인수로 전달.

       ▷ 메서드 Usort에 item 배열과 빈칸 2를 넘기기로 하는데, 이미 배열의 이름으로 item을 사용했기 때문에 다른 변수명을 사용해야 함.

           현재 main 메서드에 나온 변수명은 nx밖에 없으므로 nx 입력.

     - Usort 메서드는 버블 정렬를 구현하는 함수로, 배열 a를 오름차순으로 정렬함. 

 

3) Usrot 메서드

 - Usrot 메서드 호출하면서 a에는 item 배열이, len에는 nx 값인 6이 전달.

 ㄱ. for문

    ① i = 0 일 때

           j = 0 일 때

             if문 조건 확인하면 a[0] > a[1] = 5 > 4는 참이므로 swap 메서드 호출. swap(a, 0, 1)

             int t = a[0];

             a[0] = a[1];

             a[1] = t = a[0]이므로 a[0]과 a[1]의 자리가 바뀜.

 

이런 식으로 진행하다 보면 배열은 {1,3,4,5,7,9}로 바뀜.


 

15. 다음은 파이썬 코드이다. 출력 결과를 쓰시오.

a = {'한국', '중국', '일본}
a.add('베트남')
a,add('중국')
a.remove('일본')
a.update({'홍콩', '한국', '태국'})
print(a)

 

1) a = {'한국', '중국', '일본}

 - a 세트형 변수에 '한국', '중국', '일본'을 초기화.

 

2) a.add('베트남')

 - 세트에 '베트남' 추가.

 

3) a.add('중국')

 - 세트에 '중국'이라는 값을 추가하는데 이미 '중국'은 있으므로 무시해도 됨.

 

4) a.remove('일본')

 - 세트에 '일본'이라는 값 제거.

 

5) a.update({'홍콩', '한국', '태국'})

 - update를 통해 '홍콩', '한국', '태국'을 추가하는데  '한국'은 이미 있으므로 '홍콩', '태국'만 추가.

 

6) 출력하면 {'한국', '중국', '베트남', '홍콩', '태국}

 

▶ 세트는 순서가 상관없는 컬렉션 자료형이므로 출력 순서는 상관없고, 중복 허용하지 않음.


 

17. 다음은 자바 코드이다. 출력 결과를 쓰시오.

 

https://mh030128.tistory.com/27

 

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

[1회] 12. #includevoid main() { int i, j; int temp; int a[5] = { 75, 95, 85, 100, 50 }; for (i = 0; i a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } for (i = 0; i  1) int i, j; int temp; : 정수형 변수 i, j, temp 선언. 2) int

mh030128.tistory.com

20년 3회_15번


 

20. 다음은 자바 코드이다. 출력 결과를 쓰시오.

class Parent {
	int x = 100;
	
	Parent() {
		this(500);
	}
	Parent(int x) {
		this.x = x;
	}
	int getX() {
		return this.x;
	}
}

class Child extends Parent {
	int x = 4000;
	
	Child() {
		this(5000);
	}
	Child(int x) {
		this.x = x;
	}
}

public class Soojebi {
	public static void main(String[] args) {
		Child obj = new Child();
		System.out.println(obj.getX());
	}
}

 

생성자 오버로딩.

    객체 생성 시 생성자 호출하는데 main메서드에서 Child 객체를 생성하였으므로 Child에 생성자 확인.

    상속관계에서 하위 객체 생성 시 상위 객체도 생성.

 

    생성자의 특징은 반환값이 없고, 클래스명과 생성자명이 동일.

 

1) class Parent

 ① int x = 100;

     - 정수형 변수 x 선언하면서 100으로 초기화.

 ② Parent()

     - Parent의 기본 생성자.

     - this(500)을 호출하여 x 값을 500으로 초기화하는 생성자 호출.

 ③ Parent(int x)

     - 인자로 받은 값을 this.x에 할당.

 ④ getX()

     - Parent 클래스의 x 값을 반환.

 

2) class Child

 ① int x = 4000;

     - 정수형 변수 x 선언하면서 4000으로 초기화.

     - Parent의 x 변수와는 다른 것.

 ② Child()

     - Child의 기본 생성자.

     - this(5000)을 호출하여 x 값을 5000으로 초기화하는 생성자 호출.

 ③ Child(int x)

     - 인자로 받은 값을 this.x에 할당. 

     - 여기서 this.x는 Child 클래스의 x 필드.

 

3) class Soojebi

 ① Child obj = new Child()

     - Child 객체 생성 후 obj.getX()를 호출하여 getX() 메서드의 결과 출력.

 

(실행순서)

 ① Child obj = new Child();

     - new  키워드 사용하여 Child 객체 생성하면서 Child 클래스의 기본 생성자 호출하는데 그 이유는 매개변수가 없기 때문.

 ② Child() { this(5000); }

     - Child의 기본생성자로 이동.

  ③ this(5000)

     - this()는 자기 자신 객체의 다른 생성자를 호출. 즉 생성자 안에서 this() 키워드 사용해서 다른 생성자 호출 가능.

     - 따라서 this(5000)은 매개변수가 5000인 Child(int x)로 (매개변수 가지는 생성자) 이동.

 ④ Child(int x) {

     - 매개변수 가지는 생성자로 이동해서 다음 코드를 실행하는 줄 알았지만 우리는 Parent()로 이동함.

 ⑤ Parent() { this(500) };

     -  Java의 특성상 상속관계에서 하위객체 생성사면 상위객체도 생성되므로 상위객체로 이동.

     - Child(int x) {this.x = x;}에서 이 코드 위에 super();가 생략되었다고 생각하면 됨.

     - this(500)이 실행되어 x의 값에 500을 저장. this()는 다른 생성자 호출 가능하므로 매개변수 가지는 생성자로 이동.

 ⑥ Parent(int x) {this.x = x;);

     - this.x = x; 코드를 실행하면 x의 값은 500으로 변경이 됨.

     - 우측에 있는 x는 변수의 우선순위를 따라 자기 자신의 블록에 쌓인 변수 x(int x)가 우선순위 되는데, 매개변수도 마찬가지임.

     - 여기서 this는 객체 자기 자신을 의미하는 예약어로, 클래스 Parent안에 객체 obj의 x값은 100에서 500으로 변경.

     - 부모의 생성자가 모두 실행되었으므로 생성자를 호출한 곳으로 다시 이동.

 ⑦ Child(int x) { this.x = x; }

     - 자식 클래스의 생성자로 다시 이동하여 this.x = x; 코드를 실행.

     - 우측에 있는 x의 값은 위에처럼 변수의 우선순위 따라 자기자신 블록 안에 있는 매개변수의 우선순위가 가장 높으므로

       클래서 Child 안에 있는 값 5000으로 변경.

     - this는 객체 자기자신을 의미하므로 클래스 Child 안에 객체 obj의 x값은 1000에서 5000으로 바뀜.

     - Child 생성자도 모두 실행하였으므로 생성자를 실행한 곳, 즉 객체 생성한 main 메서드로 다시 돌아감.

 ⑧ System.out.println(obj.getX());

     - obj는 Child 객체이므로 Child 클래스로 이동하여 getX 함수를 실행하는데 Child 클래스에 없음.

     - 상속받고 있는 Parent 클래스로 이동하는데, 상속관계에서 부모클래스의 메서드를 바로 사용할 수 있기 때문임.

     - 따라서 Parent 클래스의 getX() 함수를 실행.

 ⑨ int getX() { return this.x; }

     - this는 객체 자기자신을 의미하므로 현재 Parent 클래스의 객체인 obj의 x값은 500이므로 500을 출력하게 됨.

 

[출력]

500

 

[2회]

 

1. 다음 프로그램에서 43215로 출력되도록 밑줄 친 곳에 들어갈 코드를 보기에서 골라 작성하시오.

#include<stdio.h>

int main() {
	int n[5] = { 5, 4, 3, 2, 1 };
	int i;
	for (i = 0; i < 5; i++) {
		printf("%d", ________ );
	}
	return 0;
}

(보기)

n, i, +, +, 1, 5, [, ], (, )

 

(실행결과)

43215

 

: n[(i+1)%5]

 

- 맨 앞에 있는 5가 맨 뒤로 가야 하기 때문에 n[0] = 4, n[1] = 3, n[2] = 2 ... n[4] = 5로 바뀌어야 함.


 

2. 다음은 C언어 코드이다. 출력 결과를 쓰시오.

#include<stdio.h>

int main() {
	int n[3] = { 73, 95, 82 };
	int i, sum = 0;

	for (i = 0; i < 3; i++) {
		sum += n[i];
	}

	switch (sum / 30) {
	case 10:
	case 9: printf("A");
	case 8: printf("B");
	case 7 :
	case 6: printf("C");
	default: printf("D");
	}
	return 0;
}

 

1) int n[3] = { 73, 95, 82 };

 - 길이가 3인 정수형 배열 선언하면서 초기화.

 

2) int i, sum = 0;

 - 정수형 변수 i, sum  선언하면서 sum = 0으로 초기화.

 

3) for문

 ① i = 0 일 때 sum = sum + n[0] = 0 + 73 = 73.

 ② i = 1 일 때 sum = sum + n[1] = 73 + 95 = 168.

 ③ i = 2 일 때 sum = sum + n[2] = 168 + 82 = 250.

 ④ i = 3 일 때 조건 맞지 않으므로 for문 종료.

 

4) switch문

 - sum / 30 = 250 / 30 = 8이므로 case 8로 감.

 - case 구문에 break 없으므로 쭉 실행.

 - case 8에서 B출력.

 - case 7은 아무것도 없으므로 넘어가고, case 6에서 C 출력.

 - default에서 D출력.

 

따라서 BCD 출력 후 종료.

 

[출력]

BCD

 

3. 다음 C 프로그램의 출력 결과를 쓰시오.

#include<stdio.h>
#define MAX_SIZE 10

int isWhat[MAX_SIZE];
int point = -1;

int isEmpty() {
	if (point == -1) return 1;
	return 0;
}

int isFull() {
	if (point == MAX_SIZE - 1) return 1;
	return 0;
}
void into(int num) {
	if (point >= 10) printf("Full");
	isWhat[++point] = num;
}

int take() {
	if (isEmpty() == 1) printf("Empty");
	return isWhat[point--];
}

int main() {
	into(5);
	into(2);
	while(!isEmpty()) {
		printf("%d", take());
		into(4);
		into(1);
		printf("%d", take());
		into(3);
		printf("%d", take());
		printf("%d", take());
		into(6);
		printf("%d", take());
		printf("%d", take());
		return 0;
	}
}

 

1) #define MAX_SIZE = 10 - 상수 MAX_SIZE는 배열의 크기를 지정하며, 이 값은 스택의 최대 크기를 의미. 따라서 여기에서는 스택의 크기를 10으로 설정.

 

2) int point = -1; - point는 스택의 최상위(Top)를 가리키는 인덱스. 초기 값은 -1로 설정되며, 이는 스택이 비어있음을 나타냄.

 

3) isEmpty() 함수 - 스택이 비어있는지에 대한 여부 확인하는 함수.

 - point == -1은 스택이 비어있으면 return 1; 1을 반환함. 즉 스택이 비어있음을 의미.

 - return 0;은 스택이 비어있지 않으면 0을 반환.

 

4) isFull() 함수 - 스택이 가득 찼는지에 대한 여부 확인하는 함수.

 - point == MAX_SIZE - 1은 스택이 가득 찾으면 return 1; 1을 반환함. 즉 스택이 가득 찾음을 의미.   

(인덱스는 0부터 시작하므로 최대 인덱스는 MAX_SIZE - 1을 의미)

 - return 0; 스택이 가득 차지 않았으면 0을 반환.

 

5) into() 함수 - 스택에 새로운 값을 추가하는 함수.

 - isFull()을 호출하여 스택이 가득 찼는지 확인하고 가득 찼으면 Full을 출력 후 더 이상 값을 추가하지 않고 종료.

 - 스택이 가득 차지 않았으면 ++point로 point 증가시킨 후, 그 위치에 num 값을 저장.

 

6) take() 함수 - 스택에서 값을 꺼내오는 함수.

 - isEmpty()를 호출하여 스택이 비어있는지 확인하고 비어있으면 Empty를 출력.

 - 스택이 비어있지 않으면 isWhat[point--] 실행하여 --point로 point 감소시키며 스택의 최상위 값이 제거됨.

 

7) main함수

 ① into(5); into(2)

     - 먼저 스택에 5와 2를 차례대로 삽입.

     - 스택 상태 [5, 2]

     - point : 1 (총 2개가 있으므로)

 ② while문

     - take를 호출하여 스택이 비어있지 않은 동안 스택 요소 꺼내고 출력.

     - take() 실행하여 2를 꺼냄. (point = 0)

     - into(4) : 스택에 4를 삽입.

     - into(1) : 스택에 1을 삽입.

     - 스택상태 : [5, 4, 1] / point : 2

     - take() 실행하여 1을 꺼냄. (point = 1)

     - into(3) : 스택에 3을 삽입.

     - 스택상태 : [5, 4, 3] / point : 2

     - take() 실행하여 3을 꺼냄. (point = 1)

     - take() 실행하여 4를 꺼냄. (point  = 0)

     - into(6) : 스택에 6을 삽입.

     - 스택상태 : [5, 6] / point : 1

     - take() 실행하여 6을 꺼냄. (point = 0)

     - take() 실행하여 5를 꺼냄. (poiint  = -1)

따라서 출력하면 2 1 3 4 6 5

 

[출력]

213465

 

5. 다음 C프로그램에 홍길동, 김철수, 박영희 순서로 입력하였다. 프로그램의 출력 결과를 쓰시오.

#include<stdio.h>

char n[30];
char *soojebi() {
	gets(n);
	return n;
}
int main() {
	char *p1 = soojebi();
	char *p2 = soojebi();
	char *p3 = soojebi();
	printf("%s\n", p1);
	printf("%s\n", p2);
	printf("%s\n", p3);
	return 0;
}

(입력)]

 

홍길동김철수박영희

 

1) char n[30];

 - 길이가 30인 문자열 저장하는 변수 n 선언.

 

2) soojebi() 함수

 - gets(n) : 사용자로부터 문자열을 입력받음. 이 함수는 n 배열에 입력된 문자열 저장 후, n의 주소 반환.

 

3) main() 함수

 ① char *p1 = soojebi();

     - 첫 번째 입력을 받음. soojebi() 함수는 n의 주소를 반환하므로 p1은 n을 가리킴. 따라서 첫 번째 입력받은 "홍길동"을 n에 저장.

 ② char *p2 = soojebi();

     - 두 번째 입력을 받음. 이때 n의 내용이 "김철수"로 덮어씌워지며, p2 역시 n을 가리킴.

 ③ char *p3 = soojebi();

     - 세 번째 입력을 받음. 이 때 n의 내용이 "박영희"로 덮어씌워지며, p3도 n을 가리킴.

 

최종적으로 p1, p2, p3는 모두 동일한 배열 n을 가리키고 있으며, 이 배열에는 마지막 입력인 "박영희"만 저장되어 있음.

첫 번째, 두 번째, 세 번째 출력 모두 박영희를 출력함.

 

[출력]

박영희
박영희
박영희

 

7. 다음은 잔돈의 개수를 구하는 프로그램이다. a는 1000원 개수, b는 500원 개수, c는 100원 개수, d는 10원 개수이다. 밑 줄 ①, ②, ③, ④에 들어갈 코드를 순서대로 작성하시오. (코드의 길이를 최소화해서 구현해야 한다.)

#include<stdio.h>

int main() {
	int m = 4620;
	int a, b, c, d;

	a = ___①___;
	b = ___②___;
	c = ___③___;
	d = ___④___;

	printf("1000원 : %d개\n", a);
	printf("500원 : %d개\n", b);
	printf("100원 : %d개\n", c);
	printf("10원 : %d개\n", d);

	return 0;
}

 

① m / 1000

② (m % 1000) / 500

③ (m % 500) / 100

④ (m % 100) / 10


 

11. 다음은 선택정렬 코드이다. 밑줄에 알맞은 코드를 쓰시오.

#include<stdio.h>

int main() {
	int arr[] = { 64, 25, 12, 22, 11 };
	int n = sizeof(arr) / sizeof(arr[0]);
	int i = 0, j, tmp;
	do {
		j = i + 1;
		do {
			if (arr[i] _____ arr[j]) {
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
			j++;
		} while (j < n);
		i++;
	} while (i < n - 1);
	for (i = 0; i <= 4; i++)
		printf("%d ", arr[i]);
	return 0;
}

(실행결과)

 

11 12 22 25 64

 

: >


 

14. 다음은 C언어 코드이다. 출력 결과를 쓰시오.

#include<stdio.h>
int main() {
	int c = 0;
	int i;

	for (i = 1; i <= 2023; i++) {
		if (i % 4 == 0) c++;
	}
	printf("%d", c);
	return 0;
}

 

1) int c = 0;

 - 정수형 변수 c 선언하면서 0으로 초기화.

 

2) int i;

 - 정수형 변수 i 선언.

 

3) for문

 ① i = 1 일 때 if문 조건 확인하면 1 % 4 == 0은 거짓이므로 c++ 실행하지 않음.

 ② i = 2 일 때 if문 조건 확인하면 2 % 4 == 0은 거짓이므로 c++ 실행하지 않음.

 ③ i = 3 일 때 if문 조건 확인하면 3 % 4 == 0은 거짓이므로 c++ 실행하지 않음.

 ④ i = 4 일 때 if문 조건 확인하면 4 % 4 == 0은 참이므로 c++ 실행하여 c = 1.

 

이렇게 반복문을 i = 2023까지 실행하였을 때 조건 만족하면 c++ 실행.

따라서 4의 배수 중 가장 큰 수는 2020이므로 2020 / 4 = 505이므로 c는 505를 출력함.

 

[출력]

505

 

18. 다음은 파이썬 코드이다. 출력 결과를 쓰시오.

a = "engineer information processing"
b = a[:3]
c = a[4:6]
d = a[29:]
e = b + c + d
print(e)

 

1) a = "engineer information processing"

 - 변수 a에 문자열 "engineer information processing"이 할당.

 

2) b = a[ : 3]

 - 변수 b에 문자열 a의 0번째부터 2번째까지 가져옴.

 - "eng"

 

3) c = a[4 : 6]

 - 변수 c에 문자열 a의 4번째부터 5번째까지 가져옴.

 - "ne"

 

4) d = a[29: ]

 - 변수 d에 문자열 a의 29번째부터 마지막까지 가져옴.

 - "ng"

 

5) e = b + c + d

 - "eng" + "ne" + "ng" = "engneng"

 

[출력]

engneng

 

19. 다음은 자바 소스 코드이다. 출력 결과를 쓰시오.

public class Soojebi {
	public static void main(String[] args) {
		String str1 = "soojebi";
		String str2 = "soojebi";
		String str3 = new String("soojebi");
		
		System.out.println(str1 == str2);
		System.out.println(str1 == str3);
		System.out.println(str1.equals(str3));
		System.out.println(str2.equals(str3)
				);
	}
}

 

- str1과 str2는 리터럴 문자열을 사용하여 선언되며, Java에서는 동일한 리터럴 문자열에 대해 동일한 객체 참조.

- str3는 new 키워드를 사용하여 새로운 문자열 객체를 생성.

 

▶ == 연산자는 객체의 주소값을 비교하고, eqauls 메서드는 비교하는 두 대상의 값을 비교.

 

1) str1 == str2

 - str1과 str2는 동일한 리터럴을 가리키므로 true.

 

2) str1 == str3

 - str1과 str3는 서로 다른 객체를 참조하므로 false.

 

3) str1.equals(str3)

 - str1과 str3는 같은 문자열을 가지므로 true.

 

4) str2.equals(str3)

 - str2와 str3은 같은 문자열을 가지므로 true.

 

[출력]

true
false
true
true

 

[3회]

 

1. 다음은 자바 코드이다. 출력 결과를 쓰시오.

public class Soojebi {
	public static void main(String[] args) {
		Parent c = new Child();
		c.paint();
		c.draw();
	}
}

class Parent {
	public void paint() {
		System.out.print("A");
		draw();
	}
	public void draw() {
		System.out.print("B");
		draw();
	}
}

class Child extends Parent {
	public void paint() {
		super.draw();
		System.out.print("C");
		this.draw();
	}
	public void draw() {
		System.out.print("D");
	}
}

 

▶ 오버라이딩 함수

 - 하위클래스에서 상위클래스의 메서드를 재정의하는 과정.

 - 하위클래스의 오버라이딩 메서드는 상위클래스 메서드보다 우선순위 높음.

 

▶ 예약어

 - super : 상위 클래스를 호출하는 예약어.

 - this : 객체 자기 자신을 의미하는 예약어.

 

▶ 실행

 ① Parent c = new Child();

     - 상위클래스 타입으로 하고, 하위클래스 객체를 생성. 즉 하위클래스가 상위클래스 타입으로 변환.

 ② c.paint();

     - paint메서드는 상위, 하위클래스에 가지고 있음

     - 하지만 하위클래스 메서드가 상위클래스 메서드보다 우선순위 높으므로 하위클래스의 paint 메서드를 실행.

 ③ paint()

     - paint() 메서드에 super.draw(); 먼저 실행

     - super.draw();는 상위클래스의 draw() 메서드를 실행. 

 ④ draw()

     - 상위클래스의 draw() 메서드 실행하면 B를 출력.

     - 그러고 draw(); 메서드를 실행하는데 이때 draw도 하위클래스의 메서드 우선순위가 높으므로 하위클래스의 draw() 메서드 실행.

 ⑤ draw()

     - 하위클래스의 draw() 메서드 실행하면 D를 출력.

 ⑥ paint()

     - 상위, 하위 클래스의 draw() 메서드가 끝났으면 호출한 곳으로 이동.

     - 그러고 C를 출력.

     - this.draw();를 실행하면 객체 자기 자신을 의미하므로 자신의 draw() 메서드로 이동하여 D를 출력.

 ⑦ c.draw();

     - c.paint();가 다 끝났으면 호출한 곳으로 이동하여 다음 코드 실행.

     - c.draw();는 하위클래스의 draw() 메서드로 이동하여 D를 출력 후 종료.

 

[출력]

BDCDD

 

4. 다음은 C언어 코드이다. 출력 결과를 쓰시오,

#include<stdio.h>

int perfect_number(int n) {
	int i, sum = 0;
	for (i = 1; i <= n / 2; i++) {
		if (n % i == 0)
			sum += i;
	}
	if (n == sum)
		return 1;

	return 0;
}
int main() {
	int i, sum = 0;
	for (i = 2; i <= 100; i++) {
		if (perfect_number(i))
			sum += i;
	}
	printf("%d ", sum);
	return 0;
}

 

▶ 완전수를 구하여 구 수의 합을 구하는 코드.


1) int i, sum = 0;

 - 정수형 변수 i, sum 선언하면서 sum = 0으로 초기화.

 

2) for문

 ① i = 2 일 때 if문 조건 확인하면 if(perfect_number(2)) 실행.

     perfect_number(2) 함수를 실행하면 n = 1, i, sum = 0

     ⓐ i = 1 일 때 if문 조건 확인하면 2 % 2 == 0은 참이므로 sum = sum + i = 0 + 1 = 1.

     ⓑ i = 2 일 때 조건이 맞지 않으므로 for문 종료.

    다음 문장인 if문 조건 확인하면 2 == 1은 거짓이므로 return 0을 반환.

 

 ② i = 3 일 때 if문 조건 확인하면 if(perfect_number(3)) 실행.

     perect_number(3) 함수를 실행하면 n = 3, i, sum = 0

     ⓐ i = 1 일 때 if문 조건 확인하면 3 % 2 == 0은 거짓이므로 다음 반복문 실행.

     ⓑ i = 2 일 때 조건이 맞지 않으므로 for문 종료.

     다음 문장인 if문 조건 확인하면 3 == 0은 거짓이므로 return 0을 반환.

 

이런 식으로 진행하다 보면 완전수인 6, 28의 수를 구할 수 있고 이 두 수의 합을 출력하므로 6 + 28 = 34.

 

[출력]

34

 

8. 다음은 자바 코드이다. 출력 결과를 쓰시오,

public class Soojebi {
	public static void main(String[] args) {
		int sum = fact(7);
		System.out.println(sum);
	}
	public static int fact(int n) {
		if (n==1) {
			return 1;
		}
		else {
			return n * fact(n-1);
		}
	}
}

 

▶ 재귀함수 코드.

 

1) int sum = fact(7);

 - 정수형 변수 sum을 선언하면서 fact(7) 함수의 값을 대입.

 

2) fact 함수

 ① n = 7 일 때

     - if문 조건 확인하면 7 == 1은 거짓이므로 else문 실행.

     - return 7 * fact(6)

 ② n = 6 일 때

     - if문 조건 확인하면 6 == 1은 거짓이므로 else문 실행.

     - return 6 * fact(5)

 ③ n = 5 일 때

     - if문 조건 확인하면 5 == 1은 거짓이므로 else문 실행.

     - return 5 * fact(4)

 ④ n = 4 일 때

     - if문 조건 확인하면 4 == 1은 거짓이므로 else문 실행.

     - return 4 * fact(3)

 ⑤ n = 3 일 때

     - if문 조건 확인하면 3 == 1은 거짓이므로 else문 실행.

     - return 3 * fact(2)

 ⑥ n = 2 일 때

     - if문 조건 확인하면 2 == 1은 거짓이므로 else문 실행.

     - return 2 * fact(1)

 ⑦ n = 1 일 때

     - if문 조건 확인하면 1 == 1은 참이므로 return 1을 반환.

 

따라서 차례대로 계산하면 1 * 2 * 3 * 4 * 5 * 6 * 7  = 5040

 

[출력]

5040

 

10. 다음은 C언어 코드이다. 출력 결과를 쓰시오.

#include<stdio.h>

int main() {
	char* p = "KOREA";
	printf("%s\n", p);
	printf("%s\n", p + 1);
	printf("%c\n", *p);
	printf("%c\n", *(p + 3));
	printf("%c\n", *p + 4);

	return 0;
}

 

1) char* p = "KOREA";

 - 문자열 리터럴 "KOREA"를 가리키는 포인터 p 선언.

 

2) printf("%s\n", p);

 - p가 가리키는 문자열 전체 출력.

 - 따라서 KOREA를 출력.

 

3) printf("%s\n", p + 1);

 - p + 1이 가리키는 문자열 전체 출력.

 - 현재 p는 K를 가리키고 있고, 그다음 O를 가리키는 문자열 전체를 출력하므로 OREA를 출력.

 

4) printf("%c\n", *p);

 - 현재 p는 K를 가리키고 있으므로 K를 출력.

 

5) printf("%c\n", *(p + 3));

 - 현재 P는 K를 가리키고 있고, p+3하면 p에서 네 번째 문자에 해당하는 값인 E를 출력.

 

6) printf("%c\n", *p + 4);

 - 현제 p는 K를 가리키고 있고, ASCII 값에서 4를 더한 값을 출력.

 - K, L, M, N, O이므로 +4 하면 O를 출력.

 

[출력]

KOREA
OREA
K
E
O

 

11. 다음은 C언어 코드이다. 출력 결과를 쓰시오.

#include<stdio.h>

int soojebi(int n) {
	if (n <= 1) {
		return n;
	}
	else {
		return soojebi(n - 1) + soojebi(n - 3);
	}
}
int main() {
	printf("%d", soojebi(7));
	return 0;
}

 

1) printf("%d", soojebi(7));

 - soojebi() 함수를 호출하며 정수값으로 출력.

 

2) soojebi 함수

 ① n = 7 일 때

     - if문 조건 확인하면 7 <= 1 거짓이므로 else문 실행.

     - soojebi(6) + soojebi(4)

 ② n = 6 일 때

     - if문 조건 확인하면 6 <= 1 거짓이므로 else문 실행.

     - soojebi(5) + soojebi(3)

 ③ n = 5 일 때

     - if문 조건 확인하면 5 <= 1 거짓이므로 else문 실행.

     - soojebi(4) + soojebi(2)

 ④ n = 4 일 때

     - if문 조건 확인하면 4 <= 1 거짓이므로 else문 실행.

     - soojebi(3) + soojebi(1)

 ⑤ n = 3 일 때

     - if문 조건 확인하면 3 <= 1 거짓이므로 else문 실행.

     - soojebi(2) + soojebi(0)

 ⑥ n = 2 일 때

     - if문 조건 확인하면 2 <= 1 거짓이므로 else문 실행.

     - soojebi(1) + soojebi(-1)

 ⑦ n = 1 일 때

     - if문 조건 확인하면 1 <= 1 참이므로 return n을 반환하고, n = 1이므로 1을 반환.

 ⑧ n = -1일 때

     - if문 조건 확인하면 -1 <= 1 참이므로 return n인 -1을 반환.

     - 따라서 n = 2일 때 1 + (-1) = 0.

 ⑨ n = 0 일 때

     - if문 조건 확인하면 0 <= 1 참이므로 return n인 0을 반환.

     - 따라서 n = 3일 때 0 + 0 = 0.

 

soojebi(1) + soojebi(-1) + soojebi(0) + soojebi(1) + soojebi(1) + soojebi(-1) + soojebi(1) + soojebi(-1) + soojebi(0) + soojebi(1) + soojebi(-1) + soojebi(0) + soojebi(1) = 1 + (-1) + 0 + 1 + 1 + (-1) + 1 + (-1) + 0 + 1 + (-1) + 0 + 1 = 2


 

 

14. 다음은 파이썬 언어이다. 밑줄 친 빈칸에 들어갈 메서드를 쓰시오.

num1, num2 = input()._______()
print(num1)
print(num2)

(입력값)

hello soojebi

 

(출력값)

hello

soojebi

 

: split

 

▶ split은 공백을 구분 하여 문자열을 분할.