본문 바로가기

Studying/정보처리기사

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

[1회]

 

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

class A {
	int a;
	int b;
}

public class Soojebi {
	static void func1(A m) {
		m.a *= 10;
	}
	static void func2(A m) {
		m.a += m.b;
	}
	public static void main(String[] args) {
		A m = new A();
		m.a = 100;
		func1(m);
		m.b = m.a;
		func2(m);
		
		System.out.printf("%d", m.a);
	}
}

 

1) class A

 - 정수형 변수 a, b 선언.

 

2) class Soojebi

 - A m = new A(); → A클래스의 인스턴스인 m을 생성. 이 인스턴스는 a와 b 두 개의 멤버 변수 가짐.

 - m.a = 100; → m 인스턴스의 a 멤버 변수에 100을 할당. 따라서 m.a = 100이 됨.

 - func1(m);

     → func1 함수를 호출하는데 A 클래스의 인스턴스 받아서 해당 인스턴스의 a 값을 10을 곱함. 따라서 m.a = 1000이 됨.

     → m.a = m.a * 10 = 100 * 10 = 1000.

 - m.b = m.a; → m.a 값을 m.b에 할당하므로 m.b = 1000이 됨.

 - func2(m);

     → func2 함수를 호출하는데 A 클래스의 인스턴스 받아서 해당 인스턴스의 a값을 a와 b의 합으로 만듦.

     → m.a = m.a + m.b = 1000 + 1000 = 2000.

 - System.out.printf("%d", m.a);

     → m.a의 값을 정수값으로 출력하므로 현재 m.a의 값은 2000이기 때문에 2000을 출력.

 

[출력]

2000

 

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

def func(num1, num2=2) :
	print('a=', num1, 'b=', num2)

func(20)

 

1) def func(num1, num2=2) :

 - func라는 함수 정의.

 - num1, num2 두 개의 매개 변수 가짐.

 - num2의 초기값은 2로 설정. 

 

2) print('a=', num1, 'b=', num2)

 - 함수 내에서 실행하는 코드로, print 함수 사용하여 num1과 num2 값을 출력.

 

3) func(20)

 - 함수를 호출하는 부분.

  - func 함수를 호출하면서 값 1개만 전달되었으므로 num1로만 값을 전달.

  - 따라서 num1은 20이 되고, num2에는 값을 전달하지 않았으므로 그대로 2를 출력.

 

[출력]

a= 20, b= 2

 

11. 다음은 스레드에 관한 코드이다. 밑줄 친 곳에 알맞은 코드를 쓰시오.

class Car implements Runnable{
	int a;
	public void run() {
		// ...
	}
}

public class Soojebi {
	public static void main(String[] args) {
		Thread t1 = new Thread(new _____());
		t1.start();
	}
}

 

1) Thread t1 = new Thread(new _____());

 - Runnable은 인터페이스이고, new 다음에는 클래스 이름이 와야 함.

 - 따라서 Car 클래스의 인스턴스를 생성하여 Thread 생성자에 전달해야 하는데, 이를 통해 Car 객체가 Runnable로 사용.

 - 이렇게 하는 이유는 Java에서 스레드를 관리하고 실행하기 위해 스레드 클래스에 Runnable 인터페이스를 구현한 개체를 전달해 사용하는 것이 일반적인 패턴.

 - Thread 스레드변수 = new 상속받은 스레드클래스();

 - Thread 스레드변수 = new Thread(new 상속받은 스레드클래스());

 

[정답]

Car


 

14. 다음 소스 코드에 입력값이 5가 들어왔을 때 출력값을 쓰시오.

#include<stdio.h>

int fn(int a) {
	if (a <= 1) return 1;
	return a * fn(a - 1);
}
void main() {
	int a;
	scanf("%d", &a);
	printf("%d", fn(a));
}

 

1) int a; → 정수형 변수 a 선언

