[자료구조/알고리즘] 재귀 종합퀴즈
- -
문제1. 다음 중 재귀 함수의 정의로 맞는 것을 고르세요.
A.함수를 호출하는 함수B.자기 자신을 호출하는 함수C.함수를 인자로 받는 함수D.함수를 리턴하는 함수
더보기A.함수를 호출하는 함수B.자기 자신을 호출하는 함수C.함수를 인자로 받는 함수D.함수를 리턴하는 함수
문제2. 다음 중 재귀 함수를 구현할 때, 재귀의 탈출 조건과 관련있는 것을 고르세요.
A. camel case
B. recursive case
C. pascal case
D. base case
더보기A. camel case
B. recursive case
C. pascal case
D. base case
재귀 함수는 자기 자신을 호출하는 방식으로 동작하므로, 재귀를 반복하다 보면 언젠가는 멈춰야 합니다. 이때, 멈출 조건을 base case 또는 종료 조건이라고 부릅니다. 재귀 함수를 구현할 때, base case가 반드시 포함되어야 합니다.
문제3. 재귀를 사용하기 적합한 상황을 모두 고르세요.
A.주어진 문제를 다양한 구조로 더 작은 문제로 나눌 수 있는 경우B.중첩된 반복문이 많거나 반복문의 중첩 횟수를 예측하기 어려운 경우C.반복문으로 표현할 수 없는 코드일 경우D.반복문으로 작성된 코드를 더욱 간결하고 이해하기 쉽게 작성하고 싶은 경우
더보기A. 주어진 문제를 다양한 구조로 더 작은 문제로 나눌 수 있는 경우B. 중첩된 반복문이 많거나 반복문의 중첩 횟수를 예측하기 어려운 경우
C. 반복문으로 표현할 수 없는 코드일 경우
D. 반복문으로 작성된 코드를 더욱 간결하고 이해하기 쉽게 작성하고 싶은 경우
재귀를 사용하기 적합한 상황은 다음과 같습니다.
- 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우
- 중첩된 반복문이 많거나 반복문의 중첩 횟수를 예측하기 어려운 경우
- 반복문으로 작성된 코드를 더욱 간결하고 이해하기 쉽게 작성하고 싶은 경우
문제4. arr의 모든 요소를 더하려고 합니다. 다음 중 arrSum(arr) 의 빈칸에 들어가야 할 코드를 고르세요.
const arr = [1, 2, 3, 4, 5]; function arrSum(arr) { if ( (1)__________ ) { return 0; } return (2)__________ + arrSum( (3)__________ ); }
더보기A. (1) arr.length === 0, (2) arr.pop(), (3) arr.length - 1
B. (1) arr.length === 0, (2) arr.shift(), (3) arr.length - 1
C. (1) arr.length === 0, (2) arr.shift(), (3) arr
D. (1) arr.length === 0, (2) arr.unshift(), (3) arr
(1) if의 조건식에는 더이상 문제를 쪼갤 수 없는 경우(base case)가 위치해야 합니다. 따라서, 변수 arr이 빈배열일 경우 arr.length === 0 이 정답입니다.
(2) Array.shift()는 원본 배열에서 첫 번째 요소를 삭제하고, 그 요소를 반환합니다.
(3) Array.shift()는 원본 배열을 수정합니다. 따라서 변수 arr이 위치하면 됩니다.
문제5. 다음 중 n-factorial(n!) 을 만들기 위해 빈칸에 들어가야 할 가장 적합한 코드를 고르세요.
// 입력값 n : number 타입의 정수 (num > 0) function fac(n) { if ( (1)__________ ) { return (2)__________ ; } return (3)__________ ; }
A. (1) n === 0, (2) 0, (3) n * fac(n)
B. (1) n === 0, (2) 1, (3) n * fac(n - 1)
C. (1) n === 1, (2) 0, (3) n * fac(n + 1)
D. (1) n === 1, (2) 1, (3) n * fac(n - 1)
더보기A. (1) n === 0, (2) 0, (3) n * fac(n)
B. (1) n === 0, (2) 1, (3) n * fac(n - 1)
C. (1) n === 1, (2) 0, (3) n * fac(n + 1)
D. (1) n === 1, (2) 1, (3) n * fac(n - 1)
A. n === 0은 종료 조건이 아닙니다. 이 조건은 fac(0)의 결과를 0으로 만들어버리므로, 올바른 결과를 얻을 수 없습니다.
B. n === 0은 재귀 호출을 끝내기 위한 종료 조건입니다. n이 0이 되면, 더 이상 재귀 호출을 하지 않고, 1을 반환합니다. 이때, 1을 반환하는 이유는, n!의 정의에 따라 0!은 1로 정의되기 때문입니다. 따라서, (2) 1을 채우면 됩니다.
C. n === 1도 종료 조건이지만, 이 경우에는 잘못된 조건입니다. n === 1이면, fac(1)을 계산할 때 재귀 호출이 발생하지 않기 때문에, 올바른 결과를 얻을 수 없습니다.
D. n === 1은 재귀 호출을 끝내기 위한 종료 조건입니다. n이 1이 되면, 더 이상 재귀 호출을 하지 않고, 1을 반환합니다. 이때, 1을 반환하는 이유는, n!의 정의에 따라 1!은 1로 정의되기 때문입니다. 따라서, (2) 1을 채우면 됩니다.
(3)에는 n * fac(n - 1)을 채우면 됩니다. 이렇게 하면 n!의 값을 계산할 수 있습니다.
B, D 두 함수 모두 재귀적인 방법으로 순환하면서 값을 계산하는 팩토리얼 함수입니다. 이중에서는 두번째 함수 D가 더 피보나치 수열을 계산하는 데에 더 적합합니다.이유는, 피보나치 수열은 이전 두 항의 합으로 정의되는데, 첫 번째 항과 두 번째 항이 각각 1로 시작합니다. 따라서, 두 번째 함수에서는 인자로 전달된 n 값이 1일 때, 1을 반환하도록 되어 있어, 피보나치 수열을 구하는 데에 더 적합합니다.
그러나, 두 함수 모두 팩토리얼 함수이므로, 두 함수는 팩토리얼 값을 계산하는 데에는 모두 사용할 수 있습니다.
문제6. 다음 JSON에 관한 보기 중 옳은 것을 모두 고르세요.
A. JavaScript Object Notation의 줄임말이다.
B. JSON.parse를 적용하는 이 과정을 직렬화(serialize)한다고 한다.
C. 자바스크립트의 객체와 다른 규칙을 가진다.
D. JSON.stringify를 적용하는 이 과정을 역직렬화(deserialize)한다고 한다.
더보기A. JavaScript Object Notation의 줄임말이다.
B. JSON.parse를 적용하는 이 과정을 직렬화(serialize)한다고 한다.
C. 자바스크립트의 객체와 다른 규칙을 가진다.
D. JSON.stringify를 적용하는 이 과정을 역직렬화(deserialize)한다고 한다.
A. JSON은 JavaScript Object Notation의 줄임말이며, 자바스크립트에서 사용하는 객체 리터럴과 비슷한 형식을 가지고 있습니다.
B. JSON.parse는 JSON 형식의 문자열을 자바스크립트 객체로 변환하는 것을 의미합니다. 이 과정을 역직렬화(deserialize)라고 합니다.
C. JSON 형식은 자바스크립트의 객체와 비슷하지만, 몇 가지 규칙이 다릅니다. 예를 들어, JSON에서는 모든 문자열을 큰따옴표로 감싸야 하지만, 자바스크립트에서는 작은따옴표나 큰따옴표를 모두 사용할 수 있습니다.
D. JSON.stringify는 자바스크립트 객체를 JSON 형식의 문자열로 변환하는 것을 의미합니다. stringify하는 이 과정을 직렬화(serialize)한다고 합니다.
문제7. 다음 중 콘솔창에 찍힌 내용으로 옳은 것을 고르세요.
const message = { sender: "김코딩", receiver: "박해커", message: "해커야 오늘 저녁 같이 먹을래?", createdAt: "2021-01-12 10:10:10" } let stringified = JSON.stringify(message) console.log(stringified);
A.{"sender": "김코딩","receiver": "박해커","message": "해커야 오늘 저녁 같이 먹을래?","createdAt": "2021-01-12 10:10:10"}
B.{sender:"김코딩",receiver:"박해커",message:"해커야 오늘 저녁 같이 먹을래?",createdAt:"2021-01-12 10:10:10"}
C.{"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}
D.{ "sender":"김코딩", "receiver":"박해커", "message":"해커야 오늘 저녁 같이 먹을래?", "createdAt":"2021-01-12 10:10:10" }
더보기A.{"sender": "김코딩","receiver": "박해커","message": "해커야 오늘 저녁 같이 먹을래?","createdAt": "2021-01-12 10:10:10"}
B.{sender:"김코딩",receiver:"박해커",message:"해커야 오늘 저녁 같이 먹을래?",createdAt:"2021-01-12 10:10:10"}
C.{"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}
D.{ "sender":"김코딩", "receiver":"박해커", "message":"해커야 오늘 저녁 같이 먹을래?", "createdAt":"2021-01-12 10:10:10" }
console.log(stringified) // {"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}
문제8. 다음 중 콘솔창에 찍힌 내용으로 옳은 것을 고르세요.
const message = { sender: "김코딩", receiver: "박해커", message: "해커야 오늘 저녁 같이 먹을래?", createdAt: "2021-01-12 10:10:10" } let stringified = JSON.stringify(message) console.log(String(message)); // 'A' console.log(typeof stringified); // 'B' console.log(typeof JSON.parse(stringified)); // 'C'
A : string, B: string, C: object
B. A : [obejct Object], B: object, C: object
C. A : [obejct Object], B: string, C: string
D. A : [obejct Object], B: string, C: object
더보기A : string, B: string, C: object
B. A : [obejct Object], B: object, C: object
C. A : [obejct Object], B: string, C: string
D. A : [obejct Object], B: string, C: objectconsole.log(String(message)); // 'A' : message 객체를 문자열로 변환하여 출력하면 [object Object]가 출력됩니다. console.log(typeof stringified); // 'B' : stringified 변수의 타입은 string입니다. console.log(typeof JSON.parse(stringified)); // 'C' : JSON.parse() 함수를 사용하여 stringified 문자열을 객체로 변환하였으므로, 그 결과의 타입은 object입니다.
'프론트엔드 공부 > 자료구조 & 알고리즘' 카테고리의 다른 글
정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴해야 합니다. 버블 정렬(bubble sort) (0) | 2023.02.20 |
---|---|
아래와 같이 정의된 피보나치 수열 중 n번째 항의 수를 리턴해야 합니다. (0) | 2023.02.16 |
정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다. (0) | 2023.02.14 |
재귀함수 (0) | 2023.02.13 |
문자열을 입력받아 연속되는 문자가 있을 경우, 연속 구간을 반복되는 수와 문자로 조합한 형태로 압축한 문자열을 리턴해야 합니다. (0) | 2023.02.10 |
소중한 공감 감사합니다