언어 자료구조 알고리즘/C언어 예제

정보 올림피아드

언제나휴일 2009. 8. 19. 05:47
반응형

1. 다음은 일정한 규칙에 따라 수를 늘어놓은 것이다. 빈칸에 가장 알맞은 수는?

1 , 3 , 6 , 11 , 19 , 31 , 48 , ( )

6568717477

2. A, B, C, D, E가 각각 0~9 까지 숫자 중에 하나이고 다른 알파벳은 다른 숫자를 나타낸다. 다음 식을 만족하는 D의 값은?

 

 

A

B

 

×

 

B

A

 

 

 

A

B

 

 

B

C

 

 

 

E

D

B

 

01234

3. 1을 7로 나누었을 때 소수점 이하 97번째 자리 수는 다음 중 어떤 것인가?

12457

4. AB는 A를 B로 나눈 몫이고 A⋆B는 A를 B로 나눈 나머지이다. (A3)⋆10 = 3일 때 A가 될 수 있는 두 자리 자연수의 개수는?

8개9개10개11개12개

5. 미국 돈 40 달러는 싱가포르 돈 32 달러에 해당하고, 싱가포르 돈 80 달러는 홍콩 돈 100 달러에 해당한다. 이때 미국 돈 111 달러는 홍콩 돈으로 몇 달러가 되는가?

111112115120150

6. 어떤 달의 1일은 수요일이었고 말일은 금요일이었다. 그렇다면 보기 중 그 다음 달의 말일로서 가능한 요일은?

화요일수요일목요일토요일알 수 없다.

7. A나라에는 1원, 5원, 10원, 12원, 25원의 다섯 가지 동전이 있다. 254원을 동전으로 갖고자 할 때, 가장 적은 개수의 동전으로 갖고자 한다면 몇 개가 될까?

11개12개13개14개15개

8. A, B, C, D가 달리기 경주를 하였다. 경주 시작 전에 각각은 경주 결과에 대하여 다음과 같이 예측을 하였다.

A: B가 1등을 할 것이다.B: D가 꼴찌를 할 것이다.C: A가 2등을 할 것이다.D: A의 예측이 맞을 것이다.

실제로 경기를 한 후 위의 예측들 중에서 하나만 맞았고, 그 예측은 꼴찌를 한 선수의 예측이었다. 경기에서 1등을 한 선수는 누구일까?

ABCD알 수 없다.

9. n명을 k개의 그룹으로 나누는 방법을 생각해보자. 예를 들어 A, B, C, D 4명을 2개의 그룹으로 나누는 방법은 7가지로 다음과 같다.

(A) (B, C, D)(B) (A, C, D)(C) (A, B, D)(D) (A, B, C)(A, B) (C, D)(A, C) (B, D)(A, D) (B, C)

6명을 3개의 그룹으로 나누는 방법은 몇 가지인가?

203190120135

10. 10명의 사람이 모두 모자, 구두, 지갑을 각각 하나씩 가지고 있는데, 이 물건들의 색깔은 모두 검은색 혹은 붉은색이다. 다음과 같은 조건을 만족할 때 지갑만 붉은 사람은 몇 명인가?

모든 사람의 모자와 지갑은 다른 색이다.같은 색의 구두와 지갑을 가진 사람은 5명이다.붉은 색 모자를 가진 사람은 4명이다.모자, 구두, 지갑 중 한 가지만 붉은 것을 가진 사람은 5명이다.

1명2명3명4명5명

11. 16개의 점이 아래와 같이 놓여 있다. 점선으로 이은 두 점사이의 거리가 모두 같다고 할 때, 서로 다른 네 점을 이어 만들 수 있는 정사각형의 개수는 모두 몇 개인가?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14개16개18개20개22개

12. 500명의 학생에게 질문을 하여 다음과 같은 결과를 얻었다. 285명이 국어강의를 듣고 있으며, 195명이 영어 강의를 듣고 있고, 115명이 수학 강의를 듣고 있다고 한다. 70명이 국어와 영어 강의를 듣고 있고, 45명이 국어와 수학을 듣고 있고, 50명이 영어와 수학을 듣는다고 한다. 50명이 국어, 영어, 수학 중 아무것도 듣지 않고 있다면 세과목 중 한가지만을 듣는 학생 수는 전부 얼마인가?

2060265305325

