본문 바로가기

Studying/정보처리기사

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

[1회]

 

12. 

#include<stdio.h>

void main() {
	int i, j;
	int temp;
	int a[5] = { 75, 95, 85, 100, 50 };
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4 - i; j++) {
			if (a[j] > a[j + 1]) {
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	for (i = 0; i < 5; i++) {
		printf("%d ", a[i]);
	}
}

 

1) int i, j; int temp;

 : 정수형 변수 i, j, temp 선언.

 

2) int a[5] = { 75, 95, 85, 100, 50 };

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

 

3) for문

 

① i = 0 일 때

        j = 0 일 때

           if (a[0] > a[1]) = if (75 > 95)는 거짓이므로 if문 아래 실행하지 않고 다음 반복문 진행.

        j = 1 일 떄

           if (a[1] > a[2] = if (95 > 85)는 참이므로 if문 실행.

           temp = a[1] = 95;

           a[1] = a[2] = 85;

           a[2] = temp = 95;

           a[1]과 a[2]의 자리가 바뀌어서 { 75, 85, 95, 100, 50 }

        j = 2 일 때

           if (a[2] > a[3]) = if (95 > 100)은 거짓이므로 if문 아래 실행하지 않고 다음 반복문 진행.

        j = 3 일 때

           if (a[3] > a[4]) = if (100 > 50)은 참이므로 if문 실행.

           temp = a[3] = 100;

           a[3] = a[4] = 50;

           a[4] = temp = 100;

           a[3]과 a[4]의 자리가 바뀌어서 { 75, 85, 95, 50, 100}

        j = 4 일 때 조건 만족하지 않으므로 안쪽 for문 빠져나옴.

 

 ② i = 1 일 때

        j = 0 일 때

           if (a[0] > a[1]) = if (75 > 85)는 거짓이므로 if문 아래 실행하지 않고 다음 반복문 진행.

        j = 1 일 때

           if (a[1] > a[2]) = if (85 > 95)는 거짓이므로 if문 아래 실행하지 않고 다음 반복문 진행.

        j = 2 일 때

           if (a[2] > a[3]) = if (95 > 50)은 참이므로 if문 실행

           temp = a[2] = 95;

           a[2] = a[3] = 50;

           a[3] = temp = 95;

           a[2]와 a[3]의 자리가 바뀌어서 { 75, 85, 50, 95, 100 }

        j = 3 일 때 조건 만족하지 않으므로 안쪽 for문 빠져나옴.

 

이런식으로 진행하면 오름차순으로 정렬하는 버블 정렬 알고리즘이어서 출력 결과는 50 75 85 95 100이 나옴.

 

[출력]

50 75 85 95 100

 

13.

public class Soojebi {
	public static void main(String[] args) {
		int i;
		int a[] = {0, 1, 2, 3};
		for(i=0; i<4; i++) {
			System.out.print(a[i] + " ");
		}
	}
}

 

1) int i;

 : 정수형 i 선언

 

2) int a[] = {0, 1, 2, 3};

 : 정수형 배열 선언하면서 초기화

 

3) for문

 : for문 돌리면서 배열을 출력.

 

[출력]

0 1 2 3

 

14.

public class Soojebi {
	public static void main(String[] args) {
		int i = 3;
		int k = 1;
		switch (i) {
		case 0:
		case 1:
		case 2:
		case 3: k = 0;
		case 4 : k += 3;
		case 5 : k-= 10;
		default : k--;
		}
		System.out.println(k);
	}
}

 

1) int i = 3;

 : 정수형 i 선언하면서 3으로 초기화.

 

2) int k = 1;

 : 정수형 k 선언하면서 1로 초기화.

 

3) switch문

 : i는 3이므로 case 3으로 가서 k값을 계산하면 되는데 case 3만 계산하는 것이 아닌 default까지 k값 계산해야 함.

   그 이유는 break문이 없어서 아래 모든 case가 연속적으로 실행되기 때문.

   따라서 k = 0 → k += 3하면 k = 3 → k -= 10하면 k = -7 → k-- 하면 k = -8

 