2) scanf("%d", &a);

 - 사용자로부터 정수값을 입력받아 a 변수에 저장. 문제에서 입력값이 5이므로 a는 5가 됨.

 - scanf 함수를 사용하면 a의 주소값을 입력해야 함.

3) printf("%d", fn(a));

 - fn 함수 호출하면서 a값을 인자로 전달.

 

4) fn 함수

 ① a = 5 일 때 5 * fn(4);

 ② a = 4 일 때 4 * f(3);

 ③ a = 3 일 때 3 * f(2);

 ④ a = 2 일 때 2 * f(1);

 ⑤ a = 1 일 때 a <= 1이므로 return 1을 반환.

 

 따라서 계산하면 1 * 2 * 3 * 4 * 5 = 120을 출력.

fn 함수는 재귀함수임을 알 수 있음.

 

[출력]

120

 

15. 밑줄 친 곳에 연산자 이용해 정수를 역순으로 출력하는 프로그램을 완성하시오. 예를 들어 1234의 역순은 431이고, 1230처럼 0으로 끝나는 정수는 고려하지 않는다.

#include<stdio.h>

void main() {
	int number = 1234;
	int div = 10;
	int result = 0;

	while (number __①__ 0) {
		result = result * div;
		result = result + number __②__ div;
		number = number __③__ div;
	}
	printf("%d", result);
}

 

① >

② %

③ /

 

①은 > (또는 !=) 연산자가 들어와야 함. 현재 숫자가 0보다 큰지 조건을 확인하며 while 루프를 계속 실행할지 결정해야 하기 때문. - result는 현재 0으로 초기화 되어 있고, result = result * div = 0 * 10 = 0으로 연산에는 아직 영향을 주지 않음.

②는 % 연산자가 들어와야 함. result를 출력할 때 역순으로 출력해야 하므로 div로 나눴을 때 나머지값이 나와야 하기 때문.

 - result = result + num % div = 0 + 1234 % 10 = 4이므로 현재 result = 4를 저장.

③은 / 연산자가 들어와야 함. 맨 뒷자리 수를 제거해야 하기 때문. 

 

따라서 실행하게 되면,

int number = 1234;

int div = 10;

int result = 0;

 

1)

ressult = result * div = 0 * 10 = 0

result = result + number % div = 0 + 1234 % 10 = 4

number = number / div = 1234 / 10 = 123

 

2)

result = result * div = 4 * 10 = 40

result = result + number % div = 40 + 123 % 10 = 43

number = numberr / div = 123 / 10 = 12

 

3)

result = result * div = 43 * 10 = 430

result = result + number % div = 430 + 12 % 10 = 432

number = number / div = 12 / 10 = 1

 

4)

result = result * div = 432 * 10 = 4320

result = result + number % div = 4320 + 1 % 10 = 4321

number = number / div = 1 / 10 = 0


 

19. 다음 소스 코드가 실행될 때 출력값을 적으시오.

#include<stdio.h>

int isPrime(int number) {
	int i;
	for (i = 2; i < number; i++) {
		if (number % i == 0) return 0;
	}
	return 1;
}
void main() {
	int number = 13195, max_div = 0, i;
	for (i = 2; i < number; i++)
		if (isPrime(i) == 1 && number % i == 0)
			max_div = i;
	printf("%d", max_div);
}

 

▶ 이 코드는 13195의 가장 큰 소인수를 찾는 프로그램.

 

① i = 2 일 때

 - isPrime(2) 호출 시, 2는 소수이므로 1을 반환.

 - main 함수로 돌아와 if문 실행했을 때 number % 2는 13195를 2로 나눈 난머지인 1을 반환함.

 - 따라서 max_div는 업데이트되지 않고 결과적으로 0을 출력.

 

② i = 3 일 때

 - isPrime(3) 호출 시, 3은 소수이므로 1을 반환.

 - main 함수로 돌아와 if문 실행했을 때 number % 3은 13195를 3으로 나눈 나머지인 2를 반환함.

 - 따라서 max_div는 없데이트 되지 않고, 결과적으로 0을 출력.

 

