반응형

알고리즘과 DB 일부 문제만 정리하였습니다.

 

최근 기출문제(2019년부터)는 하단 링크를 참고해 주세요.

 

정보처리산업기사 실기 출제 유형 및 최근 기출 문제 정리(19년 1회부터 21년 1회)

정보처리 산업기사 실기 시험은 2017년 한 번 개정되고 내년에 NCS로 다시 개정을 앞두고 있습니다. 해당 글은 2017년 개정된 이후 기출 문제 중에서 2019년 1회부터 가장 최근에 있었던 2021년 1회까

developer-rooney.tistory.com

 

알고리즘 - C언어

 

다음 C언어의 <코드>와 <출력>을 보고 괄호(1), (2)에 적용될 수 있는 가장 적절합 답을 쓰시오.(10점)

 

<코드>

#include <stdio.h>

int main(void) {

    int i, j, n;
    
    n = (1);
    
    for(i = 1; i <= (2); i++) {
        for(j = 1; j <= i; j++) {
            printf("%3d", j);
        }
        printf("\n");
    }

}

 

<출력>

 

1

1  2

1  2  3

1  2  3  4

1  2  3  4  5

1  2  3  4  5  6

1  2  3  4  5  6  7

 

정답

 

(1) : 7

(2) : n

 

해설

 

계단을 만드는 알고리즘 문제입니다. 첫 번째 괄호(1)에는 정수 n의 초기화에 필요한 값을 넣어줘야 하고 두 번째 괄호(2)에는 i가 어디까지 증가해야 하는지 넣어줘야 합니다.

 

이 문제는 어느 변수가 행이고 어느 변수가 열인지를 먼저 파악해야 하는데 이런 이중 for문에서 계단을 만들 때는 바깥 for문이 행 역할을 하는 경우가 많습니다. 정확하게 확인하기 위해 두 for문의 시작 값과 마지막 값을 확인해야 하는데 첫 번째 for문은 괄호가 있어 확인이 안 되므로 두 번째 for문이 열이 맞는지 먼저 확인합니다.

 

두 번째 for문은 0에서 바깥 for문의 값이 i까지 증가하게 됩니다. <출력> 부분을 보면 첫 번째 줄에서는 1, 두 번째 줄에서는 1 2, 세 번째 줄에서는 1 2 3..으로 몇 번째 행이냐에 따라 열의 마지막 값이 바뀌는 것을 볼 수 있습니다. 따라서 내부 for문은 열을 나타내는 게 맞습니다.

 

바깥 for문이 행 역할을 함에 따라 행의 최종 값인 7을 넣어줘야 하는데 이 최종 값 7은 n의 초기화 값으로 넣어야 하고 7로 초기화된 n을 (2)에 넣으면 문제가 해결됩니다.

 

 

알고리즘 - 자바

 

다음 Java 언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.(5점)

 

public class Test {

    public static int[] arr(int[] a) {
        int i, j, sw, temp, n = 4;
        if (a[0] == 0 || a[0] < 1)
            return a;
        for (i = 0; i < n-1; i++) {
            sw = i;
            for (j = i + 1; j < n; j++) {
                if(a[j] < a[sw])
                    sw = j;
            }
        temp = a[i];
        a[i] = a[sw];
        a[sw] = temp;
        
        }
    }
    
    public static void main(String[] args) {
    
        int i;
        int n[] = {4, 2, 7, 1};
        arr(n);
        for (i = 0; i < 4; i++){
            System.out.printf(n[i] + "  ");
        }
    }
}

 

정답

 

1  2  4  7

 

해설

 

이 문제는 값을 오름차순으로 정렬하는 문제입니다. 이런 문제는 출제되면 main 메소드를 먼저 확인해야 합니다. main 함수를 보면 arr(n)이라는 메소드에 {4, 2, 7, 1} 4개의 정수를 갖는 정수 배열 n이 매개 변수로 입력되었고 마지막에 for문을 통해 n의 값들을 하나씩 출력하고 있습니다.

 

arr 메소드가 어떤 역할을 하는지 위에 정의된 'public static int[] arr(int[] a)' 에서 확인합니다. 이 메소드는 매개변수로 정수 배열을 받아서 특정 역할을 수행한 후 정수 배열을 반환합니다.

 

모르시는 분들을 위해 메소드를 분석해보면 'public : 접근제어자, static : 메모리 공유, int[] : 반환 값, arr : 메소드 이름 (int[] a) : 1차원 배열이 매개 변수(파라미터)'입니다.

 

첫 줄에 'int i, j, sw, temp, n = 4' 로 n만 4로 초기화되어 있는데 i와 j는 for문에서 이용될 변수, sw는 i의 값을 넣어주는 변수입니다. if문을 살펴보면 배열 a의 0번째 값이 0이거나 1보다 작을 때 입력된 배열을 그대로 반환하라고 하는데 해당 없기 때문에 넘기면 됩니다. n=4 가 의미하는 것은 여기서 배열의 길이를 나타냅니다. 문제에 따라서 n=a.length로 출제될 수도 있는데 여기서는 배열의 길이가 짧기 때문에 정수 4로 초기화한 것으로 보입니다.

 

