2005 시도예선 초등부 문제

1. 크기가 같은 검은색 동전과 흰색 동전이 있다. 검은색 동전 한 개를 흰 색 동전으로 둘러싸려면 아래 그림과 같이 최소 6개의 동전이 필요하다. 검은색 동전 세 개를 놓고 흰 색 동전으로 둘러싸려면 최소 몇 개의 동전이 필요할까? (단 검은색 동전 세 개를 겹치게 놓아서는 안 된다.)

① 9개	② 10개	③ 12개	④ 15개	⑤ 18개

2. 정사각형 안에 같은 크기의 원 네 개가 아래 그림과 같이 맞닿아 있다. 정사각형의 넓이가 60일 때 빗금 친 부분의 넓이는 얼마인가?

① 10	② 12	③ 15	④ 18	⑤ 20

3. 어떤 도형을 펜을 떼지 않고 그리는 것을 한붓그리기라고 한다. 다음과 같은 도형을 한붓그리기로 그리려 한다. 시작점이 될 수 있는 점은 몇 개인가?

① 0개	② 1개	③ 2개	④ 3개	⑤ 5개

4. 매시간 일정한 비율로 늘어나는 바이러스가 있다. 오전 10시에 10마리였던 바이러스가 같은 날 오후 2시에 보니 810마리로 불어 있었다. 이 바이러스는 매시간 몇 배씩 늘어나는가?

① 2배	② 3배	③ 4배	④ 10배	⑤ 200배

5. 점심 식사를 받기 위해 학생들이 한 줄로 줄을 섰다. 맨 뒤에 서 있는 학생이 앞을 보니, 앞에 서있는 남학생 수와 여학생 수는 서로 같았다. 맨 앞에 서 있는 학생이 뒤를 보니, 여학생 수가 남학생 수의 두 배였다. 줄을 서 있는 학생의 수는 모두 몇인가?

① 6명	② 7명	③ 8명	④ 9명	⑤ 10명

6. 아래 다섯 명의 말이 모두 맞다고 한다면, 영표보다 키가 작은 사람은 몇 명인가?

영표 : 난 종국이보다 키가 커.

종국 : 난 동국이보다 키가 작아.

두리 : 내가 제일 키가 커.

동국 : 난 주영이보다 키가 작아.

주영 : 난 영표보다 키가 작아.

① 0명	② 1명	③ 2명	④ 3명	⑤ 4명

7. 애완동물 가게에 가보니, 아래와 같은 6개의 칸에 각각 다른 애완동물이 놓여 있었다. 다음 말이 모두 참일 때 A 위치에 있는 동물은?

	A

― 강아지 옆 칸에는 고양이가 있다.

― 토끼 아래 칸에는 거북이가 있다.

― 다람쥐 옆 칸에는 햄스터만 있다.

― 강아지와 거북이는 가장 멀리 떨어져 있다.

① 강아지	② 고양이	③ 거북이	④ 다람쥐	⑤ 햄스터

8. 철수가 뽑은 숫자 카드에는 3의 배수이면서 2 또는 5의 배수인 수가 적혀 있다. 다음 수 중 철수가 뽑은 카드의 숫자가 될 수 있는 것의 개수는?

10,  12,  15,  21,  30

① 1개	② 2개	③ 3개	④ 4개	⑤ 5개

9. 다음 두 종류의 블록(정사각형 블록과 일자 블록)으로 가로 4칸, 세로 4칸 크기의 판에 채워 넣으려고 한다. 서로 다른 방법의 가지 수는? (둘 중 한 종류의 블록만을 사용해도 되며, 예1과 예2는 서로 다른 방법이다.)

예1)

예2)

① 6가지	② 7가지	③ 8가지	④ 9가지	⑤ 10가지

10. A☆B는 A를 B로 나눈 나머지이다. 그렇다면 (20☆7)☆5의 값은?

① 0	② 1	③ 2	④ 3	⑤ 4

11. N! = N × (N - 1) × (N - 2) × … × 2 × 1이다. 예를 들어 4! = 4 × 3 × 2 × 1 = 24가 된다. 그렇다면 20! ÷ 18!의 값은?

① 320	② 340	③ 360	④ 380	⑤ 400

12. 금도끼 1개는 은도끼 3개의 값과 같고, 은도끼 2개는 쇠도끼 5개의 값과 같다. 다음 보기 중 그 값이 가장 비싼 것은?

① 금도끼 2개	② 은도끼 5개	③ 쇠도끼 12개  ④ 금도끼 1개 + 쇠도끼 7개

⑤ 은도끼 1개 + 쇠도끼 10개

13. 트리(tree)에서는 어떤 노드(node)에서 루트(root)까지 가는데 자신을 포함하여 거쳐 가는 노드의 수를 레벨(level)이라고 한다. 그렇다면 다음 트리에서 아래 보기 중 레벨이 가장 큰 노드는?