③ i = 4 일 때

 - isPrime(4) 호출 시, 4는 소수가 아니므로 0을 반환.

 - main 함수로 돌아와 if문 조건 확인 했을 때 앞에 조건은 0인 거짓이므로 뒤에 문장 실행하지 않음.

 - 따라서 max_div는 업데이트 되지 않고, 결과적우로 0을 출력.

 

④ i = 5 일 때

 - isPrime(5) 호출 시, 5는 소수이므로 1을 반환.

 - main 함수로 돌아와 if문 실행했을 때 number % 5는 13195를 5로 나눈 나머지인 0을 반환.

 - 이 때 if문 조건은 참이므로 max_div는 i인 5로 업데이트되며, 결과적으로 5를 출력.

 

이런 식으로 진행하다 보면 가장 큰 수인 29를 출력함.

 

[출력]

29

 

[2회]

 

7. 다음 JAVA 코드의 실행 결과를 쓰시오.

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

 

1) int i = 3; int k = 1;

 - 정수형 변수 i, k 선언하고 i에는 3, k에는 1로 초기화.

 

2) switch문

 - i의 값은 3이므로 case 3에서 시작.

 - case 3은 k = 0

 - case 4에는 k += 3이므로 k = k + 3 = 0 + 3 = 3. 따라서 k = 3

 - case 5에는 k -= 10이므로 k = k - 10 = 3 - 10 = -7. 따라서 k = -7

 - default에는 k--이므로 -7 -1 = -8. 따라서 k = -8을 출력.

 

현재 switch문에서 각각의 case 값에 break가 없기 때문에 해당하는 case에서 쭉 내려와서 계속 실행한 것.

default는 있기 때문에 무조건 실행. case 다른 구문에서 break 있어서 끝나도 deault는 실행하고 끝내야 함.

 

[출력]

-8

 

8. 다음은 C언어 코드이다. 실행 결과를 쓰시오.

#include<stdio.h>
struct student {
	int n, g;
};
int main() {
	struct student st[2];
	int i = 0;
	for (i; i < 2; i++) {
		st[i].n = i;
		st[i].g = i + 1;
	}
	printf("%d", st[0].n + st[1].g);
	return 0;
}

 

1) student 구조체를 정의하며, 이 구조체에는 n, g라는 두 개의 멤버 변수 정의.

 

2) struct student st[2];

 - 구조체 student로 이루어진 배열의 길이가 2인 st 선언.

 

3) int i = 0;

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

 

4) for문

 ① i = 0 일 때

    - st[0].n = 0;

    - st[0].g = i + 1 = 0 + 1 =1이므로 st[0].g = 1;

 ② i = 1 일 때

    - st[1].n = 1

    - st[1].g = i + 1 = 1 + 1 = 2이므로 st[1].g = 2;

 

st st[[0] st[1]
n g n g
0 1 1 2

 

5) 출력

 ① st[0].n은 0이고, st[1].g는 2이므로 1 + 2 = 3을 출력.

 

[출력]

2

 

14. 다음 Python 코드의 실행 결과를 쓰시오.

a = "REMEMBER NOVEMBER"
b = a[:3] + a[12:16]
c = "R AND %s"%STR"
print(b + c)

 

1) a = "REMEMBER NOVEMBER"

 - 문자열 "REMEMBER NOVEMBER"를 변수 a에 저장.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
 R E M E M B E R   N O V E M B E R

 

2) b = a[:3] + a[12:16]

 ① a[:3]은 0번째부터 2번째까지 출력하는 것으로 "REM"

 ② a]12:16]은 12번째부터 15번째까지 출력하는 것으로 "EMBE"

 - 따라서 출력결과는 "REMEMBE"가 b에 저장.

 