중요한 것은 이중 for문과 for문 마지막에 있는 값 교환 부분인데 i는 0부터 n - 1 전까지 1씩 증가하고, j는 i의 값부터 n까지 1씩 증가합니다. 즉, i가 1일 때 j는 2~3까지 비교하고 i가 2일 때는 3까지 비교하면서 for문 내 if문의 조건에 따라 a[i]가 a[j]보다 작은 경우가 발생하면 sw에 j를 저장합니다.

 

값 교환 부분은 temp를 통해 두 개의 값을 교환합니다. temp는 임시 저장 변수로 이 변수에 큰 값을 넣어준 뒤 a[i] = a[j], a[j] = temp로 교환을 해주면 낮은 수부터 큰 수 순으로 정렬됩니다.

 

-

 

이 문제는 자바 기출 문제 중에서 코드가 긴 편에 속해서 어려워 보일 수 있는데 주요 코드를 찾아낸다면 쉽게 푸실 수 있습니다. temp를 이용한 교환 부분은 정렬을 할 때 많이 이용되는데 for문 내의 if문에서 값이 오름차순으로 교환되는지, 내림차순으로 교환되는지만 확인해준다면 복잡한 분석 없이 풀이가 가능합니다.

 

 

데이터베이스

 

1. 다음 <처리조건>에 유의하여 <학생> 테이블에 대한 다음의 각 질문에 알맞은 SQL문을 작성하시오.(10점)

 

<학생>

학번 전공 학생이름 생년월일 학년
12345 computer rooney 19851024 1
12346 computer lampard 19780620 2

* 실제 문제에는 더 많은 데이터가 들어가 있지만 속성만 알면 풀이할 수 있어 넣지 않았습니다.

 

<처리조건>

 

1. 명령절의 마지막은 ';'으로 끝낸다.

2. 문자열 인용의 경우 작은 따옴표를 이용하여 작성한다.

 

1) <학생> 테이블에서 전공이 computer이고 1학년인 학생의 이름과 생년월일을 검색하는 SQL문을 작성하시오.

2) <학생> 테이블에서 2학년 또는 4학년인 학생의 전공을 검색하되, 전공이 같은 경우 한 번만 검색하는 SQL문을 작성하시오.

3) <학생> 테이블에서 2학년 이상인 학생의 이름을 검색하되, 학년을 기준으로 내림차순 검색하는 SQL문을 작성하시오.

 

 

정답

 

1) select 학생이름, 생년월일 from 학생 where 전공 = 'computer' and 학년 = 1;

2) select distinct 전공 from 학생 where 학년 IN(2, 4);

3) select 학생이름 from 학생 where 학년 >= 2 order by 학년 desc;

 

해설

 

우선 <처리조건>에 명령절 마지막에 세미콜론(;)을 붙이라는 점에 유의해야 합니다. 실제 SQL 실행 시 단독 실행의 경우 세미콜론을 붙이지 않아도 문제가 되지 않지만 문제에서는 세미콜론을 붙이라는 조건이 있으니 명령절 마지막에 세미콜론을 붙이지 않으면 감점 혹은 틀린 문제 처리됩니다. 또한 전공이나 학생 이름은 문자열이기 때문에 인용할 때 작은 따옴표('   ')로 감싸서 작성해야 합니다.

 

1) 문제에서 학생의 이름과 생년월일을 검색하라고 했으니 select 뒤에 학생이름, 생년월일을 적고 데이터를 가져올 테이블이 '학생' 테이블이므로 from 학생을 적어줍니다. 또한 조건 중 전공이 computer이고 1학년인 학생만 가져오라고 했으니 where 전공 = 'computer' and 학년 = 1을 적은 뒤 세미콜론(;)을 붙여줍니다.

 

2) 중복 제거에 관한 문제입니다. 속성을 검색할 때 중복되는 내용이 있으면 한 번만 표시하라는 의미인데 이 경우 중복을 제거할 속성 앞에 'distinct' 를 붙입니다. 또한 학년이 1학년이거나 4학년인 학생만 조회하라고 했으므로 where절에 학생 IN(2, 4)로 표현하여 select distinct 전공 from 학생 where 학년IN(2, 4); 가 됩니다.

 

* 조건에 무조건 IN을 사용하라는 말이 없으므로 select distinct 전공 from 학생 where 학년 = 2 or 학년 = 4; 로 작성해도 정답입니다. 하지만 안전하게 IN을 사용하시길 권장합니다.

 

3) 정렬 관한 문제입니다. 정렬에는 desc(내림차순), asc(오름차순) 정렬이 있는데 where절 뒤에 order by 속성명 desc(혹은 asc)로 표현합니다. 이 문제는 내림차순 정렬을 하라고 했으므로 where절부터 학년 >= 2 order by 학년 desc; 라고 적으면 됩니다.

 

 

반응형

+ Recent posts