13. 아래 그림은 숫자 삼각형을 보여준다. 맨 꼭대기에서 바닥에 까지 한 층에 하나씩 연결되는 길을 찾아내려 가는데 그 합이 최대가 되는 것을 구하려는 문제이다. 여기서 한 층씩 내려간다는 것은 대각선 방향으로 왼쪽 혹은 대각선 방향으로 오른쪽으로 내려가는 것이다. 아래 그림에서 최대가 되는 합은 얼마인가?

 

 

 

 

 

7

 

 

 

 

 

 

 

 

 

3

 

8

 

 

 

 

 

 

 

8

 

1

 

4

 

 

 

 

 

2

 

6

 

5

 

4

 

 

 

3

 

6

 

2

 

7

 

1

 

7

 

7

 

6

 

5

 

5

 

7

3536373839

14. 다음 트리를 후위 순회(postorder traversal)했을 때 방문하는 노드를 순서대로 나열한 것은?

1 2 3 4 5 61 2 4 5 3 64 2 5 1 6 34 5 2 6 3 14 5 6 2 3 1

15. 8개의 bit로 구성된 숫자 열에서 연속된 3개의 0을 포함하지 않는 모든 숫자열의 개수는?

558189121149

<Visual C++ 사용자용 문제>

※ 문제나 프로그램 내에 명시되지 않은 변수와 배열은 모두 int형이다.※ &, |, ^는 비트 연산자이다.

16. 아래 프로그램의 실행 결과는 무엇인가?

c = 0;for (i = 1; i <= 10; i++) c++;printf("%d\n", c);

89104555

17. 아래 프로그램의 실행 결과는 무엇인가?

c = 1;for (i = 0; i <= 5; i++) c = c * i;printf("%d\n", c);

016120720

18. 다음은 어떤 프로그램의 일부이다. s가 정수형 변수라고 할 때, 다음 부분이 실행된 뒤 s의 값은?

s = 1;for (i = 1; i <= 2008; i++) { if (s < 10) { s *= 2; } else { s /= 3; }}

3561016

[19-20] 영문 대문자로 구성된 영어 단어가 주어졌을 때, 단어에서 가장 많이 출현하는 알파벳이 무엇인지 구하는 프로그램을 아래와 같이 작성했다.

char *word = "COCOA";int i, index;int maxoccur = 0, maxindex;int count[26];for (i = 0; i < 26; i++) count[i] = 0;for (i = 0; i < strlen(word); i++) { index = word[i] - (int)㉠; count[index]++;}for (i = 0; i < 26; i++) { if (maxoccur <= count[i]) { maxoccur = count[i]; maxindex = i; }}printf("%c\n", (char)(maxindex + (int)㉡));

19. ㉠와 ㉡에 공통으로 들어갈 구문은 무엇인가?

'@''A''Z'9697

20. 이 프로그램을 실행한 결과는?

@ACOZ

21. 다음은 어떤 프로그램의 일부이다. 여기서 N은 배열 a의 원소 개수를 나타내고, a에는 a[0]부터 a[N - 1]까지 임의의 숫자가 들어있다. N이 10이고 배열에 1부터 10까지의 서로 다른 정수가 임의의 순서로 저장되어 있을 때, 다음 부분이 실행된 뒤에 결과로 나올 수 없는 것은?

for (i = (N / 2) - 1; i >= 0; i--) { j = i; while (j * 2 + 1 < N) { if (j * 2 + 2 < N) { if (a[j * 2 + 1] > a[j * 2 + 2]) k = j * 2 + 2; else k = j * 2 + 1; } else { k = j * 2 + 1; } if (a[j] > a[k]) { temp = a[j]; a[j] = a[k]; a[k] = temp; j = k; } else { break; } }}for (i = 0; i < N; i++) { printf("%d ", a[i]);}printf("\n");

1 2 6 3 7 10 8 4 5 91 2 3 5 8 10 4 6 9 71 3 2 4 5 7 9 10 8 61 3 2 5 4 6 10 9 8 71 2 3 6 4 5 7 8 9 10

22. 아래 프로그램의 실행 결과는 무엇인가?

c = 0;for (i = 1; i <= 100; i++) { d = 0; for (j = 1; j <= i; j++) { if ( (i % j) != 0) d++; } if (i == d + 3) c++;}printf("%d\n", c);

345910

[23-24] A라는 배열에 아래와 같이 값이 담겨 있다.

A[1]

A[2]

A[3]

A[4]

A[5]

A[6]

10

7

20

5

30

4

이 배열을 아래 프로그램으로 처리하려고 할 때 물음에 답하라.