3) c = "R AND %s"%STR"

 - %s에 "STR" 문자열로 대체한 결과가 저장되므로 c에는 R AND STR을 저장.

 

4) 출력

b + c이므로 b인 "REMEMBE"와 c인 R AND STR을 합치면 REMEMBER AND STR을 출력.

 

[출력]

REMEMBER AND STR

 

15. 다음은 C언어 코드이다. 실행 결과를 쓰시오,

#include<stdio.h>
int len(char* p);
int main() {
	char *p1 = "2022";
	char *p2 = "202207";
	printf("%d", len(p1) + len(p2));
	return 0;
}
int len(char* p) {
	int r = 0;
	while (*p != '\0') {
		p++;
		r++;
	}
	return r;
}

 

1) char *p1 = "2022"

 - 포인터 변수 p1은 "2022"를 저장하고, 맨 첫 번째 문자 "2"를 가리킴.

 

2) char *p2 = "202207"

 - 포인터 변수 p2는 "202207"을 저장하고, 맨 첫번째 문자 "2"를 가리킴.

 

▶ 문자열은 null문자(\0)로 끝나며, 문자열의 끝을 나타냄

 

3) printf("%d", len(p1) + len(p2));

 ① len(p1) : p1의 문자열 "2022"의 길이는 4

 ② len(p2) : p2의 문자열 "202207"의 길이는 6

 따라서 4 + 6 = 10을 출력.

 

[while문]

 

- p가 null문자 만날 때까지 p와 r의 값을 증가시킴.

- 따라서 p1은 null문자 만나기 전인 4를 반환함. ("2022")

- p2는 null문자 만나기 전인 6을 반환함. ("202207")


 

16. 다음은 C언어 코드이다. 실행 결과를 쓰시오.

#include<stdio.h>
void main() {
	int a[4] = { 0, 2, 4, 8 };
	int b[3];
	int* pl;
	int i, j;
	int sum = 0;
	for (i = 1; i < 4; i++) {
		pl = a + i;
		b[i - 1] = *pl - a[i - 1];
		sum = sum + a[i] + b[i - 1];
	}
	printf("%d", sum);
}

 

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

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

 - a 배열의 시작을 100번지로 가정.

a a[0] a[1] a[2] a[3]
0 2 4 8
100 101 102 103

 

2) int b[3];

 - 길이가 3인 정수형 배열 b 선언.

 

3) int *pl;

 - 정수형 포인터 배열 pl 선언.

 

4) int i, j; int sum = 0;

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

 

5) for문

 ① i = 1일 때

    - pl = a + i = 100 + 1 = 101번지. (현재 a는 100번지, i는 1의 값이므로 100 + 1 = 101)

    - b[0] = *pl - a[0] = 2 - 0 = 2. (pl의 값은 101번지의 값이므로 2를 출력하고, a[0]은 0)

    - 따라서 b[0]에는 2의 값을 저장,

    - sum = sum + a[1] + b[0] = 0 + 2 + 2 = 4이므로 sum = 4를 저장.

 ② i = 2 일 때

    - pl = a + i = 100 + 2 = 102번지.

    - b[1] = *pl - a[1] = 4 - 2 = 2.

    - 따라서 b[1]에는 2의 값을 저장.

    - sum = sum + a[2] + b[1] = 4 + 4 + 2 = 10이므로 sum = 10을 저장.

③ i = 3 일 때

    - pl = a + i = 100 + 3 = 103번지.

    - b[2] = *pl - a[2] = 8 - 4 = 4.

    - 따라서 b[2]에는 4의 값을 저장.

    - sum = sum + a[3] + b[2] = 10 + 8 + 4 = 22이므로 sum = 22를 저장.

 

[출력]

22

 

17. 다음 JAVA 코드의 실행 결과를 쓰시오.