A

B

C

D

E

F

G

H

루트(root)

① A	② C	③ D	④ F	⑤ G

14. 1, 2, 3 세 개의 자연수를 차례대로 스택(stack)에 넣은 다음, 두 개의 자연수를 빼낸 뒤, 다시 두 개의 자연수 4, 5를 차례대로 스택에 넣고, 스택에 있는 모든 자연수를 빼내었다. 다음 중 자연수들이 스택에서 나온 순서로 알맞은 것은?

1, 2, 3

4, 5

스택

(stack)

① 1, 2, 3, 4, 5	② 1, 2, 4, 5, 3	③ 2, 1, 5, 4, 3

④ 2, 3, 5, 4, 1	⑤ 3, 2, 5, 4, 1

15. 높이가 3인 완전 이진트리는 아래와 같이 7개의 노드(node)로 이루어져 있다. 그렇다면 높이가 7인 완전 이진트리는 몇 개의 노드로 이루어져 있을까?

1

2

3

4

5

6

7

① 63개	② 64개	③ 127개	④ 128개	⑤ 255개

16. 다음 프로그램을 실행시켰을 때 출력되는 결과는?

< VB >

Debug.Print 10 - 3 * 2

< VC++ >

printf("%d", 10 - 3 * 2 );

< Delphi >

writeln( 10 - 3 * 2 );

① 4	② 6	③ 8	④ 10	⑤ 14

17. 다음 프로그램을 실행시킨 결과는?

< VB >

N = 10

If (N > 5) Then N = N - 3 Else N = N * 2

Debug.Print N

< VC++ >

n = 10;

if ( n > 5 ) n -= 3;

else n *= 2;

printf( "%d\n", n );

< Delphi >

n := 10;

if n > 5 then n := n - 3

else n := n * 2;

writeln( n );

① 3	② 5	③ 7	④ 10	⑤ 20

18. 다음 프로그램을 실행시킨 결과는?

< VB >

A = "GAME"

L = Len(A)

For I = 1 To L

Debug.Print Mid(A, L - I + 1, 1);

Next I

Debug.Print

< VC++ >

char a[5] = "GAME";

len = strlen( a );

for ( i = 0; i < len; i++ )

printf( "%c", a[len - i - 1] );

printf( "\n" );

< Delphi >

a := 'GAME';

len := length( a );

for i := 1 to len do

write( a[len - i + 1] );

writeln;

① AMEG	② AGEM	③ MAGE	④ EMAG	⑤ EGAM

19. 다음 프로그램을 실행시킨 후 출력되는 값은?

< VB >

C = 0

For I = 10 To 19

If (I < 15 Or I Mod 2 = 0 And I Mod 3 = 0) Then C = C + 1

Next I

Debug.Print C

< VC++ >

c = 0;

for ( i = 10; i < 20; i++ )

if ( i < 15 || i % 2 == 0 && i % 3 == 0 ) c++;

printf( "%d\n", c );

< Delphi >

c := 0;

for i := 10 to 19 do

if ( i < 15 ) or ( i mod 2 = 0 ) and ( i mod 3 = 0 ) then inc( c );

writeln( c );

① 5	② 6	③ 7	④ 8	⑤ 9

20. 다음 프로그램을 실행시킨 후 출력되는 값은?

< VB >

For I = 1 To 10

A(I) = I Mod 7

Next I

M = A(1)

For I = 2 To 10

If A(I) > M Then M = A(I)

Next I

Debug.Print M

< VC++ >

for ( i = 1; i <= 10; i++ )

a[i] = i % 7;

m = a[1];

for ( i = 2; i <= 10; i++ )

if ( a[i] > m ) m = a[i];

printf( "%d\n", m );

< Delphi >

for i := 1 to 10 do

a[i] := i mod 7;

m := a[1];

for i := 2 to 10 do

if a[i] > m then m := a[i];

writeln( m );

① 2	② 3	③ 4	④ 5	⑤ 6

21. 다음 프로그램은 무엇을 구하는 프로그램인가?

< VB >

C = 0

For I = 1 To 99

If I Mod 3 = 0 Then C = C + 1

Next I

Debug.Print C

< VC++ >

c = 0;

for ( i = 1; i < 100; i++ )

if ( i % 3 == 0 ) c++;

printf( "%d\n", c );

< Delphi >

c := 0;

for i := 1 to 99 do

if i mod 3 = 0 then inc( c );

writeln( c );

① 100의 약수의 개수

② 100보다 작은 3의 배수의 개수

③ 3의 배수이면서 100의 약수인 수의 개수

④ 3의 배수이거나 100의 약수인 수의 개수

⑤ 100의 약수 중 3이 포함되어 있는 수의 개수

