[컴퓨팅과 문제해결]

어떤 나라에 10개의 도시가 있고 각 도시에는 도시를 대표하는 시장이 거주하고 있다. 이 도시들은 아래 그림처럼 도로로 연결되어 있으며 도로위의 숫자는 도로를 지나가는데 필요한 이동 시간을 나타낸다. 예를 들어, 도시 A에서 출발하여 도시 B를 거처 도시 C로 이동하는 데는 총 5시간이 걸린다. 이 나라는 중요한 결정 사항이 생기면 모든 도시의 시장이 한 도시에서 모여 회의를 가진 후 결론을 낸다고 한다. 

모든 시장의 이동 시간을 더한 총합을 최소로 하고자 한다면 어느 도시에서 모여야 하겠는가? 


① B
② C
③ D
④ E
⑤ H

의견 (1개)

어떤 나라에 10개의 도시가 있고 각 도시에는 도시를 대표하는 시장이 거주하고 있다. 이 도시들은 아래 그림처럼 도로로 연결되어 있으며 도로위의 숫자는 도로를 지나가는데 필요한 이동 시간을 나타낸다. 예를 들어, 도시 A에서 출발하여 도시 B를 거처 도시 C로 이동하는 데는 총 5시간이 걸린다. 이 나라는 중요한 결정 사항이 생기면 모든 도시의 시장이 한 도시에서 모여 회의를 가진 후 결론을 낸다고 한다. 

긴급한 안건이 발생하여 가장 빠른 시간 내에 모든 시장이 참석하는 회의를 개최하고자 한다. 어느 도시에서 모여야 하겠는가?


① B
② C
③ D
④ E
⑤ H

어떤 사람이 총 10억원을 결혼한 세 명의 형제와 그들의 아내에게 유산으로 남겨주었다. 형제들이 만나서 얘기하던 중 지성씨는 자신의 아내와 같은 금액을 유산으로 받았고, 희열씨는 자신이 아내가 받은 유산의 1.5 배를, 그리고 동욱씨는 자신의 아내보다 두 배의 금액을 받았다는 사실을 알게 되었다. 아내들도 만나서 얘기해 보니 자신들이 받은 유산은 총 3억9천6백만원이라는 사실과 서로 받은 금액에 차이가 있다는 사실도 알게 되었다. 정희씨는 가희씨보다 1천만원을 더 받았고, 미진씨는 정희씨보다 1천만 원을 더 받았다. 그렇다면 세 형제, 지성씨, 희열씨, 동욱씨의 아내는 각각 누구인가?


① 미진, 정희, 가희
② 가희, 정희, 미진
③ 미진, 가희, 정희
④ 가희, 미진, 정희
⑤ 정희, 가희, 미진

한 자동차회사에서 개발한 하이브리드 자동차는 휘발유와 전기배터리로 갈 수 있으며, 전기배터리는 휘발유가 다 떨어졌을 때 사용된다고 한다. 이 자동차의 휘발유 탱크용량은 60리터이며, 전기배터리 최대용량은 500,000 암페어라고 한다. 또한, 이 자동차는 휘발유 1리터로 최대 15km를 갈 수 있으며, 10,000 암페어로 최대 1km를 갈 수 있다고 한다. 휘발유로 달릴 때 10km당 5,000 암페어씩 충전된다고 가정할 때, 처음에 휘발유를 가득 싣고 달릴 수 있는 최대 거리는 얼마인가? 단, 처음 출발할 때 배터리가 방전상태라고 가정한다. 


① 945km
② 950km
③ 955km
④ 960km
⑤ 965km

다음의 프로그램은 로봇(▲)을 목적지(※)까지 도착시키는 프로그램이다. 다음 프로그램을 실행시키면, 목적지에 도달하지 못하는 경우는?

<프로그램>
시작
로봇이 목적지에 도착할 때까지 반복 수행 {
  벽에 닿을 때까지 앞으로 이동
  벽에 닿았다면, 오른쪽으로 회전
}
끝