public class Soojebi {
	int a;
	public Soojebi(int a) {
		this.a = a;
	}
	int func() {
		int b = 1;
		for(int i = 1; i < a; i++) {
			b = a * i + b;
		}
		return a + b;
	}
	public static void main(String[] args) {
		Soojebi obj = new Soojebi(3);
		obj.a = 5;
		int b = obj.func();
		System.out.println(obj.a + b);
	}
}

 

1) Soojebi obj = new Soojebi(3);

 - obj는 Soojebi 클래스의 인스턴스로 멤버 변수 a를 생성.

 - Soojebi 클래스 생성자 호출하고 있으며, 생성자에 3이라는 인자값 전달.

 

2) public Soojebi(int a)

 - 클래스명과 동일한 이름을 가진 생성자로, main 함수에서 호출하며 3이라는 인자값을 전달햇으므로 a에 3을 할당.

 

3) obj.a = 5;

 - main 함수로 돌아와 obj.a = 5는 3으로 초기화한 obj 객체의 멤버 변수 a를 5로 변경. 따라서 a에는 5.

 

4) int b = obj.func();

 - 변수 b는 main 메서드 내에서만 선언된 지역 변수.

 - main 메서드 실행이 종료되면 메모리에서 사라짐.

 - obj 인스턴스가 가지고 있는 func 메서드를 호출하게 됨.

 ▶ func의 b와 main 메서드의 b는 다른 변수!!

 

5) 함수 실행

 ① i = 1 일 때 (a는 5이므로 i < 5까지 반복)

    - b = a * i + b = 5 * 1 + 1 = 6

 ② i = 2 일 때 b = a * i + b = 5 * 2 + 6 = 16

 ③ i = 3 일때 b = a * i + b = 5 * 3 + 16 = 31

 ④ i = 4 일 때 b = a * i + b = 5 * 4 + 31 = 51

 ⑤ i = 5 일 때 조건이 거짓이므로 반복문 종료.

 ⑥ return a + b = 5 + 51 = 56을 반환하며 함수 종료.

 

6) 출력

 int b = obj.func()는 56

 따라서 obj.a는 5이고, b는 56이므로 5 + 56 = 61을 출력하게 됨.

 

[출력] 

61

 

[3회]

 

4. 다음은 JAVA 언어 코드이다. 실행 결과를 쓰시오.

public class Soojebi {
	public static void main(String[] args) {
		int[] result = new int[5];
		int[] arr = {79, 34, 10, 99, 50};
		for(int i=0; i<5; i++) {
			result[i] = 1;
			for(int j=0; j<5; j++) {
				if(arr[i] < arr[j]) result[i]++;
			}
		}
		for(int k=0; k<5; k++) {
			System.out.print(result[k]);
		}
	}
}

 

1) int[] result = new int[5];

 - 길이가 5인 정수형 배열 result 선언.

 

2) int[] arr = {79, 34, 10, 99, 50};

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

arr arr[0] arr[1] arr[2] arr[3] arr[4]
79 34 10 99 50

 