22. 배열 P (또는 p)에는 학생 5명의 시험 점수 총점이 들어있다. 그렇다면 다음은 무엇을 구하는 프로그램인가?

< VB >

For I = 1 To 5

R(I) = 1

For J = 1 To 5

If P(I) < P(J) Then R(I) = R(I) + 1

Next J

Next I

< VC++ >

for ( i = 1; i <= 5; i++ )

{

r[i] = 1;

for ( j = 1; j <= 5; j++ )

if ( p[i] < p[j] ) r[i]++;

}

< Delphi >

for i := 1 to 5 do begin

r[i] := 1;

for j := 1 to 5 do

if p[i] < p[j] then inc( r[i] );

end;

① 평균	② 등수	③ 백분율	④ 최소 점수	⑤ 최대 점수

23. 다음 프로그램을 실행시킨 후 출력되는 값은?

< VB >

Num = Array(21, 15, 33, 71, 87, 56, 19, 48, 94, 10)

K1 = K2 = Num(0)

For I = 1 To 9

If Num(I) < K1 Then

K1 = Num(I)

ElseIf Num(I) > K2 Then

K2 = Num(I)

End If

Next I

Debug.Print K2 - K1

< VC++ >

int num[10] = { 21, 15, 33, 71, 87, 56, 19, 48, 94, 10 };

k1 = k2 = num[0];

for ( i = 1; i < 10; i++ )

if ( num[i] < k1 ) k1 = num[i];

else if ( num[i] > k2 ) k2 = num[i];

printf( "%d\n", k2 - k1 );

< Delphi >

num : array[0..9] of integer = ( 21, 15, 33, 71, 87, 56, 19, 48, 94, 10 );

...

k1 := num[0];	k2 := num[0];

for i := 1 to 9 do

if num[i] < k1 then k1 := num[i]

else if num[i] > k2 then k2 := num[i];

writeln( k2 - k1 );

① 56	② 61	③ 77	④ 84	⑤ 94

24. 다음 프로그램을 실행시킨 후 출력되는 값은?

< VB >

S = 0

For I = 1 To 10

S = S + I

Next I

Select Case Int(S / 10)

Case 1: Debug.Print "A"

Case 2: Debug.Print "B"

Case 3: Debug.Print "C"

Case 4: Debug.Print "D"

Case Else: Debug.Print "E"

End Select

< VC++ >

s = 0;

for ( i = 1; i <= 10; i++ )

s += i;

switch ( s / 10 )

{

case  1 : printf("A");	break;

case  2 : printf("B");	break;

case  3 : printf("C");	break;

case  4 : printf("D");	break;

default : printf("E");

}

< Delphi >

s := 0;

for i := 1 to 10 do

s := s + i;

case s div 10 of

1  : writeln( 'A' );

2  : writeln( 'B' );

3  : writeln( 'C' );

4  : writeln( 'D' );

else writeln( 'E' );

end;

① A	② B	③ C	④ D	⑤ E

25. M 행 N열로 이루어진 이차원 배열 A (또는 a)에 들어있는 그림이 좌우 대칭이면 Yes를, 아니면 No를 출력하는 프로그램이다. 빈 칸에 알맞은 것은?

#	#	#
	#
#	#	#

#	#
	#
	#	#

< Yes인 경우 >	< No인 경우 >

< VB >

Sym = True

For I = 1 To M

For J = 1 To Int(N / 2)

If  Then Sym = False

Next J, I

If Sym Then Debug.Print "Yes" Else Debug.Print "No"

① A(I, J) = A(I, N - J)	② A(I, J) <> A(I, N - J)

③ A(I, J) = A(I, N - J + 1)	④ A(I, J) <> A(I, N - J + 1)

⑤ A(I, J) = A(I, N - J - 1)

< VC++ >

sym = true;

for ( i = 0; i < M; i++)

for ( j = 0; j < N / 2; j++)

if (   ) sym = false;

if ( sym ) printf( "Yes\n" );

else printf( "No\n" );

① a[i][j] == a[i][N - j]	② a[i][j] != a[i][N - j]

③ a[i][j] == a[i][N - j - 1]	④ a[i][j] != a[i][N - j - 1]

⑤ a[i][j] == a[i][N - j + 1]

< Delphi >

sym := true;

for i := 1 to M do

for j := 1 to N div 2 do

if  then sym := false;

if sym then writeln( 'Yes' )

else writeln( 'No' );

① a[i, j] = a[i, N - j]	② not ( a[i, j] = a[i, N - j] )

③ a[i, j] = a[i, N - j + 1]	④ not ( a[i, j] = a[i, N - j + 1] )

⑤ a[i, j] = a[i, N - j - 1]

26. 다음 프로그램을 실행시킨 후 출력되는 값은?

< VB >