[출력]

-8

[2회]

 

02.

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({'홍콩', '한국', '태국})

 : {'홍콩', '한국', '태국'}을 추가하는데 '한국'은 이미 있으므로 '한국' 제외하고 '홍콩', '태국'만 추가.

 

출력할 때 집합은 순서가 없으므로 출력 순서는 다를 수 있음.

 

[출력]

{'중국', '태국', '베트남', '홍콩', '한국'}

 


 

19.

class A {
	private int a;
	public A(int a) {
		this.a = a;
	}
	public void display() {
		System.out.println("a=" + a);
	}
}
class B extends A {
	public B(int a) {
		super(a);
		super.display();
	}
}
public class Soojebi {
	public static void main(String[] args) {
		B obj = new B(10);
	}
}

 

1) class A

 ① private int a : 정수형 변수 a 선언했는데 접근제어자인 private로 선언. private는 외부에서 직접 접근 불가능.

 ② public A(int a) : 매개변수로 받은 값을 this.a에 저장.

 ③ display() 메서드 : 필드 a의 값을 출력하는 역할

 

2) class B

 ① B는 A를 상속받음. A의 생성자를 호출하는 방식으로 필드 a를 초기화.

 ② super(a) : 부모 클래스의 생성자를 호출.

 ③ super.display() : 부모클래스의 display() 메서드 실행

 

3) main

 ① B obj = new B(10) : B 클래스의 객체 obj를 생성하고, 생성 시 B(10) 생성자가 호출되면서 A 클래스의 생성자와 display() 메서드 호출.

 ② 즉, B클래스 생성자가 호출되고, super(a)로 부클래스 A의 생성자가 호출되면서 this.a = 10이 됨.

 ③ super.display()가 실행되며, A 클래스의 display() 메서드가 호출되어 a = 10이 출력.

 

[출력]

a=10

[3회]

 

02.

#include<stdio.h>

void main() {
	int i = 0, c = 0;
	while (i < 10) {
		i++;
		c *= i;
	}
	printf("%d", c);
}

 

1) int i = 0, c = 0;

 : 정수형 변수 i, c 선언하면서 각각 0으로 초기화.

 

2) while (i < 10)

 : i가 10이 되기 전까지 반복문 실행.

 

3) i++;, c *= i;

 : i는 ++연산 만나면서 증가하지만 c는 0이어서 어떠한 값을 곱해서 0이 됨.

 

[출력]

0

 

13.

#include<stdio.h>

int r1() {
	return 4;
}
int r10() {
	return (30 + r1());
}
int r100() {
	return (200 + r10());
}
int main() {
	printf("%d\n", r100());
	return 0;
}

 

1) main 함수에서 r100() 호출.

2) r100() 함수로 가면 return  값은 200 + r10().

3) r10() 함수로 가면 return  값은 30 + r1().

4) r1() 함수로 가면 return 값은 4.

5) 따라서 4 + 30 + 200 = 234

 

[출력]

234

 

15.

abstract class Vehicle {
	private String name;
	abstract public String getName(String val);
	public String getName() {
		return "Vehicle name: " + name;
	}
	public void setName(String val) {
		name = val;
	}
}
class Car extends Vehicle {
	public Car(String val) {
		setName(val);
	}
	public String getName(String val) {
		return "Car name: " + val;
	}
	public String getName(byte val[]) {
		return "Car name: " + val;
	}
}
public class Soojebi {
	public static void main(String[] args) {
		Vehicle obj = new Car("Spark");
		System.out.println(obj.getName());
	}
}

 

1) abstact class Vehicle 

 ① Vehicle은 추상 클래스로 인스턴스화할 수 없음.

 ② name 필드는 private 접근 제어자로 선언되었으며, 이를 수정하고 가져올 수 있는 setName과 getName 메서드 제공.

 ③ getName(String val)는 추상 메서드로 선언되어 자식 클래스에서 반드시 구현해야 함.

 ④ getName() 메서드는 이름을 반환하는 기본 메서드로, 필드 name 사용.

 