3) 첫 번째 for문

 ① i = 0 일 때

       result[0] = 1로 초기화.

       j = 0 일 때 if문 조건 확인하면 arr[0] < arr[0] = 79 < 79 조건은 거짓이므로 다음 루프 실행.

       j = 1 일 때 if문 조건 확인하면 arr[0] < arr[1] = 79 < 34 조건은 거짓이므로 다음 루프 실행.

       j = 2 일 때 if문 조건 확인하면 arr[0] < arr[2] = 79 < 10 조건은 거짓이므로 다음 루프 실행.

       j = 3 일 때 if문 조건 확인하면 arr[0] < arr[3] = 79 < 99  조건은 참이므로 result[0]에 ++ 하면 result[0] = 2.

       j = 4 일 때 if문 조건 확인하면 arr[0] < arr[4] = 79 < 50 조건은 거짓이므로 다음 루프 실행.

       j = 5 일 때 조건이 맞지 않으므로 빠져나옴.

       따라서 result[0] = 2.

 

 ② i = 1  일 때

       result[1] = 1로 초 기화.

       j = 0 일 때 if문 조건 확인하면 arr[1] < arr[0] = 34 < 79 조건은 참이므로 result[1]에 ++ 하면 result[1] = 2.

       j = 1 일 때 if문 조건 확인하면 arr[1] < arr[1] = 34 < 34 조건은 거짓이므로 다음 루프 실행.

       j = 2 일 때 if문 조건 확인하면 arr[1] < arr[2] = 34 < 10 조건은 거짓이므로 다음 루프 실행.

       j = 3 일 때 if문 조건 확인하면 arr[1] < arr[3] = 34 < 99 조건은 참이므로 result[1]에 ++ 하면 result[1] = 3.

       j = 4 일 때 if문 조건 확인하면 arr[1] < arr[4] = 34 < 50 조건은 참이므로 result[1]에 ++ 하면 result[1] = 4.

       j = 5 일 때 조건 맞지 않으므로 빠져나옴.

       따라서 result[1] = 4.

 

 ③ i = 2 일 때

       result[2] = 1로 초기화.

       j = 0 일 때 if문 조건 확인하면 arr[2] < arr[0] = 10 < 79 조건은 참이므로 result[2]에 ++ 하면 result[2] = 2.

       j = 1 일 때 if문 조건 확인하면 arr[2] < arr[1] = 10 < 34 조건은 참이므로 result[2]에 ++ 하면 result[2] = 3.

       j = 2 일 때 if문 조건 확인하면 arr[2] < arr[2] = 10 < 10 조건은 거짓이므로 다음 루프 실행.

       j = 3 일 때 if문 조건 확인하면 arr[2] < arr[3] = 10 < 99 조건은 참이므로 result[2]에 ++ 하면 result[2] = 4.

       j = 4 일 때 if문 조건 확인하면 arr[2] < arr[4] = 10 < 50 조건은 참이므로 result[2]에 ++ 하면 result[2 ] =5.

       j = 5 일 때 조건이 맞지 않으므로 빠져나옴.

       따라서 result[2] = 5.

 

 ④ i = 3 일 때

       result[3] = 1로 초기화.

       j = 0 일 때 if문 조건 확인하면 arr[3] < arr[0] = 99 < 79 조건은 거짓이므로 다음 루프 실행.

       j = 1 일 때 if문 조건 확인하면 arr[3] < arr[1] = 99 < 34 조건은 거짓이므로 다음 루프 실행.

       j = 2 일 때 if문 조건 확인하면 arr[3] < arr[2] = 99 < 10 조건은 거짓이므로 다음 루프 실행.

       j = 3 일 때 if문 조건 확인하면 arr[3] < arr[3] = 99 < 99 조건은 거짓이므로 다음 루프 실행.

       j = 4 일 때 if문 조건 확인하면 arr[3] < arr[4] = 99 < 50 조건은 거짓이므로 다음 루프 실행.

       j = 5 일 때 조건이 맞지 않으므로 빠져나옴.

       따라서 result[3] = 1.

 

⑤ i = 4 일 때

       result[4] = 1로 초기화.

       j = 0 일 때 if문 조건 확인하면 arr[4] < arr[0] = 50 < 79 조건은 참이므로 result[4]에 ++ 하면 result[4] = 2.

       j = 1 일 때 if문 조건 확인하면 arr[4] < arr[1] = 50 < 34 조건은 거짓이므로 다음 루프 실행.

       j =  2 일 때 if문 조건 확인하면 arr[4] < arr[2] = 50 < 10 조건은 거짓이므로 다음 루프 실행.

       j = 3 일 때 if문 조건 확인하면 arr[4] < arr[3] = 50 < 99 조건은 참이므로 result[4]에 ++ 하면 result[4] = 3.

       j = 4 일 때 if문 조건 확인하면 arr[4] < arr[4] = 50 < 50 조건은 거짓이므로 다음 루프 실행.

       j = 5 일 때 조건이 맞지 않으므로 빠져나옴.

       따라서 result[4] = 3.

 