Num = Array(2, 5, 3, 1, 7, 6, 9, 8, 4, 10)

For I = 1 To 3

For J = 9 To I Step -1

If Num(J) > Num(J - 1) Then

Tmp = Num(J)

Num(J) = Num(J - 1)

Num(J - 1) = Tmp

End If

Next J, I

Debug.Print Num(2)

< VC++ >

int num[10] = { 2, 5, 3, 1, 7, 6, 9, 8, 4, 10 };

for ( i = 0; i < 3; i++ )

for ( j = 9; j > i; j-- )

if ( num[j] > num[j - 1] )

{

tmp = num[j];

num[j] = num[j - 1];

num[j - 1] = tmp;

}

printf( "%d\n", num[2] );

< Delphi >

num : array[0..9] of integer = ( 2, 5, 3, 1, 7, 6, 9, 8, 4, 10 );

...

for i := 1 to 3 do

for j := 9 downto i do

if num[j] > num[j - 1] then

begin

tmp := num[j];

num[j] := num[j - 1];

num[j - 1] := tmp;

end;

writeln( num[2] );

① 2	② 3	③ 5	④ 8	⑤ 9

27. 함수 F (또는 f)가 다음과 같을 때 K (또는 k)의 값은 얼마가 되는가?

< VB >

Function F(P, Q) As Integer

If P Mod Q = 0 Then F = Q Else F = F(Q, P Mod Q)

End Function

.....

K = F(32, 56)

< VC++ >

int f( int p, int q )

{

if ( p % q == 0 ) return q;

else return f( q, p % q );

}

...

k = f( 32, 56 );

< Delphi >

function f( p, q : integer ) : integer;

begin

if p mod q = 0 then f := q

else f := f( q, p mod q );

end;

...

k := f( 32, 56 );

① 4	② 6	③ 8	④ 10	⑤ 12

28. 다음 프로그램을 실행시켰을 때 출력되는 *의 개수는?

< VB >

For I = 1 To 5

A(I) = I

Next I

For I = 1 To 5

A(I) = A(6 - I)

Next I

For I = 1 To 5

For J = 1 To A(I)

Debug.Print "*";

Next J

Debug.Print

Next I

< VC++ >

for ( i = 1; i <= 5; i++ )

a[i] = i;

for ( i = 1; i <= 5; i++ )

a[i] = a[6 - i];

for ( i = 1; i <= 5; i++ )

{

for ( j = 1; j <= a[i]; j++ )

printf( "*" );

printf( "\n" );

}

< Delphi >

for i := 1 to 5 do

a[i] := i;

for i := 1 to 5 do

a[i] := a[6 - i];

for i := 1 to 5 do

begin

for j := 1 to a[i] do

write( '*' );

writeln;

end;

① 9개	② 11개	③ 15개	④ 19개	⑤ 21개

29. 다음 중 1부터 5까지 합을 구하는 프로그램이 아닌 것은?

< VB >

①	S = 0	②	S = 0

For I = 1 To 5	For I = 0 To 4

S = S + I	S = S + I + 1

Next I	Next I

③	I = 1: S = 0	④	I = 0: S = 0

While I < 5	While I < 5

S = S + I	I = I + 1

I = I + 1	S = S + I

Wend	Wend

⑤	I = 0: S = 0

Do

I = I + 1

S = S + I

Loop While I < 5

< VC++ >

①	s = 0;	②	s = 0;

for ( i = 1; i <= 5; i ++ )	for ( i = 0; i <= 4; i++ )

s = s + i;	s = s + i + 1;

③	i = 1;	s = 0;	④	i = 0;	s = 0;

while ( i < 5 )	while ( i < 5 )

{	{

s = s + i;	i = i + 1;

i = i + 1;	s = s + i;

}	}

⑤	i = 0;	s = 0;

do

{

i = i + 1;

s = s + i;

} while ( i < 5 )

< Delphi >

①	s := 0;	②	s := 0;

for i := 1 to 5 do	for i := 0 to 4 do

s := s + i;	s := s + i + 1;

③	i := 1;	s := 0;	④	i := 0;	s := 0;

while i < 5 do	while i < 5 do

begin	begin

s := s + i;	i := i + 1;

i := i + 1;	s := s + i;

end;	end;

⑤	i := 0;	s := 0;

repeat

i := i + 1;

s := s + i;

until i >= 5;

30-31. 아래와 같은 문제를 해결하기 위해 프로그램을 작성하였다. 빈 칸의 내용으로 알맞은 것은?

문제

평면에 네 개의 직사각형이 놓여 있는데 그 밑변은 모두 가로축에 평행하다. 이 네 개의 직사각형들은 서로 떨어져 있을 수도 있고, 겹쳐 있을 수도 있고, 하나가 다른 하나를 포함할 수도 있으며, 변이나 꼭지점이 겹칠 수도 있다.