2) class Car

 ① Car는 Vehicle을 상속받음(부모가 가진 private한 것 빼고는 모든 것을 가지고 와서 사용 가능).

      public Car(String val) : 부모 클래스의 setName 메서드를 호출하여 name 필드를 설정하는 생성자 가지고 있음.

 ② 추상 메서드 getName(String val)를 구현하여 Car의 이름을 변환하는 기능 제공.

 ③ getName(byte[] val) : String val과는 다른 시그니처를 가지고 있는 오버로딩된 메서드.

 

3) main 메서드

 ① Vehicle obj = new Car("Spark") : Car 클래스 객체 생성 후, 이를 Vehicle 타입의 참조 변수 obj로 가리킴.

 ② System.out.println(obj.getName()) ; Vehicle 클래스에서 구현된 getName() 메서드를 호출 후 name 필드의 값을 반환.

 

 ③ 따라서 new Car("Spark")가 호출되면 Car 클래스의 생성자가 실행되어 setName("Spark")이 호출 후 name 필드가 "Spark"로 설정.

 ④ obj.getName()은 부모 클래스인 Vehicle의 getName() 메서드를 호출 함. 이 메서드는 필드 name 값을 사용하여 "Vehicle name: "을 출력.

 

주의할 점)

 : Vehicle obj = new Car("Spark") 이것을 보면 아버지가 날 낳은 형태로 아버지가 가지고 있는 것만 사용 가능.

  즉 Vehicle의 메서드인 getName만 사용가능하고, Car가 가지고 있는 getName은 사용할 수 없다는 것.

  따라서 obj.getName('a')라고 작성하면 오류남.

 

[출력]

Vehicle name: Spark

 

17.

package information;

public class Soojebi {
	public static void main(String[] args) {
		int i = 0;
		int sum = 0;
		while(i < 10) {
			i++;
			if(i % 2 == 1)
				continue;
			sum += i;
		}
		System.out.println(sum);
	}
}

 

1) int i = 0; int sum = 0;

 : 정수형 변수 i, sum 선언 후 각각 0으로 초기화.

 

2) while문

 ① i = 0 일 때

    - i++로 i = 1.

    - if문 조건 확인 : 1 % 2 == 1은 참이므로 continue로 인해 다시 반복문 처음으로 감.

 ② i = 1 일 때

     - i++로 i = 2.

     - if문 조건 확인 : 2 % 2 == 1은 거짓이므로 아래 문장 실행.

     - sum = sum + i = 0 + 2 = 2. (sum = 2)

 ③ i = 2 일 때

     - i++로 i = 3.

     - if문 조건 확인 : 3 % 2 == 1은 참이므로 continue로 인해 다시 반복문 처음으로 감.

 ④ i = 3 일 때

     - i++로 i = 4;

     - if문 조건 확인 : 4 % 2 == 1은 거짓이므로 아래 문장 실행.

     - sum = sum + i = 2 + 4 = 6. (sum = 6)

 

이렇게 반복문 진행하면 i가 2, 4, 6, 8, 10일 때 sum += i가 실행하므로 2 + 4 + 6 + 8 + 10 = 30을 출력.

 

[출력]

30

[4회]

 

05.

[출력결과]

00001010

 

public class Soojebi {
	public static void main(String[] args) {
		int []a = new int[8];
		int i=0; int n=10;
		while (  ①  ) {
			a[i++] =  ②  ;
			n /= 2;
		}
		for (i=7; i>-0; i--) {
			System.out.println(a[i]);
		}
	}
}

 

① n > 0

② n % 2


 

06.

[출력 결과]

1 4 7 10 13

2 5 8 11 14

3 6 9 12 15

public class Soojebi {
	public static void main(String[] args) {
		int [][]a = new int[①][②];
		for(int i=0; i<3; i++) {
			for(int j=0; j<5; j++) {
				a[i][j] = j*3+(i+1);
				System.out.print(a[i][j] + " ");
			}
			System.out.println();
		}
	}
}

 

① 3

② 5


 

09.

lol = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
print(lol[0])
print(lol[2][1])
for sub in lol :
	for item in sub :
		print(item, end = '')
    print()

 