왼쪽 괄호 “(” 와 오른쪽 괄호 “)” 로 만들어진 문자열이 있다. 올바른 괄호 짝이란 (()) 나 ()() 같이 올바르게 닫힌 괄호 문자열을 의미한다. )( 나 ())( 와 같은 문자열은 올바른 괄호 짝이 아니다. 왼쪽 괄호와 오른쪽 괄호가 각각 3개 있는 경우는 아래와 같이 모두 5종류가 있다.

()()(), ()(()), (()()), (())(), ((())) 

왼쪽과 오른쪽 괄호 각각 4개로 만들 수 있는 모든 문자열에서 올바른 괄호 짝이 아닌 문자열은 모두 몇 개인가?


① 51
② 52
③ 53
④ 54
⑤ 55

의견 (3개)

한 프로그래머가 온라인 상점(스토어)에서 판매하는 게임의 매뉴얼을 제작하였다. 하지만 곧 매뉴얼 전체에서 “염소”와 “양”의 역할을 반대로 작성하였다는 것을 발견하였다. 이 프로그래머는 “염소”라고 작성된 것을 “양”으로 바꾸어야 하고, “양”이라고 작성된 것을 “염소”로 바꾸어야 한다. 이때, 프로그래머는 “여우”라는 단어가 매뉴얼에서 한번도 사용되지 않은 사실을 알고 있다. 다음 보기 중에서 어떤 알고리즘이 프로그램의 오류를 정확하게 고칠 수 있을까?

  • ㄱ. 먼저, “염소”를 모두 “양”으로 바꾼다. 그리고, “양”을 모두 “염소”로 바꾼다.
  • ㄴ. 먼저, “염소”를 모두 “양”으로 바꾼다. 그리고, “양”을 모두 “염소”로 바꾼다. 마지막으로, “여우”를 모두 “양”으로 바꾼다.
  • ㄷ. 먼저, “염소”를 모두 “여우”로 바꾼다. 그리고, “양”을 모두 “염소”로 바꾼다. 마지막으로 “여우”를 “양”으로 바꾼다.
  • ㄹ. 먼저, “염소”를 모두 “여우”로 바꾼다. 그리고, “여우”를 모두 “양”으로 바꾼다. 마지막으로 “양”을 모두 “염소”로 바꾼다.

① ㄱ
② ㄴ
③ ㄷ
④ ㄹ
⑤ ㄴ, ㄹ

여섯 개의 도시 a,b,c,d,e,f 를 연결하려고 한다. 주어진 두 도시 사이를 연결하는데 드는 비용이 다음과 같다고 할 때 모든 도시가 연결되도록 하되 싸이클이 존재하지 않도록 하려고 한다. 즉, 한 도시에서 다른 도시들을 거쳐 다시 그 도시로 돌아오는 경우가 존재하지 않게 하려면 최소 비용이 얼마인가?

  • a-b : 1
  • a-c : 2
  • b-d : 3
  • c-d : 6
  • c-e : 7
  • d-e : 4
  • d-f : 9
  • e-f : 5

① 12
② 13
③ 14
④ 15
⑤ 16

의견 (4개)

방정식 x1 + x2 + x3 + x4 = 20 에서 x1 은 3 이상, x2 는 1 이상, x3 은 0 이상, x4 는 5 이상을 만족하는 정수해의 개수는 몇 개인가?


① 330
② 340
③ 354
④ 360
⑤ 364

의견 (1개)

다음 중에서 4,096의 배수인 16진수는?


① 0xFFFF
② 0xFFF0
③ 0xFF00
④ 0xF000
⑤ 0x000F

n 개의 수들을 가지고 완전 이진트리를 만들 경우 이 트리의 높이는 얼마인가?


① log2n 의 버림 값
② (log2n)3 의 버림 값
③ (log2n + 1) 의 버림 값
④ (log2n - 1) 의 버림 값
⑤ (log2n)2 의 버림 값

의견 (4개)

4팀이 한 조를 구성하여 한 팀이 같은 조 내의 다른 모든 팀과 한번 씩만 대결하는 리그 방식으로 축구 경기를 하여 상위 2 팀을 선발하려고 한다. 한 경기에서 이길 경우 승점 3점, 무승부일 경우 승점 1점, 질 경우에는 승점이 0점인 리그경기가 다 끝났을 때, 3위 팀이 가질 수 있는 최대의 승점은 얼마인가? 단 승점이 같을 경우에는 골 득실 등을 따져 순위를 가리며, 각 팀의 골득실차는 모두 다르다고 가정한다.


① 3
② 4
③ 5
④ 6
⑤ 7

의견 (1개)

다음 표에서 X에 들어갈 수는 무엇인가?

1 2 3 4 5
2 5 13 30  
3 13 42    
4 30   X  
5        

① 175
② 235
③ 280
④ 344
⑤ 388

의견 (3개)

n 개의 수들을 가지고 최대 이진 힙 데이터 구조를 만들 경우 높이 h 에 위치하는 노드들의 최대 수는?


① n / (2h+1) 값의 올림 값
② n / (2h) 값의 올림 값
③ n / 2 값의 올림 값
④ 2h / n 의 올림 값
⑤ (2h+1) / n 값의 올림 값

의견 (6개)

다음 점화식의 해는 무엇인가?

  • T(n) = 2 if n = 2
  • T(n) = 2T(n/2) + n if n = 2k, for k > 1

(단, n 은 2 의 거듭제곱, 즉 2, 4, 8, 16, ... 이라 가정한다.)


① n
② n2
③ n3
④ n * log2n
⑤ n * (log2n)2

[알고리즘과 프로그래밍]

다음 프로그램의 출력 결과는 무엇인가?

char str[] = "Lucky Boy";
int i, score = 0;
for (i = 0; str[i]; i++) {
  int ch = str[i];
  if (ch >= 'A' && ch <= 'Z') {
    score += ch - 'A' + 1;
  }
}
printf("%d\n", score);

① 14
② 114
③ 274
④ 306
⑤ 334

다음 프로그램의 출력 결과는 무엇인가?

int temp=0, i=1;
while(i<10) {
  if( i%2==0 )
    i++;      

  if( temp>5 )
    break;
  temp += i;
}
printf("%d",temp);

① 2
② 3
③ 4
④ 5
⑤ 6

다음 프로그램의 출력 결과는 무엇인가?

int a=2;
int b=2;
while(b) {
  a++; 
  b--;    
}
do {
  a--; 
  b++;
} while(a);
printf("%d", b);

① 4
② 3
③ 5
④ 6
⑤ 7

다음과 같이 함수 f를 구현했을 때, f(10)의 값은?

int f(int n) {
  int i, j, s;
  s = 0;
  for (i=0;i<n;i+=2)
    for (j=0;j<i;j+=2)
      s += i + j; 
  return s;
}

① 80
② 50
③ 60
④ 90
⑤ 40

다음 프로그램 중 주어진 문자열의 길이를 정확하게 출력하는 것은?

int i;
char s[] = "hello";
for(i=0; s[i]; ++i);
printf("A: %d ", i);
i=0;
while(s[i++]);
printf("B: %d ", i);
return 0;

① A 만 옳은 값을 출력한다
② B 만 옳은 값을 출력한다
③ A,B 모두 옳은 값을 출력한다
④ 모두 옳은 값이 아니다
⑤ 컴파일 에러가 발생한다

다음 프로그램의 출력 결과는 무엇인가?

char	str[] = "Welcome";
char* s = str;
while(*s)
printf("%c", *s++);

① Welcome
② elcome
③ 0
④ Wel
⑤ come

의견 (1개)

다음은 주어진 문자열의 순서를 거꾸로 변경하는 함수를 재귀함수로 구현한 프로그램의 일부이다. 입력 문자열은 x 포인터로 지정이 되어 있다. (1)에 들어갈 올바른 문장은 무엇인가?

void f(char *x, int i, int j) {
  char c;
  if (i >= j)
    return;
  c = *(x + i);
  *(x + i) = *(x + j);
  *(x + j) = c;
  (1)
}

① f(x, ++i, --j);
② f(x, i+1, j);
③ f(x, i-1, j+1);
④ f(x, i,j-1);
⑤ f(x,++i+1, --j-1);

다음과 같이 함수 f를 구현했을 때, f(2018)의 값은?

int f(int n) {
  int i;
  for (i=0;i<n;i++) {
    if (n%2) n/=2;
    else n=2*n+1;
  }
  return n;
}

① 2018
② 1015
③ 1
④ 2017
⑤ 1000

다음과 같은 패턴이 있다.

   *
  ***
 *****
*******

이 패턴을 출력하기 위해서 함수를 아래와 같이 구현하였고 draw(4)를 호출하였다. 빈칸(a)에 들어갈 알맞은 코드는?

void draw(int n) {
  int i, j;
  for (i=1; i<=n; i++) {
    for (j=1; j<=n-i; j++) printf (" ");
    for (j=1; (a) ; j++) printf ("*");
    printf("\n");
  }  
}

① j<=i
② j<=i+1
③ j<=2*i
④ j<=2*i-1
⑤ j<=3*i

다음은 배열 a을 오름차순으로 정렬하는 프로그램이다. 빈칸(1)과 (2)에 들어갈 알맞은 코드는?

#define N 10
#include<stdio.h>
void swap(int *a, int *b) {
  (1)
}
int main() {
  int a[N+1] = { 5,4,2,56,7,1,23,4,63,-1 };
  int i, j;
  for (i = 0; i < N; i++)
    for (j = i + 1; j < N; j++)
      (2)
    for (i = 0; i < N; i++)
    printf("%d ", a[i]);
  printf("\n");
}

(1) if (*a > *b)
  {
    int cmp = *a;
    *a = *b;
    *b = cmp;
  }
(2) swap(&a[i],&a[j]);
(1) if (*a > *b)
  {
    int cmp = *a;
    *a = *b;
    *b = cmp;
  }
(2) swap(a[i],a[j]);
(1) if (*a > *b)
  {
    int cmp = *a;
    *a = *b;
    *b = cmp;
  }
(2) swap(*a[i],*a[j]);
(1) if (a > b)
  {
    int cmp = a;
    a = b;
    b = cmp;
  }
(2) swap(&a[i],&a[j]);
(1) if (a > b)
  {
    int cmp = a;
    a = b;
    b = cmp;
  }
(2) swap(a[i],a[j]);

다음은 a[i]의 스트링을 b[i]로 모두 복사하는 프로그램이다. 빈칸(1)에 들어갈 알맞은 코드는? 단, a[i]에 입력된 스트링은 항상 99를 초과하지 않는다.

#define N 5
void dic_copy(char a[N][100], char b[N][100])
{
  int i, j;
  for (i = 0; i < N; i++) {
    for (j = 0; j < strlen(a[i]); j++) {
      (1)
    }
  }
}

① *(b+j)[i] = *(a+j)[i];
② *(b+i)[j] = *(a+i)[j];
③ **(b+j)+i = **(a+j)+i;
④ *(*(b+j)+i) = *(*(a+j)+i);
⑤ *(b[i]+j) = *(a[i]+j);

의견 (2개)

다음 프로그램의 출력 결과는 무엇인가?

int num, temp1, temp2;
int A = 2;
int B = 12;
num = ((temp1 = B / A++) + (temp2 = B / ++A)) + ++B;
printf(“%d”, num); 

① 20
② 21
③ 22
④ 23
⑤ 24

의견 (5개)

다음 프로그램의 출력 결과는 무엇인가?

int a = 3;
if (a = 4)
   printf(“A”);
else
   printf(“B”);
if (a = 0)
   printf(“C”);
else
   printf(“D”);

① AD
② AC
③ BC
④ BD
⑤ CD

의견 (2개)

다음과 같이 함수 f를 구현했을 때, f(5,12)의 값은?

int f(int m, int n) {
  if(n<=0 && m<=0) {
    return 1;
  }
  else {
    if(n >= m)
      return f(n-2,m)+f(n-3,m);
    else
      return f(n,m-3);
  }
}

① 73
② 74
③ 75
④ 76
⑤ 77

의견 (3개)

다음 프로그램의 출력 결과는 무엇인가?

int	f(int n) {
  int r = 0, x = 0;
  while (n > 0) {
    x = n % 10;
    r = r * 10;
    r = r + x;
    n = n / 10;
  }
  return r;
}
int main() {
  int n = f(274);
  printf ("%d\n", n);
}

① 274
② 247
③ 472
④ 724
⑤ 291

다음과 같이 함수를 구현했을 때, f(2018)의 값은?

int f(int n) {
  int r = 1;
  while(n > 1) {
      r = r + 1;
      n = n / 2;
  }
  return r;
}

① 8
② 9
③ 10
④ 11
⑤ 12

다음 프로그램의 출력 결과는 무엇인가?

const int n = 10;
int a[n] = {16,12,17,48,89,21,97,59,30,16};
int i, j, t, res=0;
for (i = 0; i < n; i++){
  for (j = i + 1; j < n; j++){
    if (a[i] > a[j]){
      t = a[i];
      a[i] = a[j];
      a[j] = t;
    }
  }
}
printf ("%d\n",a[2]);

① 16
② 18
③ 24
④ 32
⑤ 36

의견 (2개)

다음과 같이 함수 f와 g를 구현했을 때, g(12,13)의 값은?

int f(int a, int b) {
  if (a==0) return b;
  else return 1 + f(a-1,b);
}
int g(int a, int b) {
  if (a==1) return b;
  else return f(b,g(a-1,b));
}

① 20
② 85
③ 90
④ 124
⑤ 156

다음 프로그램과 같이 push와 pop을 하는 자료구조가 있다. 

#include<stdio.h>
#include<stdlib.h>
struct node
{
  int data;
  struct node* next;
};
struct node* push(struct node* head, int data)
{
  struct node* tmp = (struct node*)malloc(sizeof(struct node));
  if (tmp == NULL) {
   exit(0);
  }
  tmp->data = data;
  tmp->next = head;
  head = tmp;
  return head;
}
struct node* pop(struct node *head, int *element){
  struct node* tmp = head;
  *element = head->data;
  head = head->next;
  free(tmp);
  return head;
}

이 자료구조에서 숫자 x를 찾아 숫자 y로 치환하는 함수 replace() 를 만들려고 한다. (1)과 (2)에 들어갈 알맞은 코드는? 단, 자료구조 내에 숫자 x가 두 개 이상일 경우 pop을 했을 때 가장 먼저 나오는 숫자만 치환한다.

void replace(struct node* head, int x, int y)
{
	struct node *current;
	current = head;
	while ( (1) )
	{
		(2)
	}
}

(1) current != NULL
(2) if (current->data == x){
  current->data = y;
}
current = current->next; 
(1) current != NULL
(2) if (current->data == x){
  current->data = y;
  break;
}
current = current->next;
(1) current != NULL
(2) if (current->data == x){
  current->data = y;
  break;
}
current = current. next; 
(1) current->next != NULL
(2) if (current->data == x){
  current->data = y;
  break;
}
current = current. next; 
(1) current->next != NULL
(2) if (current->data == x){
  current->data = y;
}
current = current->next;

의견 (2개)

다음 프로그램의 출력 결과는 무엇인가?

  int i = 0, j = 0, sum = 0;
  while(i < 10) {
    sum += i;
    if (sum % 2)
      continue;
    else if (sum > 20)
      break;
    i++;
  }
  printf("%d\n", sum);
  return 0;

① 23
② 24
③ 25
④ 26
⑤ 27

a=1, b=0, c=-1 일 때, 다음 프로그램의 출력 결과는 무엇인가?

int i = 5;
if(a<b<c){
for(i--; i--; i--)
   printf(“%d ”, i);
} else {
for(i--; --i; i--)
   printf(“%d ”, i);
}

① 4 2 0
② 3 1 -1 -3 5 ...
③ 3 1
④ 4 2 0 -2 4 ...
⑤ 5 3 1

의견 (12개)

다음 프로그램의 출력 결과는 무엇인가? 

int n = 5;
int i,j;
int x = 0;
for(i = 0; i < n; i++) {
  for(j = 0; j <= i; j++) {
    x = x + j + 1;
  }
}
printf("%d\n", x);
return 0;

① 35
② 36
③ 37
④ 38
⑤ 40

다음 프로그램의 출력 결과는 무엇인가? 

void f(int a[], int i, int n) {
  if (a[i]%2==0) { a[i]=0; return f(a,i+1,n); }
  else return;
}
void main() {
  int a[] = {2,4,6,7,9,8,2,5};
  int s = 0;
  f(a,0,8);
  for (int i=0; i<8; i++) s += a[i];
  printf ("%d\n", s);
}

① 21
② 31
③ 37
④ 41
⑤ 45

의견 (1개)

다음은 1000 이하의 음이 아닌 정수 n(n<=100)개를 s배열에 입력받아 counting 정렬을 철수가 구현한 코드이다. 빈칸(1)에 들어갈 알맞은 코드는? (단, m 은 입력받은 정수 중에서 가장 큰 수이다)

int i, j;
int t[100], d[1000];
for (i = 0; i <= m; i++)
  d[i] = 0;
for (j = 1; j <= n; j++)
  d[s[j]] = d[s[j]] + 1;
for (i = 1; i <= m; i++)
  d[i] = d[i] + d[i – 1];
for (j = n; j >= 1; j--) {
  (1)
  d[s[j]] = d[s[j]] - 1;
}
printf("The Sorted array is : ");
for (i = 1; i <= n; i++)
  printf("%d,", t[i]);

① t[s[j]] = d[s[j]];
② t[d[s[j]]] = s[j];
③ t[j] =d[s[j]];
④ t[d[j]] = d[j];
⑤ t[s[d[j]]] = d[j];

입력 값 N에 따라 다음과 같은 결과를 얻는 함수 f를 작성하고자 한다. 빈 칸(1)와 (2)에 알맞은 구문은?

void f(int N)
{
  int row,h,s;
  for(row=0; row<N; row++)
  {
    for(h=1; h<N-row  ;h++)
      printf("=");
    for(s=1; (1) ;s++)
      if( (2) )
        printf("X");
      else
        printf("=");

    for(h=1; h<N-row ;h++)
      printf("=");
    printf("\n");
  }
}

① (1) s<=2*row (2) s==1
② (1) s<=2*row+1 (2) s==1 || s==2*row+1
③ (1) s<=2*row (2) s==1 || s==2*row
④ (1) s<=2*row+1 (2) s==2*row
⑤ (1) s<2*row+1 (2) s==0 || s==2*row+1

다음과 같은 패턴을 생각하자.

*****
**▫**
*▫*▫*
**▫**
*****

이 패턴을 출력하기 위해서 함수를 아래와 같이 구현하였고 draw(5)를 호출하였다. 빈칸(a)에 들어갈 알맞은 코드는? 단, ▫는 띄어쓰기이다

void draw(int n) {
  for (int i=1; i<=n; i++) {
    for (int j=1; j<=n; j++)
      if (i==1 || i==n || j==1 || (a) || j == n) printf ("*");        else printf (" ");
    printf ("\n");
  }
}

① j==n-i
② j<n+1
③ j<i-1 || j==n-i
④ j==i || j==n-i+1
⑤ j==i || j==n-1

공백을 포함하지 않는 문자열 하나를 입력받은 후, 입력받은 문자열에서 중복된 문자를 제거하고 나머지 문자열을 출력하는 프로그램을 작성하고자 한다. 입력된 문자열의 길이는 최대 99이고, 대소문자는 서로 다른 문자로 간주한다. 빈칸 (1)과 (2)에 들어갈 내용으로 알맞은 코드는?

입력과 출력의 예 1

입력

bcDecde

출력

bcDed

입력과 출력의 예 2

입력 

aaabbbCcCB

출력 

abCcB
#include <stdio.h>
#include <string.h>
int main()
{
  int flag = 0, k = 1;
  int i, j;
  char str1[100];
  char str2[100];
  scanf("%s", str1);
  str2[0] = str1[0];
  for(i = 1; i < strlen(str1); i++)
  {
    flag = 0;
    for(j = 0; j < (1) ; j++)
    {
		if(str2[j] == str1[i])
		{
		  flag = 1;
		  break;
		}
    }
    if(!flag)
      (2) = str1[i];
  }
  str2[k] ='\0';
  printf("%s", str2);
  return 0;
}

① (1): k (2): str2[k++]
② (1): k (2): str2[k]
③ (1): strlen(str2) (2): str2[++k]
④ (1): strlen(str2) (2): str2[k]
⑤ (1): strlen(str2) (2): str2[k++]

다음은 암호화의 한 방법이다. 플레이페어(Playfair)는 세계1,2차대전 동안 영국, 미국 등의 연합국들에서 암호문을 작성하기 위해서 사용되었던 암호시스템이다. 플레이페어 암호시스템에서의 비밀키는 특정 키워드를 사용하여 다음과 같은 5 X 5 크기의 문자 매트릭스로 구성된다. 매트릭스는 먼저 키워드를 행의 왼쪽에서 오른쪽으로, 위에서 아래로 순서대로 대입하고 그 이후는 키워드에서 사용되지 않은 알파벳 문자를 순서대로 대입하여 구성된다. 다음의 그림은 ‘monarchy’를 키워드로 사용하여 구성된 플레이페어 매트릭스이다. (단, I와 J는 한 문자로 취급된다.)

< 표 1 >

플레이페어 암호시스템에서는 다음의 규칙을 따라 한 번에 두 글자씩 쌍을 이루어 암호화하게 된다.

규칙1. 한 쌍의 두 글자가 동일한 행에 존재하는 경우, 각 글자는 각각 오른쪽의 글자로 대체된다. 단 마지막 열에 존재하는 글자는 해당 행의 첫 번째 열의 글자로 대체된다. (예를 들어 ‘ar’은 ‘RM’으로 암호화된다.)

규칙2. 한 쌍의 두 글자가 동일한 열에 존재하는 경우, 각 글자는 각각 아래쪽의 글자로 대체된다. 단 마지막 행에 존재하는 글자는 해당 열의 첫 번째 행의 글자로 대체된다. (예를 들어, ‘mu’는 ‘CM’으로 암호화된다.)

규칙3. 위의 두 경우가 아닌 경우, 그 쌍의 두 글자는 각각 자신의 행과 다른 글자의 열이 만나는 곳에 존재하는 글자로 대체된다. (예를 들어, ‘hs’는 ‘BP’, ‘ea’는 ‘IM’(혹은 ‘JM’)으로 암호화된다.) 

< 표 2 > < 표 3 >

위의 글로부터 추론한 것으로 옳은 것만을 아래에서 모두 고른 것은?

  • ㄱ. 문장 “iloveyou”에 대한 <표 2>의 비밀키를 이용한 암호문은 “ESHOGCMV” 이다.
  • ㄴ. 특정 문장에 대해서 <표 3>의 비밀키는 <표 1>의 비밀키와 동일한 암호문을 생성하지 않는다.
  • ㄷ. 플레이페어 암호시스템의 유효한 키의 개수는 25!( = 25 x 24 x ... x 1 )이다.

① ㄱ
② ㄴ
③ ㄷ
④ ㄱ,ㄷ
⑤ ㄴ,ㄷ

의견 (7개)

[단답형:컴퓨팅과 문제해결]

한 컴퓨터회사의 구성원은 사장 1명과 직원들로 구성되어 있고, 회사의 각 직원은 최대 3명까지의 부하직원을 둘 수 있다. {X, Y, Null}의 표현은 두 명의 부하직원 X와 Y가 있으며, 없는 경우는 Null로 나타낸다. 또한 부하직원이 하나도 없으면 {Null, Null, Null}로 나타낸다. 만일 그 컴퓨터회사 모든 직원의 조직도에서 Null의 총 개수가 10인 경우, 최소 직원 수는 몇 명인가? 단, 사장의 직속상관(바로위의 상관)은 없고, 직원들의 직속상관은 1명이다.


의견 (4개)

아래 그래프에서 노드는 도시 이름과 관광하는 데 필요한 시간을 나타내고 있다. 노드와 노드를 연결하는 간선은 도시에서 다른 도시로 이동하는 시간을 표시한다. 예를 들어, 도시 D에서 도시 E로 가는 이동시간은 5가 소요된다. 철수가 가장 짧은 시간 내에 모든 도시를 관광한다고 할 때, 도시 A에서 관광을 시작하여 도시 F에서 관광을 끝내는 데 필요한 시간은 얼마인가?


아직까지 풀리지 않은 문제 중에 1937년 콜라즈가 제안한 추측이 있다. 콜라즈 추측이란 어떤 자연수도 아래의 규칙에 따르면 항상 1이 된다는 추측으로 아직 모든 자연수에 대해 증명이 되지 않았다.

  • 규칙1. 짝수이면 2로 나눈다.
  • 규칙2. 홀수이면 3을 곱하고 1을 더한다.
  • 규칙3. 1이면 종료하고 아니면 계속 수행한다. 

헤일스톤 수열은 콜라즈 추측을 계산하는 중에 나오는 수열이다. 즉, 4의 헤일스톤 수열은 4->2->1 그리고 5의 헤일스톤 수열은 5->16->8->4->2->1 이다. 9의 헤일스톤 수열 중에서 가장 큰 자연수는 무엇인가? 예를 들어, 5의 헤일스톤 수열 중에서 가장 큰 자연수는 16이다.


의견 (2개)

다음과 같은 함수 f가 구현되어 있을 때, f(3,4)의 값은?

int f(int a, int b) {
  if (b == 0) return 1;
  else {
    if (!(b%2)) return f(a,b/2) * f(a,b/2);
    else return a * f(a,b-1);
  }
}

다음과 같이 구현한 함수를 f(8,4)로 실행할 때 문자열 “hello”가 출력되는 횟수는?

int f(int a, int b) {
  printf ("hello");
  if (b==0 || a==b) return 1;
  else return f(a-1,b-1) + f(a-1,b);
} 

다음 프로그램의 출력 결과는 무엇인가? 

#define INT_MAX 2147483647
#define abs(x) (x<0) ? x*-1 : x
int f(char *D)
{
  int n = 14;
  int B[14][14];
  bool A[14][14];
  int i, j, k, m;
  for (i = 0; i<n; i++) {
    A[i][i] = true;
    B[i][i] = 0;
  }
  for (m = 1; m <= n; m++) {
    for (i = 0; i<n - m + 1; i++) {
      j = m + i - 1;
      if (m == 1) A[i][j] = A[i][j];
      if (m == 2) A[i][j] = D[i] == D[j]);
      else A[i][j] = (D[i] == D[j]) && A[i + 1][j – 1];
      if (A[i][j] == true) B[i][j] = 0;
    else {
      B[i][j] = INT_MAX;
      for (k = i; k <= j - 1; k++)
        B[i][j] = B[i][j] < (B[i][k] + B[k + 1][j] + 1)? B[i][j] : (B[i][k] + B[k + 1][j] + 1);
      }
    }
  }
  return B[0][n - 1];
}
int main()
{
	char D[] = "ababbbabbababa";
	printf("%d", abs(f(D)));
	return 0;
}

의견 (7개)

다음 프로그램의 출력 결과는 무엇인가? 

#define _SIZE_ 15
int f(int n) {
  if(n < 10)
    return n+1;
  else
    return n-1;
}
int g(int n) {
  if(n < 10)
    return n+2;
  else
    return n-2;
}
int main() {
  int i, j, sum=0;
  int aa[_SIZE_];
  for(i = 0, j = 2 ; i <_SIZE_ ; i++) {
    if(i%3==1 || (j++)/5==2)
      aa[i] = 1;
    else
      aa[i] = 0;
  } 
  for(i = 0 ; i <_SIZE_ ; i++) {
    if(aa[i] != 0)
      sum += f(i);
    else
      sum += g(i);
  }
  printf("%d\n",sum);
  return 0;
}

의견 (2개)