이 직사각형들이 차지하는 면적을 구하는 프로그램을 작성하시오.

y
7
6
5
4
3
2
1
0		1		2		3		4		5		6		7		8 x

입력 형식

입력 파일의 이름은 INPUT.TXT로 한다. 입력은 네 줄이며, 각 줄은 직사각형의 위치를 나타내는 네 개의 정수로 주어진다. 첫 번째와 두 번째의 정수는 사각형의 왼쪽 아래 꼭지점의 x좌표, y좌표이고 세 번째와 네 번째의 정수는 사각형의 오른쪽 위 꼭지점의 x좌표, y좌표이다. 모든 x좌표와 y좌표는 1이상이고 100이하인 정수이다.

출력 형식

출력 파일의 이름은 OUTPUT.TXT로 한다. 첫 줄에 네 개의 직사각형이 차지하는 면적을 출력한다.

입력과 출력의 예

입력(INPUT.TXT)	출력(OUTPUT.TXT)

1 2 4 4

2 3 5 7

3 1 6 5

7 3 8 6

26

< VB >

Const MAX_P As Integer = 100

Dim X1(4), Y1(4), X2(4), Y2(4) As Integer

Dim S(MAX_P - 1, MAX_P - 1) As Integer

Dim AREA As Integer

Sub InputFile()

Open "INPUT.TXT" For Input As #1

For I = 1 To 4

Input #1, X1(I), Y1(I), X2(I), Y2(I)

Next I

Close #1

End Sub

Sub Solve()

For I = 1 To 4

For J = Y1(I) To

(1)

For K = X1(I) To

(2)

(3)

Next K, J, I

For I = 1 To MAX_P - 1

For J = 1 To MAX_P - 1

Area = Area + S(I, J)

Next J, I

End Sub

Sub Output()

Open "OUTPUT.TXT" For Output As #2

Print #2, Area

Close #2

End Sub

Sub Main()

Call InputFile

Call Solve

Call Output

End Sub

30. 빈 칸 (1)과 (2)에 차례로 알맞은 내용은?

① Y2(I), X2(I)	② Y2(I) - 1, X2(I)	③ Y2(I), X2(I) - 1

④ Y2(I) - 1, X2(I) - 1	⑤ Y2(I) + 1, X2(I) + 1

31. 빈 칸 (3)에 알맞은 내용은?

① S(J, K) = -1	② S(J, K) = 1	③ S(J, K) = 2	④ S(K, J) = -1	⑤ S(K, J) = 2

< VC++ >

#include <stdio.h>

#define MAX_P	100

int x1[4], y1[4], x2[4], y2[4];

int s[MAX_P][MAX_P];

int area;

void Input ()

{

FILE *f = fopen ( "input.txt", "rt" );

for ( int i = 0; i < 4; i++ )

fscanf( f, "%d %d %d %d", &x1[i], &y1[i], &x2[i], &y2[i] );

fclose( f );

}

void Solve ()

{

int i, j, k;

for ( i = 0; i < 4; i++ )

for ( j = y1[i]; j <=  ; j++ )

(1)

for ( k = x1[i]; k <=  ; k++ )

(2)

;

(3)

for ( i = 1; i < MAX_P; i++ )

for ( j = 1; j < MAX_P; j++ )

area += s[i][j];

}

void Output ()

{

FILE *f = fopen ( "output.txt", "wt" );

fprintf( f, "%d\n", area );

fclose( f );

}

void main ()

{

Input();

Solve();

Output();

}

30. 빈 칸 (1)과 (2)에 차례로 알맞은 내용은?

① y2[i], x2[i]	② y2[i] - 1, x2[i]	③ y2[i], x2[i] - 1

④ y2[i] - 1, x2[i] - 1	⑤ y2[i] + 1, x2[i] + 1

31. 빈 칸 (3)에 알맞은 내용은?

① s[j][k] = -1	② s[j][k] = 1	③ s[j][k] = 2	④ s[k][j] = -1	⑤ s[k][j] = 2

< Delphi >

program E30;

{$APPTYPE CONSOLE}

uses

SysUtils;

const

MAX_P = 100;

var

x1, y1, x2, y2  : array[1..4] of integer;

s               : array[1..MAX_P - 1, 1..MAX_P - 1] of integer;

area            : integer;

procedure Input;

var

f       : text ;

i       : integer;

begin

assign( f, 'input.txt' );

reset( f );

for i := 1 to 4 do

read( f, x1[i], y1[i], x2[i], y2[i] );

close( f );

end;

procedure Solve;

var

i, j, k : integer;

begin

for i := 1 to 4 do

for j := y1[i] to  do

(1)

for k := x1[i] to   do

(2)

;

(3)

area := 0;

for i := 1 to MAX_P - 1 do