for (i = 2; i <= 6; i++) { for (j = i; j >= 2; j--) { if (A[j] > A[j-1]) break; t = A[j]; A[j] = A[j-1]; A[j-1] = t; ... ㉠ }}

23. ㉠으로 표시된 줄은 총 몇 번 수행되는가?

0591215

24. 배열 A[1]부터 A[6]에 다음과 같이 6개의 수가 들어있을 때, ㉠의 줄이 수행되는 횟수가 가장 적은 것은?

6, 5, 4, 3, 2, 16, 1, 2, 3, 4, 52, 3, 1, 4, 5, 64, 2, 1, 3, 5, 61, 2, 6, 5, 4, 3

[25-26] 아래와 같은 함수 f가 있다.

int f(int a, int b, int m) { int r; if (b == 0) return 1; r = f(a, b / 2, m); r = (r * r) % m; if (b % 2 == 1) r = (r * a) % m; return r;}

25. f(2, 3, 9) 의 결과값은 무엇인가?

235817

26. f(3, 32130, 10) 의 결과값은 무엇인가?

1379Overflow Error

27. 아래와 같은 함수 f가 있다.

void f(int &a, int &b, int m) { int c = a + b; if (m == 0) return; a = b; b = c; f(a, b, m-1);}

아래 프로그램의 출력값은 무엇인가?

int a = 1;int b = 1;f(a, b, 5);printf("%d\n", b);

1581213

[28-29] 어떤 양의 정수가 2의 거듭제곱 (1, 2, 4, 8, … ) 인지를 판별하는 프로그램을 작성하려고 한다.

void f(int n) { if (n > ㉠ && (n ㉡ (n - 1)) == ㉢) printf("n is a power of 2\n");}

28. ㉠와 ㉢에 공통으로 들어갈 값은 얼마인가?

-10122147483647

29. ㉡ 에 들어가야 할 연산자는 무엇인가?

+*&|^

[30-32] 아래와 같은 문제를 해결하기 위해 프로그램을 작성하였다. 물음에 답하여라.

문제

당신에게 미로가 하나 주어진다. 미로는 각각의 방들이 가로로 N개, 세로로 N개 모인 정사각형 모양으로, N*N 배열에 저장되어 있다. 배열에 저장된 값이 0이면 그 방으로 이동할 수 있음을 나타내고, 배열에 저장된 값이 1이면 그 방은 벽으로 막혀 있어 이동할 수 없음을 나타낸다. 미로의 가장자리는 모두 막힌 방으로 둘러싸여 있다고 가정한다.

미로와 시작점의 위치, 끝 점의 위치가 주어졌을 때, 상하좌우로 이동하면서 시작점에서 끝 점까지 가장 빨리 갈 수 있는 경로의 길이를 출력하는 프로그램을 작성하시오. 시작점에서 끝 점까지의 경로가 존재하지 않는 경우는 없다고 가정한다.

프로그램

// m : 미로가 저장되어 있는 배열// sx, sy : 시작점의 위치// ex, ey : 끝 점의 위치qy[0] = -1, qx[0] = 0;qy[1] = sy, qx[1] = sx;m[sy][sx] = -1;

;while (f < r) { x = qx[f], y = qy[f]; f++; if (y == -1) {

qy[r] = -1, qx[r] = x + 1; r++; ans = x; } else { if (y == ey && x == ex) { break; } if (m[y - 1][x] == 0) { m[y - 1][x] = -1;

; r++; } if (m[y + 1][x] == 0) { m[y + 1][x] = -1; qx[r] = x, qy[r] = y + 1; r++; } if (m[y][x - 1] == 0) { m[y][x - 1] = -1; qx[r] = x - 1, qy[r] = y; r++; } if (m[y][x + 1] == 0) { m[y][x + 1] = -1; qx[r] = x + 1, qy[r] = y; r++; } }}printf("%d\n", ans);

30. 위의 빈 칸 ㉠에 알맞은 내용은?

f = 0, r = 1f = 0, r = 2f = 1, r = 1f = 1, r = 2f = 2, r = 0

31. 위의 빈 칸 ㉢에 알맞은 내용은?

qx[r] = x, qy[r] = yqx[r] = x + 1, qy[r] = y - 1qx[r] = x - 1, qy[r] = y - 1qx[r] = x, qy[r] = y + 1qx[r] = x, qy[r] = y - 1