1) lol = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] : lol 리스트 선언하면서 초기화.

1
lol[0][0]
2
lol[0][1]
3
lol[0][2]
 
4
lol[1][0]
5
lol[1][1]
   
6
lol[2][0]
7
lol[2][1]
8
lol[2][2]
9
lol[2][3]

 

2) 출력

 ① print(lol[0]) : 첫 번째 행이 모두 출력. [1, 2, 3]

 ② print(lol[2][1]) : 위에서 메모리에 할당된 값은 7.

 

3) for문

 ① for sub in lol : sub라는 변수에 lol이라는 행들을 반복해서 저장.

 ② for item in sub : sub라는 요소만큼 반복하고, sub라는 요소들이 차례대로 item에 저장.

 

[출력]

[1, 2, 3]
7
123
45
678

 

18.

#include<stdio.h>

void main() {
	char *p = "KOREA";
	printf("%s\n", p);
	printf("%s\n", p + 3);
	printf("%c\n", *p);
	printf("%c\n", *(p + 3));
	printf("%c\n", *p + 2);
}

 

1) 포인터 변수 p 선언하면서 "KOREA" 저장.

P   K O R E A

 

p는 100번지로 가정.

 

2) 출력

 ① printf("%s\n", p); → 포맷 스트링이 %s로 문자열을 출력하라는 의미. p주소부터 Null 만나기 전까지의 값을 출력하므로 KOREA.

 ② printf("%s\n", p + 3); → p+3은 p가 현재 100번지이므로 +3하면 103번지부터 Null 만나기 전까지의 값을 출력. EA

 ③ printf("%c\n", *p); → 포맷 스트링이 %c로 문자를 출력하라는 의미. p는 현재 100번지이므로 100번지인 K값 출력.

 ④ printf("%c\n", *(p + 3)); → p + 3의 값을 출력하므로, p는 100번지이고 +3하면 103번지의 값을 출력하므로 E를 출력.

 ⑤ printf("%c\n", *p + 2); → p의 값에서 +2한 문자를 출력 p는 현재 100번지이므로 K값에 +2한 K, L, M인 M을 출력.

 

[출력]

KOREA
EA
K
E
M

 

19.

class Parent {
	public int compute(int num) {
		if (num<=1) return num;
		return compute(num-1) + compute(num-2);
	}
}
class Child extends Parent {
	public int compute(int num) {
		if (num<=1) return num;
		return compute(num-1) + compute(num-3);
	}
}
public class Soojebi {
	public static void main(String[] args) {
		Parent obj = new Child();
		System.out.println(obj.compute(4));
	}
}

 

- 오버라이딩(Overriding) : 상위클래스로부터 상속받은 메서드를 하위클래스에서 재정의 → 매서드이름, 매개변수, 반환 타입은 동일해야 함.

- 오버로딩(Overloaing) : 메서드 이름은 동일하나 매개변수 개수 또는 타입을 다르게 지정.

 

▶ 메서드 오버라이딩의 형태(인자값의 개수가 같이 때문)

 

아버지가 날 낳은 형태로, 아버지가 가진 메서드만 사용가능하지만 자식이 메서드를 재정의 했으므로 자식이 재정의한 메서드를 사용해야 함.

 

1) obj.compute(4)

 - 자식 클래스의 compute 메서드가 실행. 

   ① compute(4) 호출 : 4 > 1이므로, compute(3) + compute(1)을 계산.

   ② compute(3) 호출 : 3 > 1이므로, compute(2) + compute(0)을 계산.

   ③ compute(2) 호출 : 2 > 1이므로, compute(1) + compute(-1)을 계산.

   ④ compute(1) 호출 : 1 <= 1이므로 1을 반환.

   ⑤ compute(0) 호출 : 0 <= 1이므로 0을 반환.   ⑥ compute(-1) 호출 : -1 <= 1이므로 -1을 반환.

 

따라서 compute(4) = compute(3) + compute(1) = (compute(2) + compute(0)) + 1 = ((1 + (-1)) + 0 ) + 1 = 1

 

[출력]

1