for j := 1 to MAX_P - 1 do

area := area + s[i, j];

end;

procedure Output;

var

f       : text;

begin

assign( f, 'output.txt' );

rewrite( f );

writeln( f, area );

close( f );

end;

begin

Input;

Solve;

Output;

end.

30. 빈 칸 (1)과 (2)에 차례로 알맞은 내용은?

① y2[i], x2[i]	② y2[i] - 1, x2[i]	③ y2[i], x2[i] - 1

④ y2[i] - 1, x2[i] - 1	⑤ y2[i] + 1, x2[i] + 1

31. 빈 칸 (3)에 알맞은 내용은?

① s[j, k] := -1	② s[j, k] := 1	③ s[j, k] := 2

④ s[k, j] := -1	⑤ s[k, j] := 2

32-33. 아래와 같은 문제를 해결하기 위해 프로그램을 작성하였다. 빈 칸의 내용으로 알맞은 것은?

문제

점심 시간이 되면 반 학생 모두가 한 줄로 줄을 서 급식을 탄다. 그런데 매일 같이 앞자리에 앉은 학생들이 앞에 줄을 서 먼저 점심을 먹고, 뒷자리에 앉은 학생들은 뒤에 줄을 서 늦게 점심을 먹게 된다. 어떻게 하면 이러한 상황을 바꾸어 볼 수 있을까 고민하던 중 선생님이 한 가지 방법을 내 놓았다. 그 방법은 다음과 같다.

학생들이 한 줄로 줄을 선 후, 첫 번째 학생부터 차례로 번호를 뽑는다. 첫 번째로 줄을 선 학생은 무조건 0번 번호를 받아 제일 앞에 줄을 선다. 두 번째로 줄을 선 학생은 0번 또는 1번 둘 중 하나의 번호를 뽑는다. 0번을 뽑으면 그 자리에 그대로 있고, 1번을 뽑으면 바로 앞의 학생 앞으로 가서 선다. 세 번째로 줄을 선 학생은 0, 1 또는 2 중 하나의 번호를 뽑는다. 그리고 뽑은 번호만큼 앞자리로 가서 줄을 선다. 마지막에 줄을 선 학생까지 이와 같은 방식으로 뽑은 번호만큼 앞으로 가서 줄을 서게 된다. 각자 뽑은 번호는 자신이 처음에 선 순서보다는 작은 수이다.

예를 들어 5명의 학생이 줄을 서고, 첫 번째로 줄을 선 학생부터 다섯 번째로 줄을 선 학생까지 차례로 0, 1, 1, 3, 2번의 번호를 뽑았다고 하자. 첫 번째 학생부터 다섯 번째 학생까지 1부터 5로 표시하면 학생들이 줄을 선 순서는 다음과 같이 된다.

첫 번째 학생이 번호를 뽑은 후 : 1

두 번째 학생이 번호를 뽑은 후 : 2 1

세 번째 학생이 번호를 뽑은 후 : 2 3 1

네 번째 학생이 번호를 뽑은 후 : 4 2 3 1

다섯 번째 학생이 번호를 뽑은 후 : 4 2 5 3 1

따라서 최종적으로 학생들이 줄을 선 순서는 4, 2, 5, 3, 1이 된다.

줄을 선 학생들이 차례로 뽑은 번호가 주어질 때 학생들이 최종적으로 줄을 선 순서를 출력하는 프로그램을 작성하시오.

입력 형식

입력 파일의 이름은 INPUT.TXT로 한다. 첫째 줄에는 학생의 수가 주어지고 둘째 줄에는 줄을 선 차례대로 학생들이 뽑은 번호가 주어진다. 학생의 수는 100이하이고, 학생들이 뽑는 번호는 0 또는 자연수이며 학생들이 뽑은 번호 사이에는 빈 칸이 하나씩 있다.

출력 형식

출력 파일의 이름은 OUTPUT.TXT로 한다. 학생들이 처음에 줄을 선 순서대로 1번부터 번호를 매길 때, 첫째 줄에 학생들이 최종적으로 줄을 선 순서를 그 번호로 출력한다. 학생 번호 사이에는 한 칸의 공백을 출력한다.

입력과 출력의 예

입력(INPUT.TXT)	출력(OUTPUT.TXT)

5

0 1 1 3 2

4 2 5 3 1

< VB >

Const MAX_N As Integer = 100

Dim N As Integer

Dim Num(MAX_N) As Integer

Dim Order(MAX_N) As Integer

Sub InputFile()

Open "INPUT.TXT" For Input As #1

Input #1, N

For I = 1 To N

Input #1, Num(I)

Next I

Close #1

End Sub

Sub Arrange()

For I = 1 To N

For J = 1 To Num(I)

(1)

Next J

Order() = I

(2)

Next I

End Sub