32. 위의 프로그램은 시작점에서 끝점까지의 경로가 존재하지 않는 경우에는 프로그램이 종료되지 않는다는 문제가 있다. 이 문제를 없애기 위해 ㉡부분에 새로 코드를 추가하여 경로가 존재하지 않는 경우에는 -1을 출력하고 프로그램을 정상적으로 진행시키고 싶다. 다음 중 ㉡에 알맞은 내용은?

if (f == r) {if (f == r) { ans = -1; ans = -1; break; f++;}}

if (f + 1 == r) {if (f == r + 1) { ans = -1; ans = -1; break; break;}}

if (f + 1 == r) { x = -1; f = r + 1;}

[33-35] 아래와 같은 문제를 해결하기 위해 프로그램을 작성하였다. 물음에 답하여라.

문제

최고 속력 600 km/h로 운행하는 것을 목표로 하는 ‘한국형 초고속철도 사업’이 순조롭게 진행되고 있다. 이미 초고속철도의 시험선로를 구축하였고 열차를 시험운행하고 있다. 그리고 선로의 상태를 검사하기 위하여, 선로의 지정된 검사구간을 담당하는 로봇을 설치하였다. 그런데 검사구간이 서로 겹치는 로봇 사이에는 빈번한 데이터 교환이 필요하다. 따라서 이를 지원할 데이터 송수신 장치를 모든 로봇에 설치할 뿐만 아니라, 특별한 데이터 처리장치를 로봇에 부착하기로 하였다. 그러나 이 처리장치는 모든 로봇에 부착하지 않아도 되지만, 두 로봇이 담당하고 있는 검사구간이 서로 겹치면 이 두 로봇 중에서 적어도 하나에는 반드시 부착되어야 한다.

아래 그림과 같은 시험선로에서 네 개의 로봇 a, b, c, d가 있고, 각 로봇의 검사구간은 아래와 같다고 하자. 로봇 a와 b는 담당하는 선로의 검사구간이 겹치므로 둘 중 최소한 하나에 처리장치가 부착되어야 한다. 로봇 b와 c, b와 d, 그리고 c와 d의 경우도 마찬가지이다.

위의 조건을 만족하면서 처리장치를 부착하는 것은 여러 가지 경우가 있을 수 있다. 위 그림의 예에서 {a, b, c, d} 모두에 부착할 수도 있고, {b, c}에 부착할 수도 있다. 우리 팀에서는 어떤 로봇에 처리장치를 부착하는 것이 좋은 지를 연구하고 있는데, 우선 위 조건을 만족하면서 처리장치를 부착할 수 있는 모든 경우의 수를 구하여 보기로 하였다. 위의 예에서 가능한 경우를 모두 나열해보면 {a, b, c, d}, {a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}, {b, d}, {b, c}, 총 일곱 가지 경우가 있다.

시험선로를 눈금이 매겨진 직선으로 나타내며, 로봇의 검사구간은 이 직선 위에 있다고 할 때, 로봇들이 담당하는 선로의 검사구간을 입력 받아 로봇에 처리장치를 부착할 수 있는 모든 경우의 수를 구하시오. 경우의 수가 20,080,510 이상일 때에는 20,080,510으로 나눈 나머지를 출력한다.

입력 형식

입력 파일의 이름은 INPUT.TXT이다. 첫째 줄에 로봇의 개수 이 입력된다. 둘째 줄부터 개의 줄에 한 줄에 하나씩 로봇이 담당하는 검사구간의 왼쪽 끝점의 좌표와 오른쪽 끝점의 좌표가 빈 칸을 사이에 두고 주어진다. 각 검사구간의 왼쪽 끝점의 좌표가 오른쪽 끝점의 좌표보다 항상 작다. 또한 검사구간들의 끝점들의 좌표는 모두 서로 다르다. 다시 말하면, 어떤 좌표 값에도 두 개 이상의 검사구간의 끝점이 위치하지 않는다.

출력 형식

출력 파일의 이름은 OUTPUT.TXT이다. 첫째 줄에 문제의 조건을 만족하면서 처리장치를 부착할 수 있는 경우의 수를 출력한다. 만약 경우의 수가 20,080,510 이상일 때에는 20,080,510으로 나눈 나머지를 출력한다.

입력과 출력의 예

입력(INPUT.TXT)

46 2013 4929 4134 55

출력(OUTPUT.TXT)

7

프로그램

