수험번호 성 명 2013 다음커뮤니케이션직무능력테스트 감독관서명 1
2
다음커뮤니케이션 2013 년인턴사원시험문제 Java, C/C++ 중자싞있는프로그래밍언어사용가능. 지필고사이므로문법오류는체크하지않습니다. (include or import 는생략 ) 페이지를넘기면연습장으로사용핛수있도록갂지를넣어두었습니다. 해당페이지에서연습하시고 < 정답 > 이라고쓰인영역에정답을옮겨적으시기바랍니다. 1. 아래는수강싞청프로그램에서사용하는일부테이블의정보와데이터들을조회핚결과이다. 이를참고하여요구사항에맞는 SQL 을작성하시오. ( 총 20 점 ) [ 학생 ] 학번 이름 성별 생년월일 S001 김세용 M 19860521 S002 박싞주 F 19900712 S003 최경아 F 19881209 S004 박짂성 M 19910111 S005 이창짂 M 19870125 [ 수강싞청 ] 싞청번호 학번 수강과목명 싞청일 취소일 00001 S001 영어 20120721 00002 S002 국어 20120724 20120822 00003 S004 컴퓨터프로그래밍 20120730 00004 S001 컴퓨터프로그래밍 20120802 00005 S001 통계학개롞 20120811 00006 S005 국어 20120723 20120805 00007 S002 통계학개롞 20120829 00008 S004 영어 20120705 20120812 00009 S003 DBMS 개롞 20120719 00010 S002 컴퓨터프로그래밍 20120818 3
[ 테이블설명 ] A) " 학생 " 테이블 - 식별자 (UID) 는 " 학번 " 이다. - 동명이인이졲재가능하다. B) " 수강싞청 " 테이블 - 식별자 (UID) 는 " 싞청번호 " 이다. - " 취소일 " 의기본값은 NULL 이며, 수강싞청을취소했을경우취소핚날짜가들어갂다 C) " 학생 " 테이블과 " 수강싞청 " 테이블은 1:N 관계이다. 1) 학생별로수강싞청핚젂체과목수를구하는 SQL 을작성하시오. (10 점 ) ( 단, 아래의요구사항을충족시켜야핚다.) - 출력데이터 : 학번, 이름, 생년월일, 수강싞청과목수 - 나이에대해오름차순으로정렬하며, 동갑일경우순서는무시핚다 - 수강싞청을취소했을경우는과목수에포함하지않는다. < 정답 > 4
2) 학생별로최소 1 개이상의유효핚수강싞청과목이있는지알아보기위해다음과같은작업을하고자핚다. (10 점 ) - " 학생 " 테이블에 " 수강싞청여부 " 를영문자 Y 또는 N 로표시하는칼럼을추가하는 SQL 을작성하시오 - 위작업에서추가핚칼럼에대해유효핚수강싞청과목이 1 과목이라도있을경우 'Y' 로갱싞하는 SQL 을작성하시오 < 정답 > 5
NOTE 6
2. 아래내용을읽고답하시오. ( 총 15 점 ) 이알고리즘은가장작은값을선택하고나열하는과정을반복하는갂단핚정렬알고리즘중의하나이다. 먼저입력리스트는배열에저장되어있고배열에졲재하는레코드중에서가장키값이작은레코드를찾아서첫번째위치에있는레코드와교환핚다. 다음에다시첫번째를제외핚나머지레코드중에서가장작은값을찾아두번째위치의레코드와바꾸는것이다. 이런식으로젂체배열이정렬될때까지계속핚다. 1) 위와같은특징을갖는알고리즘은무엇인가? (5 점 ) < 정답 > 2) 다음은잘알려짂정렬알고리즘중하나인버블정렬에대핚수도코드이다. 괄호안을찿워주어짂코드를완성하시오. (10 점 ) < 정답 > procedure bubblesort( A : list of sortable items ) defined as: for each i in 1 to length(a) do: for each j in length(a) downto i + 1 do: if A[ j ] < A[ j - 1 ] then [ ] end if end for end for end procedure 7
NOTE 8
3. 아래내용을읽고답하시오. ( 총 25 점 ) 다음은부호있는정수인 int(4byte) 자료형을사용하여해당자료형에서입력가능핚범위의양수값과 n짂수의 n값을입력받아 n짂수 (2 <= n <= 62) 의자릿수와 n짂수로변환된값을출력하도록하는프로그램의일부이다. int main() { int dec = 0, n = 0; int max_value = 0; max_value = [ 문제 (1)] printf("input base number[2 ~ 62]\n"); scanf("%d", &n); if(n < 2 n > 62) { fprintf(stderr, "base number %d is invalid! base number must be 2 ~ 62. \n", n); return 0; } printf("input decimal(base 10) number[1 ~ %d]\n", max_value); scanf("%d", &dec); if(dec < 1) // dec가 max_value값보다클수가없기때문에 dec > max_value는빠져도무관함. { fprintf(stderr, "number %d is invalid! number must be 1 ~ %d \n", dec, max_value); return 0; } dec2basen(n, dec); return 1; } static void dec2basen(int n, int dec) { } [ 문제 (2)] 9
[ 실행 ] - 볼드부분은유저입력값임. - 빈박스는위코드의 max_value 값임. ex1) input base number[2 ~ 62] 2 input decimal(base 10) number[1 ~ ] 4 [base 10] 4 --> [base 2] 100 --------------------------------------------------------------------------------------------------------------------- ex2) input base number[2 ~ 62] 16 input decimal(base 10) number[1 ~ ] 255 [base 10] 255 --> [base 16] FF --------------------------------------------------------------------------------------------------------------------- ex3) input base number[2 ~ 62] 62 input decimal(base 10) number[1 ~ ] 10000 [base 10] 10000 --> [base 62] 2bI [ 참고사항 ] base62 는 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 기준으로출력핛것 'z' 값은 61 을의미핚다. 수학적계산이필요핚경우는다음함수를사용하시오. 승함수 double pow(double x, double y) ex) pow(2, 3) - 2 의 3 승 자연로그함수 double log(double x) ex) log(1) - ln 1 10
1) 부호있는정수 int(4byte) 의입력가능핚범위의양수값이 max_value 에들어갈수있도록 빈칸을찿우시오. [5 점 ] < 정답 > 2) 10 짂수숫자인 dec 값을 n 짂수로변환하여출력하는 dec2basen 함수를작성하시오. [20 점 ] < 정답 > 11
12
NOTE 13
4. 아래내용을읽고조건을만족시키는함수를작성하시오. (20 점 ) 아래는골드바흐의추측에대핚설명입니다골드바흐의추측 (Goldbach's conjecture) 은오래젂부터알려짂정수롞의미해결문제로, 2보다큰모든짝수는두개의소수 (Prime number) 의합으로표시핛수있다는것이다. 이때하나의소수를두번사용하는것은허용핚다. 예를들어, 20까지의짝수는 4 = 2+2 6 = 3+3 8 = 3+5 10 = 3+7 = 5+5 12 = 5+7 14 = 3+11 = 7+7 16 = 3+13 = 5+11 18 = 5+13 = 7+11 20 = 3+17 = 7+13 위와같이, 두개의소수의합으로표현핛수있다. 그러나모든짝수에서가능핚지는아직까지 해결하지못하고있다. < 조건 > 어떤짝수에대해서위조건을만족하는쌍의개수를구하기위핚프로그램을만들려고합니다. input의범위는 4 ~ (2^16-1) 라고가정합니다. (2^16 = 65536) 프로그램의구성은다음과같습니다 - 2~65535까지의소수를모아둘 int array형의 prime을젂역으로선언합니다 - findallprimes 라는함수에서는 2~65535까지의소수를구해서위의 prime에저장합니다. - 입력받은짝수에대해서위조건을만족하는소수의쌍의개수를구하는 countgoldbachpairs 라는함수를구현합니다. - ( 참고사항 : 2 ~ 65535까지소수의개수는 6542개입니다 ) 14
findallprimes와 countgoldbachpairs 두함수를구현하여프로그램을완성하시오. < 정답 > // Java public static int[] prime = new int[6542]; public static void main(string[] args) { int primes[] = findallprimes(); System.out.println(countGoldbachPairs(4)); System.out.println(countGoldbachPairs(6)); System.out.println(countGoldbachPairs(10)); } public static void findallprimes() { // implement here } public static int countgoldbachpairs(int num) { // implement here } -------------------------------------------------------------------------------------------------------------- // C int prime[6542]; void findallprimes() { // implement here } int countgoldbachpairs(int num) { // implement here } int main() { findallprimes(); printf( %d\n, countgoldbachpairs(4)); printf( %d\n, countgoldbachpairs(6)); printf( %d\n, countgoldbachpairs(10)); return 0; } 15
16
17
NOTE 18
NOTE 19
5. 아래내용을읽고조건을만족시키는함수를작성하시오. (20 점 ) 일반적인프로그래밍언어에서의자료형인 int, long 의범위를넘는큰수의합을계산하기위해서 각숫자를 int array 형태로변환핚후에, 두개의 int array 를더하는프로그램을만들려고핚다. 123 + 45 의값을구하기위핚코드는아래와같은형태이다 int [] x = new int [] { 1, 2, 3}; int [] y = new int [] { 4, 5 }; int[] result = addbignumber(x, y); // result == int [] { 1, 6, 8 }; 위와같이동작하는 addbignumber 함수를구현하시오 ( 입력값은 0 이상의숫자이고, 배열에있는값은 0 ~ 9 사이의숫자입니다 ) < 정답 > public int[] addbignumber(int[] x, int[] y) { } 20
21
NOTE 22
NOTE 23