Sub Output()

Open "OUTPUT.TXT" For Output As #2

For I = 1 To N

Print #2, Order(I);

Next I

Close #2

End Sub

Sub Main()

Call InputFile

Call Arrange

Call Output

End Sub

32. 빈 칸 (1)에 알맞은 내용은?

① Order(I - J + 1) = Order(I - J)	② Order(I - J + 1) = Order(I - J - 1)

③ Order(I - J) = Order(I - J + 1)	④ Order(I - J) = Order(I - J - 1)

⑤ Order(I - J - 1) = Order(I - J)

33. 빈 칸 (2)에 알맞은 내용은?

① I	② Num(I)	③ I - Num(I)	④ I + Num(I)	⑤ I - Num(I) + 1

< VC++ >

#include <stdio.h>

#define MAX_N	100

int n;

int num[MAX_N];

int order[MAX_N];

void Input ()

{

FILE *f = fopen ( "input.txt", "rt" );

fscanf( f, "%d\n", &n );

for ( int i = 0; i < n; i++ )

fscanf( f, "%d", &num[i] );

fclose( f );

}

void Arrange ()

{

int i, j;

for ( i = 0; i < n; i++)

{

for ( j = 0; j < num[i]; j++ )

;

(1)

order[  ] = i + 1;

(2)

}

}

void Output ()

{

FILE *f = fopen ( "output.txt", "wt" );

for ( int i = 0; i < n; i++ )

fprintf( f, "%d ", order[i] );

fclose( f );

}

void main ()

{

Input();

Arrange();

Output();

}

32. 빈 칸 (1)에 알맞은 내용은?

① order[i - j] = order[i - j - 1]	② order[i - j] = order[i - j + 1]

③ order[i - j - 1] = order[i - j]	④ order[i - j + 1] = order[i - j]

⑤ order[i - j - 1] = order[i - j + 1]

33. 빈 칸 (2)에 알맞은 내용은?

① i	② num[i]	③ i - num[i]	④ i + num[i]	⑤ i - num[i] + 1

< Delphi >

program E32;

{$APPTYPE CONSOLE}

uses

SysUtils;

const

MAX_N = 100;

var

n               : integer;

num, order	: array[1..MAX_N] of integer;

procedure Input;

var

f       : text ;

i       : integer;

begin

assign(f, 'input.txt');

reset(f);

read(f, n);

for i := 1 to n do

read(f, num[i]);

close(f);

end;

procedure Arrange ;

var

i, j	: integer;

begin

for i := 1 to n do

begin

for j := 1 to num[i] do

;

(1)

order[ ] := i;

(2)

end;

end;

procedure Output;

var

f       : text;

i       : integer;

begin

assign( f, 'output.txt' );

rewrite( f );

for i := 1 to n do

write( f, order[i], ' ' );

close( f );

end;

begin

Input;

Arrange;

Output;

end.

32. 빈 칸 (1)에 알맞은 내용은?

① order[i - j + 1] := order[i - j]	② order[i - j + 1] := order[i - j - 1]

③ order[i - j] := order[i - j + 1]	④ order[i - j] := order[i - j - 1]

⑤ order[i - j - 1] := order[i - j]

33. 빈 칸 (2)에 알맞은 내용은?

① i	② num[i]	③ i - num[i]	④ i + num[i]	⑤ i - num[i] + 1

34-35. 아래와 같은 문제를 해결하기 위해 프로그램을 작성하였다. 빈 칸의 내용으로 알맞은 것은?

문제

KOI 준비를 위해 회의를 개최하려 한다. 주최측에서는 회의에 참석하는 사람의 수와 참석자들 사이의 관계를 따져 하나 이상의 위원회를 구성하려고 한다. 위원회를 구성하는 방식은 다음과 같다.

1. 서로 알고 있는 사람은 반드시 같은 위원회에 속해야 한다.

2. 효율적인 회의 진행을 위해 위원회의 수는 최대가 되어야 한다.

회의에 참석하는 인원과 서로 아는 사이의 리스트가 주어질 때 위원회의 수를 출력하는 프로그램을 작성하시오.

입력 형식

입력 파일의 이름은 INPUT.TXT로 한다. 입력 파일의 첫째 줄에 회의에 참석하는 사람의 수 N이 주어진다. 참석자들은 1부터 N까지의 자연수로 표현되며 회의에 참석하는 인원은 100이하이다. 둘째 줄에는 서로 알고 있는 관계의 수 M이 주어진다. 이어 M개의 각 줄에는 서로 아는 사이인 참석자를 나타내는 두 개의 자연수가 주어진다.

출력 형식

출력 파일의 이름은 OUTPUT.TXT로 한다. 첫째 줄에는 구성되는 위원회의 수 K를 출력한다.

입력과 출력의 예