#include <stdio.h>const int Maxn = 10005;int n;int train[Maxn][2];int nl[Maxn][2];int x[Maxn];int res[Maxn];void swap(int &a, int &b) { int t; t = a; a = b; b = t;}void bsort(int ar[][2], int sz) { int i, j; int m; int index; for(i = 0; i < sz; i++) { m = ar[i][1]; index = i; for(j = i + 1; j < sz; j++) {

} if (i != index) { swap(ar[i][0], ar[index][0]); swap(ar[i][1], ar[index][1]); } }}int main() { FILE *fin = fopen("INPUT.TXT", "r"); int i, j; fscanf(fin, "%d", &n); for(i = 0; i < n; i++) { fscanf(fin, "%d%d", &train[i][0], &train[i][1]); } fclose(fin); bsort(train, n); for(i = 0; i < n; i++) { nl[i][0] = i; nl[i][1] = train[i][0]; } bsort(nl, n); int t; for(i = 0; i < n; i++) { x[nl[i][0]] = n; if (train[0][1] <= nl[i][1]) break; } if (i != n) { t = 0; for(j = i; j < n; j++) { while(t < n && train[t][1] <= nl[j][1]) { t++; } x[nl[j][0]] = t - 1; } }

for(i = 1; i < n; i++) {

res[i] = res[i] % 20080510; } FILE *fout = fopen("OUTPUT.TXT", "w"); fprintf(fout, "%d\n", res[n - 1]); fclose(fout); return 0;}

33. 위 코드에서 bsort함수는 주어진 배열을 정렬하는 함수이다. bsort안에 있는 빈 칸 ㉠에 알맞은 내용은?

if (m < ar[j][1]) {if (ar[j][1] < ar[i][1]) { m = ar[j][1]; m = ar[j][1]; index = j; index = j;}}

if (ar[j][1] > ar[i][1]) {if (m > ar[j][0]) { m = ar[j][1]; m = ar[j][0]; index = j; index = j;}}

if (m > ar[j][1]) { m = ar[j][1]; index = j;}

34. 위의 빈 칸 ㉡에 알맞은 내용은?

res[i] = res[i - 1] + res[x[i]];res[i] = res[i - 1] + res[x[i + 1]];res[i] = res[x[i]] + res[x[i - 1]] + 4;res[i] = x[i - 1] + res[i - 1] - 1;res[i] = res[nl[i][0]] + res[i - 1];

35. 위의 빈 칸 ㉢에 알맞은 내용은?

res[n] = 0;res[n] = 1;res[n] = 2;res[0] = 2;res[0] = 2;res[0] = 2;

res[n] = 1;res[n] = 2;res[0] = 1;res[0] = 1;

<Visual Basic 사용자용 문제>

※ 문제나 프로그램 내에 명시되지 않은 변수와 배열은 모두 Integer형이다.

 

16. 아래 프로그램의 실행 결과는 무엇인가?

c = 0For i = 1 To 10 c = c + 1Next iDebug.Print c

89104555

17. 아래 프로그램의 실행 결과는 무엇인가?

c = 1For i = 0 To 5 c = c * iNext iDebug.Print c

016120720

18. 다음은 어떤 프로그램의 일부이다. s가 정수형 변수라고 할 때, 다음 부분이 실행된 뒤 s의 값은?

s = 1For i = 1 To 2008 If s < 10 Then s = s * 2 Else s = Int(s / 3) End IfNext i

3561016

[19-20] 영문 대문자로 구성된 영어 단어가 주어졌을 때, 단어에서 가장 많이 출현하는 알파벳이 무엇인지 구하는 프로그램을 아래와 같이 작성했다.

Dim word As StringDim count(26) As Integerword = "COCOA"maxoccur = 0For i = 0 To 25 count(i) = 0Next iFor i = 1 To Len(word) Index = Asc(Mid(word, i, 1)) - ㉠ count(Index) = count(Index) + 1Next iFor i = 0 To 25 If maxoccur <= count(i) Then maxoccur = count(i) maxindex = i End IfNext iDebug.Print Chr(maxindex + ㉡)

19. ㉠와 ㉡에 공통으로 들어갈 구문은 무엇인가?

Asc("@")Asc("A")Asc("Z")9697

20. 이 프로그램을 실행한 결과는?

@ACOZ

21. 다음은 어떤 프로그램의 일부이다. 여기서 N은 배열 a의 원소 개수를 나타내고, a에는 a(0)부터 a(N - 1)까지 임의의 숫자가 들어있다. N이 10이고 배열에 1부터 10까지의 서로 다른 정수가 임의의 순서로 저장되어 있을 때, 다음 부분이 실행된 뒤에 결과로 나올 수 없는 것은?