4) 두 번째 for문.

 ① k = 0 일 때 result[0] = 2.

 ② k = 1 일 때 result[1] = 4.

 ③ k = 2 일 때 result[2] = 5.

 ④ k = 3 일 때 result[3] = 1.

 ⑤ k = 4 일 때 result[4] = 3.

 

[출력]

24513

 

9. 다음은 파이썬 코드이다. 실행 결과를 쓰시오.

l = [1, 2, 3, 4, 5]
l = list(map(lamda num : num + 100, l))
print(l)

 

▶ 리스트 l에 있는 각 원소에 100을 더하는 작업을 수행 후, 그 결과를 다시 리스트로 만들어 출력하는 코드.

 

1) map함수 : 주어진 리스트 l의 각 원소에 함수를 적용하는데, 여기서 lamda 함수 사용하여, 각 원소에 100을 더함.

 

2) list(map(lamda num : num + 100, l))

 ▷ lamda 매개변수 : 표현식

 - 매개변수인 왼쪽 num 값으로 리스트 l의 값이 순차적으로 전달되며, 이 값은 오른쪽의 num + 100에 전달되어 연산.

 - 1 + 100, 2 + 100, 3 + 100, 4 + 100, 5 + 100이 실행되어, 101, 102, 103, 104, 105가 계산됨.

 - list 함수 매개변수에 101, 102, 103, 104, 105가 전달되며, 리스트로 변환한 결과를 l에 대입.

 

[출력]

[101, 102, 103, 104, 105]

 

13. 다음은 C언어 코드이다. 실행 결과를 쓰시오.

#include<stdio.h>

int main() {
	int i, j, k, s;
	int el = 0;
	for (i = 6; i <= 30; i++) {
		s = 0;
		k = i / 2;
		for (j = 1; j <= k; j++) {
			if (i % j == 0) {
				s += j;
			}
		}
		if (s == i) {
			el++;
		}
	}
	printf("%d", el);
	return 0;
}

 

▶ 6부터 30까지의 완전수 찾고, 그 개수 출력하는 코드. (완전수는 자신을 제외한 약수들의 합이 그 수와 같은 수를 의미.)

 

 

1) int i, j, k, s

 - 정수형 변수 i, j, k, s 선언.

 

2) int el = 0;

 - 정수형 변수 el 선언하면서 0으로 초기화. (완전수의 개수 추적하기 위해 사용.)

 

3) for문

 ① i = 6 일 때

       s = 0.

       k = i / 2 = 6 / 2 = 3. (j <= 3)

       j = 1일 때 if문 조건 확인하면  6 % 1 == 0은 참이므로 s = s + j 실행하여 s = 0 + 1 = 1이 됨.

       j = 2 일 때 if문 조건 확인하면 6 % 2 == 0은 참이므로 s = s + j 실행하여 s = 1 + 2 = 3이 됨.

       j = 3 일 때 if문 조건 확인하면 6 % 3 == 0은 참이므로 s = s + j 실행하여 s = 3 + 3 = 6이 됨.

       j = 4 일 때 조건이 맞지 않으므로 루프 종료.

       마지막에 if문 조건 확인하면 s == i는 6 == 6이므로 참이기 때문에 el을 ++하여 el = 2가 됨.

 

 ② i = 7 일 때

       s = 0.

       k = i / 2 = 7 / 2 = 3. (j <= 3)

       j = 1 일 때 if문 조건 확인하면 7 % 1 == 0은 참이므로 s = s + j 실행하여 s = 0 + 1 = 1이 됨.

       j = 2 일 때 if문 조건 확인하면 7 % 2 == 0은 거짓이므로 다음 루프 실행.

       j = 3 일 때 if문 조건 확인하면 7 % 3 == 0은 거짓이므로 다음 루프 실행.

       j = 4 일 때 조건이 맞지 않으므로 루프 종료.

       마지막에 if문 조건 확인하면 s == i는 1 == 7은 거짓이므로 el은 그대로 1이 됨.

 