입력(INPUT.TXT)	출력(OUTPUT.TXT)

8

7

1 2

2 3

4 5

5 6

4 6

6 7

7 4

3

< VB >

Const MAX_N As Integer = 100

Dim N, M As Integer

Dim List(MAX_N, MAX_N - 1) As Integer

Dim Degree(MAX_N) As Integer

Dim Visited(MAX_N) As Boolean

Dim Count As Integer

Sub InputFile()

Open "INPUT.TXT" For Input As #1

Input #1, N

Input #1, M

For I = 1 To M

Input #1, P, Q

Degree(P) = Degree(P) + 1: List(P, Degree(P)) = Q

Degree(Q) = Degree(Q) + 1: List(Q, Degree(Q)) = P

Next I

Close #1

End Sub

Sub DFS(ByVal V As Integer)

Visited(V) = True

(A)

For I = 1 To Degree(V)

If Not Visited( ) Then

(1)

DFS ( )

(1)

(B)

End If

Next I

End Sub

Sub Divide()

For I = 1 To N

(C)

If Not Visited(I) Then

(D)

DFS (I)

Else

(E)

End If

Next I

End Sub

Sub Output()

Open "OUTPUT.TXT" For Output As #1

Print #1, Count

Close #1

End Sub

Sub Main()

Call InputFile

Call Divide

Call Output

End Sub

34. 빈 칸 (1)에 알맞은 내용은?

① I	② List(V, I)	③ List(I, V)	④ List(Count, I)	⑤ List(I, Count)

35. 다음 중 Count = Count + 1 이 들어가야 하는 곳은?

① (A)	② (B)	③ (C)	④ (D)	⑤ (E)

< VC++ >

#include <stdio.h>

#define MAX_N	100

int  n, m;

int  list[MAX_N + 1][MAX_N];

int  degree[MAX_N + 1];

bool visited[MAX_N + 1];

int  count;

void Input ()

{

FILE *f = fopen ( "input.txt", "rt" );

int  i;

int  p, q;

fscanf( f, "%d", &n );

fscanf( f, "%d", &m );

for ( i = 0; i < m; i++ )

{

fscanf( f, "%d %d", &p, &q );

list[p][degree[p]++] = q;

list[q][degree[q]++] = p;

}

fclose( f );

}

void DFS (int v)

{

visited[v] = true;

;

(A)

for ( int i = 0; i < degree[v]; i++)

if ( !visited[  ] )

(1)

{

DFS(    );

(1)

;

(B)

}

}

void Divide ()

{

for ( int i = 0; i < n; i++ )

{

;

(C)

if ( !visited[i] )

{

;

(D)

DFS( i );

}

else  ;

(E)

}

}

void Output ()

{

FILE *f = fopen ( "output.txt", "wt" );

fprintf( f, "%d\n", count);

fclose( f );

}

void main ()

{

Input();

Divide();

Output();

}

34. 빈 칸 (1)에 알맞은 내용은?

① i	② list[v][i]	③ list[i][v]	④ list[count][i]	⑤ list[i][count]

35. count++ 가 들어가야 하는 곳은?

① (A)	② (B)	③ (C)	④ (D)	⑤ (E)

< Delphi >

program E34;

{$APPTYPE CONSOLE}

uses

SysUtils;

const

MAX_N   : integer = 100 ;

var

n, m	: integer;

list	: array[1..MAX_N, 1..MAX_N] of integer;

degree	: array[1..MAX_N] of integer;

visited	: array[1..MAX_N] of boolean;

count	: integer;

procedure Input;

var

f       : text;

i, p, q	: integer;

begin

assign(f, 'input.txt' );

reset( f );

read( f, n );

read( f, m );

for i := 1 to m do

begin

read( f, p, q );

inc( degree[p] );	list[p, degree[p]] := q;

inc( degree[q] );	list[q, degree[q]] := p;

end;

close(f);

end;

procedure DFS(v : integer);

var

i       : integer;

begin

visited[v] := true;

;

(A)

for i := 1 to degree[v] do

if not visited[ ] then

(1)

begin

DFS(  );

(1)

;

(B)

end;

end;

procedure Divide;

var

i       : integer;

begin

for i := 1 to n do

begin

;

(C)

if not visited[i] then

begin

;

(D)

DFS(i);

end

else  ;

(E)

end;

end;

procedure Output;

var

f       : text;

i       : integer;

begin

assign( f, 'output.txt' );

rewrite( f );

write( f, count );

close( f );

end;

begin

Input;

Divide;

Output;

end.

34. 빈 칸 (1)에 알맞은 내용은?

① i	② list[v, i]	③ list[i, v]	④ list[count, i]	⑤ list[i, count]

35. inc(count) 가 들어가야 하는 곳은?

① (A)	② (B)	③ (C)	④ (D)	⑤ (E)