For i = Int(N / 2) - 1 To 0 Step -1 j = i Do While j * 2 + 1 < N If j * 2 + 2 < N Then If a(j * 2 + 1) > a(j * 2 + 2) Then k = j * 2 + 2 Else k = j * 2 + 1 End If Else k = j * 2 + 1 End If If a(j) > a(k) Then temp = a(j) a(j) = a(k) a(k) = temp j = k Else Exit Do End If LoopNext iFor i = 0 To N - 1 Debug.Print a(i);Next iDebug.Print

1 2 6 3 7 10 8 4 5 91 2 3 5 8 10 4 6 9 71 3 2 4 5 7 9 10 8 61 3 2 5 4 6 10 9 8 71 2 3 6 4 5 7 8 9 10

22. 아래 프로그램의 실행 결과는 무엇인가?

c = 0For i = 1 To 100 d = 0 For j = 1 To i If (i Mod j) <> 0 Then d = d + 1 Next j If i = d + 3 Then c = c + 1Next iDebug.Print c

345910

[23-24] A라는 배열에 아래와 같이 값이 담겨 있다.

A[1]

A[2]

A[3]

A[4]

A[5]

A[6]

10

7

20

5

30

4

이 배열을 아래 프로그램으로 처리하려고 할 때 물음에 답하라.

For i = 2 To 6 For j = i To 2 Step -1 If A(j) > A(j - 1) Then Exit For t = A(j): A(j) = A(j - 1): A(j - 1) = t ... ㉠ Next jNext i

23. ㉠으로 표시된 줄은 총 몇 번 수행되는가?

0591215

24. 배열 A[1]부터 A[6]에 다음과 같이 6개의 수가 들어있을 때, ㉠의 줄이 수행되는 횟수가 가장 적은 것은?

6, 5, 4, 3, 2, 16, 1, 2, 3, 4, 52, 3, 1, 4, 5, 64, 2, 1, 3, 5, 61, 2, 6, 5, 4, 3

[25-26] 아래와 같은 함수 f가 있다.

Function f(a, b, m) As Integer If b = 0 Then f = 1 Else r = f(a, int(b / 2), m) r = (r * r) Mod m If b Mod 2 = 1 Then r = (r * a) Mod m f = r End IfEnd Function

25. f(2, 3, 9) 의 결과값은 무엇인가?

235817

26. f(3, 32130, 10) 의 결과값은 무엇인가?

1379Overflow Error

27. 아래와 같은 서브프로그램 f가 있다.

Sub f(ByRef a, ByRef b, m) c = a + b If m = 0 Then Exit Sub a = b b = c Call f(a, b, m - 1)End Sub

아래 프로그램의 출력값은 무엇인가?

a = 1b = 1Call f(a, b, 5)Debug.Print b

1581213

[28-29] 어떤 양의 정수가 2의 거듭제곱 (1, 2, 4, 8, … ) 인지를 판별하는 프로그램을 작성하려고 한다.

Sub f(n As Long) If n > ㉠ And (n ㉡ (n - 1)) = ㉢ Then Debug.Print ("n is a power of 2") End IfEnd Sub

28. ㉠와 ㉢에 공통으로 들어갈 값은 얼마인가?

-10122147483647

29. ㉡ 에 들어가야 할 연산자는 무엇인가?

+*AndOrXor

[30-32] 아래와 같은 문제를 해결하기 위해 프로그램을 작성하였다. 물음에 답하여라.

문제

당신에게 미로가 하나 주어진다. 미로는 각각의 방들이 가로로 N개, 세로로 N개 모인 정사각형 모양으로, N*N 배열에 저장되어 있다. 배열에 저장된 값이 0이면 그 방으로 이동할 수 있음을 나타내고, 배열에 저장된 값이 1이면 그 방은 벽으로 막혀 있어 이동할 수 없음을 나타낸다. 미로의 가장자리는 모두 막힌 방으로 둘러싸여 있다고 가정한다.

미로와 시작점의 위치, 끝 점의 위치가 주어졌을 때, 상하좌우로 이동하면서 시작점에서 끝 점까지 가장 빨리 갈 수 있는 경로의 길이를 출력하는 프로그램을 작성하시오. 시작점에서 끝 점까지의 경로가 존재하지 않는 경우는 없다고 가정한다.

프로그램

' m : 미로가 저장되어 있는 배열' sx, sy : 시작점의 위치' ex, ey : 끝 점의 위치qy(0) = -1qx(0) = 0qy(1) = syqx(1) = sxm(sy, sx) = -1

