1. 다음은 Java 코드에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
class Main {
public static void main(String[] args) {
int[] a = new int[]{1, 2, 3, 4};
int[] b = new int[]{1, 2, 3, 4};
int[] c = new int[]{1, 2, 3};
check(a, b);
check(a, c);
check(b, c);
}
public static void check(int[] a, int[] b) {
if (a==b) {
System.out.print("O");
}else{
System.out.print("N");
}
}
}
답)
NNN
풀이)
배열끼리의 비교는 주소로 하기 때문에 같은 주소를 가진 배열들이면 O를 출력하고, 아닌 경우 N을 출력한다. 그러므로 check() 메소드에 같은 배열끼리 비교하지 않고 있으므로 모두 N을 출력해야하는데, print()이므로 붙여서 출력한다.
2. 다음 문제에서 설명하는 용어를 작성하시오.
데이터를 중복시켜 성능을 향상시키기 위한 기법으로 데이터를 중복 저장하거나
테이블을 합치는 등으로 성능을 향상시키지만 데이터 무결성이 저하될 수 있는 기법
답)
반정규화
풀이)
중복저장된 데이터가 없도록 테이블을 최대한 분리하여 관리하는 방식을 정규화라고 하는데, 정규화의 단계가 높아지면 거의 모든 값들이 분리가 되므로 조인이 늘어나 조회 속도가 느려질 수 있다. 따라서 이때 이 정규화의 단계를 낮추는 기법을 사용하는데 이를 반정규화라 한다.
3. 다음은 SQL에 관한 문제이다. 아래 SQL 구문의 빈칸을 작성하시오.
테이블
사원 [사원번호(PK), 이름, 나이, 부서]
부서 [사원번호(PK), 이름, 주소, 나이]
- 신입 사원이 들어와서 사원 테이블에 추가
INSERT INTO 사원 (사원번호, 이름, 주소, 부서) [ ① ] (32431, '정실기', '서울', '영업');
- 위에 신입사원을 검색하면서 부서 테이블에 추가
INSERT INTO 부서 (사원번호, 이름, 나이, 부서)
[ ② ] 사원번호, 이름, 나이, 23 FROM 사원 WHERE 이름 = '정실기';
- 전체 사원 테이블 조회
SELECT * [ ③ ] 사원;
- 퇴사로 인해 부서에 해당하는 값을 '퇴사'로 변경
UPDATE 사원 [ ④ ] 부서 = '퇴사' WHERE 사원번호 = 32431;
답)
① : VALUES
② : VALUES SELECT
③ : FROM
④ : ON SET
풀이)
INSERT 구문의 기본구조 : INSERT INTO 테이블명(컬럼명, ...) VALUES (값, ...);
하지만, 꼭 VALUES가 꼭 붙는건 아님 !
1. INSERT INTO ... SELECT 구문
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
SELECT 컬럼1, 컬럼2, ...
FROM 다른_테이블명
WHERE 조건;
2. DEFAULT VALUES 구문
INSERT INTO 테이블명 DEFAULT VALUES;
UPDATE 구문의 기본 구조 : UPDATE 테이블명 SET 컬럼1 = 값1, 컬럼2 = 값2, ...;
4. 다음 릴레이션의 Cardinality와 Degree를 작성하시오.
Cardinality : ( ① )
Degree : ( ② )
답)
① : 5
② : 4
풀이)
Cardinality : 릴레이션 내에 있는 튜플(행)의 개수
Degree는 릴레이션 내에 있는 속성(열)의 개수
두 개념을 혼동하지 않도록, 이름으로 이해해보자
① Cardinality : 집합론에서 원소의 개수를 말할 때 쓰는 용어. 릴레이션(테이블)을 하나의 집합으로 보면, 그 집합의 원소는 테이블의 각 행(튜플)로 볼 수 있음!
② Degree : 수학에서 사용하는 다항식의 차수를 나타내는 개념. 릴레이션에서 속성(열)은 각각 하나의 차원이라 볼 수 있음
? 컬럼도 유일한데,, 이것도 그러면 카디널리티 아닌가
사실 이런 부분 때문에 데이터베이스에서 카디널리티라는 의미는 상황에 따라 두가지 의미를 가짐
1. 테이블에 저장된 데이터(행)의 총 개수
2. 속성(열)의 고유성 (유니크함)
=> 카디널리티가 높다는 해당 컬럼에 있는 값들이 대부분 고유하다는 것!
? 그러면 왜 카디널리티와 디그리를 따로 나누어 부를까
테이블에서 행과 열이 다루는 본질적인 의미가 다르기 때문이며, 행은 데이터의 양을, 열은 데이터의 속성을 나타내며 서로 다른 관점에서 바라봄.
행 : 데이터의 크기나 범위와 관련되어 있고, 실제 데이터 값을 담고 있는 단위이기 때문에 데이터의 양을 의미함. 따라서 집합에서 원소의 개수를 의미하는 카디널리티 라는 용어를 적용할 수 있음.
열 : 데이터베이스가 표현하고자 하는 특성이나 정보, 즉 속성을 표현하기 때문에 데이터의 차원을 담고 있음.
<요약>
Cardinality (카디널리티): 행(데이터)의 양을 나타내며, 데이터베이스의 규모나 데이터 양을 다룰 때 중요
Degree (디그리): 열(속성)의 개수를 나타내며, 데이터 구조의 복잡성이나 데이터 표현의 차원을 다룰 때 중요
5. 다음은 프로토콜에 대한 내용이다. 아래 내용을 읽고 알맞는 답을 작성하시오.
- Network layer에서 IP패킷을 암호화하고 인증하는 등의 보안을 위한 표준이다.
- 기업에서 사설 인터넷망으로 사용할 수 있는 VPN을 구현하는데 사용되는 프로토콜이다.
- AH(Authentication Header)와 ESP(Encapsulating Security Payload)라는 두 가지 보안 프로토콜을 사용한다.
답)
IPSec
6. 다음은 Python에 대한 문제이다. 아래 코드를 읽고 알맞는 출력 값을 작성하시오.
def fnCalculation(x,y):
result = 0;
for i in range(len(x)):
temp = x[i:i+len(y)]
if temp == y:
result += 1;
return result
a = "abdcabcabca"
p1 = "ab";
p2 = "ca";
out = f"ab{fnCalculation(a,p1)}ca{fnCalculation(a,p2)}"
print(out)
답)
ab3ca3
풀이)
파이썬에서 문자열 앞에 접두어 f를 붙이는 경우는 문자열 내의 중괄호에서는 변수를 사용하겠다는 의미임. 따라서 ab와 ca 사이의 함수와 ca뒤의 함수는 실행되어 나온 값을 붙여야함.
fnCalculation() 메소드는 x를 y길이만큼 가장 처음부터 마지막까지 비교하며 같으면 1을 더하는 로직임. 따라서 ab가 3번 나오고 ca도 3번나왔기 때문에 ab3ca3이 답임.
7. 아래 설명하는 내용을 확인하여 알맞는 알고리즘을 작성하시오.
- 대칭키 알고리즘으로 1997년 NIST(미국 국립기술표준원)에서 DES를 대체하기 위해 생성되었다.
- 128비트, 192비트 또는 256비트의 가변 키 크기와 128비트의 고정 블록 크기를 사용한다.
- 높은 안전성과 효율성, 속도 등으로 인해 DES 대신 전 세계적으로 많이 사용되고 있다.
답)
AES
8. 패킷 교환 방식 중에 연결형과 비연결형에 해당하는 방식을 작성하시오.
① 연결형 교환 방식
② 비연결형 교환 방식
답)
① 가상회선
② 데이터그램
풀이)
패킷 교환 방식의 종류
1) 가상 회선 - 모든 패킷의 경로를 일정하게 유지
2) 데이터 그램 - 서로 다른 경로를 이용
9. 아래 내용을 확인하고 보기에서 알맞는 답을 고르시오.
실행 순서가 밀접한 관계를 갖는 기능을 모아 모듈로 구성한다.
한 모듈 내부의 한 기능 요소에 의한 출력 자료가 다음 기능 원소의 입력 자료로서 제공되는 형태이다.
보기
ㄱ. 기능적(functional)
ㄴ. 우연적(Coincidental)
ㄷ. 통신적(Communication)
ㄹ. 절차적(Procedural)
ㅁ. 시간적(Temporal)
ㅂ. 순차적(sequential)
ㅅ. 논리적(Logical)
답)
ㅂ
10. 아래는 디자인 패턴에 관한 설명이다. 아래 설명을 읽고 보기에서 알맞는 용어를 작성하시오.
- 컬렉션 객체의 내부 구조를 노출하지 않고 순차적으로 접근할 수 있게 하는 패턴이다.
- 이 패턴은 객체의 내부 표현 방식에 독립적으로 요소에 접근할 수 있도록 해준다
- 반복 프로세스를 캡슐화하여 클라이언트 코드에서는 컬렉션의 구체적인 구현에 종속되지 않도록 한다.
보기
생성패턴 | 구조패턴 | 행위패턴 |
Singleton | Adapter | Iterator |
Factory Method | Bridge | Visitor |
Abstract Factory | Composite | Observer |
답)
Iterator
11. 아래 그림을 바탕으로 RIP을 구성하여 최단 경로 비용을 계산하여 흐름에 맞게 작성하시오.
답)
A → D → C → F
풀이)
RIP(Routing Information Protocol)
- A에서 D로 가는 경로는 비용이 1.
- D에서 C로 가는 경로는 비용이 2.
- C에서 F로 가는 경로는 비용이 5.
따라서, 최단 경로는 A → D → C → F이고, 총 비용은 1 + 2 + 5 = 8임.
12. 아래의 표를 확인하여 SRT 스케줄링의 평균 대기시간을 계산하여 작성하시오.
프로세스 | 도착 시간 | 서비스 시간 |
A | 0 | 8 |
B | 1 | 4 |
C | 2 | 9 |
D | 3 | 5 |
답)
6.5
풀이)
13. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h>
int main() {
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int* parr[2] = {arr[1], arr[2]};
printf("%d", parr[1][1] + *(parr[1]+2) + **parr);
return 0;
}
답)
21
풀이)
parr[1][1] : arr[2][1]이므로 값은 8
*(parr[1] + 2) : arr[2][2]이므로 값은 9
**parr : arr[1][0]이므로 값은 4
14. 다음은 Java 언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
class Main {
public static void main(String[] args) {
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
ODDNumber OE = new ODDNumber();
System.out.print(OE.sum(a, true) + ", " + OE.sum(a, false));
}
}
interface Number {
int sum(int[] a, boolean odd);
}
class ODDNumber implements Number {
public int sum(int[] a, boolean odd) {
int result = 0;
for(int i=0; i < a.length; i++){
if((odd && a[i] % 2 != 0) || (!odd && a[i] % 2 == 0))
result += a[i];
}
return result;
}
}
답)
풀이)
15. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h>
#include <string.h>
void sumFn(char* d, const char* s) {
while (*s) {
*d = *s;
d++;
s++;
}
*d = '\0';
}
int main() {
const char* str1 = "first";
char str2[50] = "teststring";
int result=0;
sumFn(str2, str1);
for (int i = 0; str2[i] != '\0'; i++) {
result += i;
}
printf("%d", result);
return 0;
}
답)
10
풀이)
1. sumFn 함수는 str1의 값을 str2에 복사합니다. 그래서 str2는 first로 변경
2. for 루프에서 str2의 각 문자가 `\0`이 될 때까지 인덱스 값을 result에 더함
- i 값은 0, 1, 2, 3, 4가 되고, `result`는 0 + 1 + 2 + 3 + 4 = 10
16. 아래는 소프트웨어 설계에 대한 내용이다. 내용을 읽고 괄호안에 알맞는 답을 작성하시오.
- 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하기 위해, 제어를 통신하거나 제어 요소를 전달하는 결합도이다.
- 한 모듈이 다른 모듈의 상세한 처리 절차를 알고 있어 이를 통제하는 경우나 처리 기능이 두 모듈에 분리되어 설계된 경우에 발생한다.
( ) Coupling
답)
Control
17. 다음은 Java에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
class Main {
public static void main(String[] args) {
String str = "abacabcd";
boolean[] seen = new boolean[256];
System.out.print(calculFn(str, str.length()-1, seen));
}
public static String calculFn(String str, int index, boolean[] seen) {
if(index < 0) return "";
char c = str.charAt(index);
String result = calculFn(str, index-1, seen);
if(!seen[c]) {
seen[c] = true;
return c + result;
}
return result;
}
}
답)
dcba
풀이)
문자열 가장 뒤부터 처음 나오는 문자이면 추가하는 식의 재귀를 반복하고 있음
18. 다음은 C언어에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
#include <stdio.h>
void swap(int a, int b) {
int t = a;
a = b;
b = t;
}
int main() {
int a = 11;
int b = 19;
swap(a, b);
switch(a) {
case 1:
b += 1;
case 11:
b += 2;
default:
b += 3;
break;
}
printf("%d", a-b);
}
답)
-13
풀이)
swap(a,b) : a는 19, b는 11가 된 것처럼 보이지만 반환하지 않으므로 반영되지 않았음
switch(a) : b는 11이므로 2를 더하고 기본값인 3을 더함.
a는 11, b는 19+2+3으로 24이므로 a-b = 11-24 = -13임
19. 다음은 C언어의 구조체에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
#include <stdio.h>
struct node {
int n1;
struct node *n2;
};
int main() {
struct node a = {10, NULL};
struct node b = {20, NULL};
struct node c = {30, NULL};
struct node *head = &a;
a.n2 = &b;
b.n2 = &c;
printf("%d\n", head->n2->n1);
return 0;
}
답)
20
풀이)
head의 n2가 a, a의 n2가 b, b의 n2가 c로 연결해둔 상태이므로, head->n2는 a, head->n2->n1은 b의 값을 가르킨다.
20. 다음은 Java에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력 값을 작성하시오.
class Main {
public static void main(String[] args) {
String str = "ITISTESTSTRING";
String[] result = str.split("T");
System.out.print(result[3]);
}
}
답)
S
풀이)
split()은 특정 문자 기준으로 문자열을 잘라 문자배열을 만듦. 따라서 result = {"I", "S", "ES", "S", "RING"}로 나눠짐. 여기서 3번쨰는 S임.
'개발 이론 정리' 카테고리의 다른 글
[정보] 운영체제 흐름 쉽게 이해하기 (0) | 2024.10.31 |
---|