이러한 과정을 반복하면 6부터 30까지의 수 중에서 완전수인 경우 el을 증가하여 el 값을 출력함.

6부터 30까지의 수 중 완전수는 6, 28이므로 el의 값은 2를 출력하게 됨.

 

[출력]

2

 

19. 다음은 JAVA 언어 코드이다. 실행 결과를 쓰시오.

public class Soojebi {
	static int[] MakeArray() {
		int[] tempArr = new int[4];
		for(int i = 0; i<tempArr.length; i++) {
			tempArr[i] = i;
		}
		return tempArr;
	}
	public static void main(String[] args) {
		int[] intArr;
		intArr = MakeArray();
		
		for(int i=0; i<intArr.length; i++) {
			System.out.print(intArr[i]);
		}
	}
}

 

1) Makearray 함수

 - Makearrya 함수는 int 타입의 배열을 반환하는 정적 메서드.

 ① int[] tempArr = new int[4];

    - 길이가 4인 정수형 배열 tempArr 선언.

 ② for문

    - i = 0 일 때 tempArr[0] = 0;

    - i = 1 일 때 tempArr[1] = 1;

    - i = 2 일 때 tempArr[2] = 2;

    - i = 3 일 때 tempArr[3] = 3;

 ③ return tempArr;

    - 이 배열을 반환.

 

2) main 메서드

 ① int[] intArr;

    - 정수형 배열을 위한 참조변수 intArr를 선언. 배열 생성되지 않고, 단순히 배열을 참조할 준비만 함.

 ② intArr = MakeArray();

    - MakeArray() 메서드를 호출하여 변환된 배열을 intArr에 저장.

    - 이제 intArr는 {0, 1, 2, 3}이라는 배열 가리킴.

 ③ for문

    - 배열의 길이가 4이므로, i = 0부터 i = 3까지 총 4번 반복.

    - 각 반복마다 배열 intArr의 해당 인덱스 요소가 System.out.print()에 의해 출력.

 

[출력]

0123

 

20. 다음은 JAVA 언어 코드이다. 실행 결과를 쓰시오.

public class Soojebi {
	public static void main(String[] args) {
		int a = 0;
		for(int i=1; i<999; i++) {
			if(i%3==0 && i%2 !=0)
				a = i;
		}
		System.out.print(a);
	}
}

 

▶ i가 3으로 나눴을 때 나머지가 0이면서, 2로 나눴을 때 0이 아닌 가장 큰 값을 찾는 코드.

 

1) int a = 0;

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

 

2) for문

 ① i = 1 일 때 if문 조건 확인하면 1%3 == 0은 거짓이므로 뒤에 조건도 거짓이어서 다음 루프 실행.

 ② i = 2 일 때 if문 조건 확인하면 2%3 == 0은 거짓이므로 뒤에 조건도 거짓이어서 다음 루프 실행.

 ③ i = 3 일 때 if문 조건 확인하면 3%3 == 0은 참이므로 뒤에 조건 확인. 3%2 != 0은 참이므로 a에 i값 대입하면 a = 3.

 

이런 식으로 반복문을 실행하다 보면 3의 배수이면서 6의 배수가 아닌 수를 찾으면 됨.

3의 배수에서 가장 큰 수는 996이고, 6의 배수에서 가장 큰 수는 996이므로 3의 배수에서 가장 큰 수는 996은 조건 성립 안 됨.

두 번째로 가장 큰 3의 배수는 993이고, 6의 배수에서 두 번째로 큰 수는 990이므로 조건이 성립되므로 993을 출력하게 됨.

따라서 가장 큰 수는 993.

 

[출력]

993