Do While f < r x = qx(f) y = qy(f) f = f + 1 If y = -1 Then

qy(r) = -1 qx(r) = x + 1 r = r + 1 ans = x Else If y = ey And x = ex Then Exit Do End If If m(y - 1, x) = 0 Then m(y - 1, x) = -1

r = r + 1 End If If m(y + 1, x) = 0 Then m(y + 1, x) = -1 qx(r) = x: qy(r) = y + 1 r = r + 1 End If If m(y, x - 1) = 0 Then m(y, x - 1) = -1 qx(r) = x - 1: qy(r) = y r = r + 1 End If If m(y, x + 1) = 0 Then m(y, x + 1) = -1 qx(r) = x + 1: qy(r) = y r = r + 1 End If End IfLoop Debug.Print ans

30. 위의 빈 칸 ㉠에 알맞은 내용은?

f = 0: r = 1f = 0: r = 2f = 1: r = 1f = 1: r = 2f = 2: r = 0

31. 위의 빈 칸 ㉢에 알맞은 내용은?

qx(r) = x: qy(r) = yqx(r) = x + 1: qy(r) = y - 1qx(r) = x - 1: qy(r) = y - 1qx(r) = x: qy(r) = y + 1qx(r) = x: qy(r) = y - 1

32. 위의 프로그램은 시작점에서 끝점까지의 경로가 존재하지 않는 경우에는 프로그램이 종료되지 않는다는 문제가 있다. 이 문제를 없애기 위해 ㉡부분에 새로 코드를 추가하여 경로가 존재하지 않는 경우에는 -1을 출력하고 프로그램을 정상적으로 진행시키고 싶다. 다음 중 ㉡에 알맞은 내용은?

If f = r ThenIf f = r Then ans = -1 ans = -1 Exit Do f = f + 1End IfEnd If

If f + 1 = r ThenIf f = r + 1 Then ans = -1 ans = -1 Exit Do Exit DoEnd IfEnd If

If f + 1 = r Then x = -1 f = r + 1End If

[33-35] 아래와 같은 문제를 해결하기 위해 프로그램을 작성하였다. 물음에 답하여라.

문제

최고 속력 600 km/h로 운행하는 것을 목표로 하는 ‘한국형 초고속철도 사업’이 순조롭게 진행되고 있다. 이미 초고속철도의 시험선로를 구축하였고 열차를 시험운행하고 있다. 그리고 선로의 상태를 검사하기 위하여, 선로의 지정된 검사구간을 담당하는 로봇을 설치하였다. 그런데 검사구간이 서로 겹치는 로봇 사이에는 빈번한 데이터 교환이 필요하다. 따라서 이를 지원할 데이터 송수신 장치를 모든 로봇에 설치할 뿐만 아니라, 특별한 데이터 처리장치를 로봇에 부착하기로 하였다. 그러나 이 처리장치는 모든 로봇에 부착하지 않아도 되지만, 두 로봇이 담당하고 있는 검사구간이 서로 겹치면 이 두 로봇 중에서 적어도 하나에는 반드시 부착되어야 한다.

아래 그림과 같은 시험선로에서 네 개의 로봇 a, b, c, d가 있고, 각 로봇의 검사구간은 아래와 같다고 하자. 로봇 a와 b는 담당하는 선로의 검사구간이 겹치므로 둘 중 최소한 하나에 처리장치가 부착되어야 한다. 로봇 b와 c, b와 d, 그리고 c와 d의 경우도 마찬가지이다.

위의 조건을 만족하면서 처리장치를 부착하는 것은 여러 가지 경우가 있을 수 있다. 위 그림의 예에서 {a, b, c, d} 모두에 부착할 수도 있고, {b, c}에 부착할 수도 있다. 우리 팀에서는 어떤 로봇에 처리장치를 부착하는 것이 좋은 지를 연구하고 있는데, 우선 위 조건을 만족하면서 처리장치를 부착할 수 있는 모든 경우의 수를 구하여 보기로 하였다. 위의 예에서 가능한 경우를 모두 나열해보면 {a, b, c, d}, {a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}, {b, d}, {b, c}, 총 일곱 가지 경우가 있다.

시험선로를 눈금이 매겨진 직선으로 나타내며, 로봇의 검사구간은 이 직선 위에 있다고 할 때, 로봇들이 담당하는 선로의 검사구간을 입력 받아 로봇에 처리장치를 부착할 수 있는 모든 경우의 수를 구하시오. 경우의 수가 20,080,510 이상일 때에는 20,080,510으로 나눈 나머지를 출력한다.

입력 형식

입력 파일의 이름은 INPUT.TXT이다. 첫째 줄에 로봇의 개수 이 입력된다. 둘째 줄부터 개의 줄에 한 줄에 하나씩 로봇이 담당하는 검사구간의 왼쪽 끝점의 좌표와 오른쪽 끝점의 좌표가 빈 칸을 사이에 두고 주어진다. 각 검사구간의 왼쪽 끝점의 좌표가 오른쪽 끝점의 좌표보다 항상 작다. 또한 검사구간들의 끝점들의 좌표는 모두 서로 다르다. 다시 말하면, 어떤 좌표 값에도 두 개 이상의 검사구간의 끝점이 위치하지 않는다.

출력 형식

출력 파일의 이름은 OUTPUT.TXT이다. 첫째 줄에 문제의 조건을 만족하면서 처리장치를 부착할 수 있는 경우의 수를 출력한다. 만약 경우의 수가 20,080,510 이상일 때에는 20,080,510으로 나눈 나머지를 출력한다.

입력과 출력의 예

입력(INPUT.TXT)

46 2013 4929 4134 55

출력(OUTPUT.TXT)

7

프로그램

Const Maxn As Long = 10005Dim n As LongDim train(Maxn, 2) As LongDim nl(Maxn, 2) As LongDim x(Maxn) As LongDim res(Maxn) As LongSub swap_int(a, b) t = a a = b b = tEnd SubSub bsort(ar, sz) For i = 0 To sz - 1 m = ar(i, 1) Index = i For j = i + 1 To sz - 1

Next j If i <> Index Then Call swap_int(ar(i, 0), ar(Index, 0)) Call swap_int(ar(i, 1), ar(Index, 1)) End If Next iEnd SubSub main() Open "INPUT.TXT" For Input As #1 Input #1, n For i = 0 To n - 1 Input #1, train(i, 0), train(i, 1) Next i Close #1 Call bsort(train, n) For i = 0 To n - 1 nl(i, 0) = i nl(i, 1) = train(i, 0) Next i Call bsort(nl, n) For i = 0 To n - 1 x(nl(i, 0)) = n If train(0, 1) <= nl(i, 1) Then Exit For Next i If i <> n Then t = 0 For j = i To n - 1 While t < n And train(t, 1) <= nl(j, 1) t = t + 1 Wend x(nl(j, 0)) = t - 1 Next j End If

For i = 1 To n - 1

res(i) = res(i) Mod 20080510 Next i Open "OUTPUT.TXT" For Output As #2 Print #2, res(n - 1) Close #2End Sub

33. 위 코드에서 bsort함수는 주어진 배열을 정렬하는 서브프로그램이다. bsort안에 있는 빈 칸 ㉠에 알맞은 내용은?

If m < ar(j, 1) ThenIf ar(j, 1) < ar(i, 1) Then m = ar(j, 1) m = ar(j, 1) Index = j Index = jEnd IfEnd If

If ar(j, 1) > ar(i, 1) ThenIf m > ar(j, 0) Then m = ar(j, 1) m = ar(j, 0) Index = j Index = jEnd IfEnd If

If m > ar(j, 1) Then m = ar(j, 1) Index = jEnd If

34. 위의 빈 칸 ㉡에 알맞은 내용은?

res(i) = res(i - 1) + res(x(i))res(i) = res(i - 1) + res(x(i + 1))res(i) = res(x(i)) + res(x(i - 1)) + 4res(i) = x(i - 1) + res(i - 1) - 1res(i) = res(nl(i, 0)) + res(i - 1)

35. 위의 빈 칸 ㉢에 알맞은 내용은?

res(n) = 0res(n) = 1res(n) = 2res(0) = 2res(0) = 2res(0) = 2

res(n) = 1res(n) = 2res(0) = 1res(0) = 1

반응형

'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글

파서트리  (0) 2009.08.19
new 연산자 오버로딩  (0) 2009.08.19
퀵소트  (0) 2009.08.19
선택정렬  (0) 2009.08.19
삽입정렬  (0) 2009.08.19
중복되지 않게 랜덤한 카드 발생  (0) 2009.08.19
파이, e, sin 구하기  (0) 2009.08.19
Sin함수 만들기(II)  (0) 2009.08.19
적분 공식을 이용한 Sin(x)함수 만들기  (0) 2009.08.19
정보올림피아드 프로그래밍  (0) 2009.08.19