문제 1. 배열을 인수로 받고, 똑같은 요소를 가진 새로운 배열을 리턴하는 함수를 작성해라.
copyArray(['Rocket', 'Groot', 'Star-Lord']) // ["Rocket", "Groot", "Star-Lord"]
풀이 전 사고)
- 새로운 배열을 리턴하기 위해서는 배열을 새로 만들어야 한다.
- 새로 만든 배열은 push, pop, shift, unshift 등으로 조작이 가능하다.
- 새로 만든 배열과 인수로 넣은 배열의 길이가 같아지면 새로 만든 배열을 리턴한다.
답)
const copyArray = (arr, newarr = []) => {
if (arr.length === newarr.length) return newarr
newarr.push(arr[newarr.length])
return copyArray(arr, newarr)
}
- (if) 인수로 넣은 배열의 길이와 새롭게 만들어지는 배열의 길이가 같다면 새 배열을 리턴한다.
- 새 배열에 push한다. push되는 것은 기존 배열의 새 배열 길이 만큼의 인덱스이다.
- 재귀시킨다.
문제 2. 배열과 문자열을 인수로 받아, 배열 안의 요소가 문자열과 같다면 삭제하는 함수를 작성하시오.
const a = ['Rocket', 'Groot', 'Groot', 'Star-Lord']
const b = removeElement(a, 'Groot') // ["Rocket", "Star-Lord"]
const c = b === a // since removeElement returns the original array,
// b === a should be true
※ 인수로 들어가는 배열을 수정하는 것임 ( 즉, 같은 레퍼런스의 배열을 수정하는 것 )
풀이 전 사고)
- 새로운 배열을 만드는 과정이 아니므로, 인수로 들어가는 배열 자체에 push, pop, shift, unshift, splice 메서드를 이용해야 한다. (여기서는 splice를 사용하는 것이 기능상 옳다.)
- 배열의 길이가 계속 줄어듦으로, 함수를 종료할 if return을 잘 고려해본다.
풀이)
const removeElement = (arr, str, i = 0) => {
if (arr.length === i) return arr
if (arr[i] === str) {
arr.splice(i, 1)
return removeElement(arr, str, i)
}
return removeElement(arr, str, i + 1)
}
- 인덱스값으로 활용할 i를 인수로 활용한다.
- i는 0부터 시작하며 arr 배열의 길이가 i와 동일해질때까지 1씩 커진다.
- 배열의 길이와 i의 길이가 같다면 배열을 출력한다. (그렇게 하지 않는다면 배열이 이상해진다.)
- arr[i]와 str이 같은지 비교하고, 같다면 splice 메서드를 이용하여 그 인덱스부터 1개의 자료를 잘라낸다.
- 재귀시킨다.
문제 3. 배열과 숫자를 인수로 받는 함수를 작성해라. 그 함수는 배열을 복사하여 리턴하되, 인수로 받은 숫자와 값이 같은 인수는 복사하지 않는다.
const result = copyWithout([5, 2, 2, 9], 2) // [5, 9]
풀이 전 사고)
- 새로운 배열 요소를 담을 그릇 인수를 만든다.
- 인덱스로 활용할 i를 만들어서 인수로 들어온 배열을 모두 비교한다.
- push 기능을 활용한다.
- 만약 배열의 요소가 인수로 받은 숫자와 같다면 push하지 않는다.
- i가 인수로 받은 배열을 모두 순회한다면 새로운 배열을 return 한다.
풀이)
const copyWithout = (arr, num, result = [], i = 0) => {
if (arr.length === i) return result
if (arr[i] !== num) {
result.push(arr[i])
}
return copyWithout(arr, num, result, i + 1)
}
- (if) 인수로 받은 배열의 길이와 i의 길이가 같아진다면 새로 만든 배열을 리턴한다.
- 인수로 받은 배열의 요소와 인수로 받은 숫자가 같지 않다면 새로운 배열에 인수로 받은 배열의 요소를 push한다.
- 재귀시킨다.
문제 4. 인수로 받은 배열의 요소를 역 순서로 정렬하여 새로운 배열로 리턴하는 함수를 만들어라.
copyReverse([5, 2, 2, 9]) // [9, 2, 2, 5]
풀이 전 사고)
새로운 배열을 만들어야 한다.
인덱스를 순회할 i를 만든다.
length는 배열 인덱스의 -1 값으로 시작한다. 이를 활용한다.
풀이)
const copyReverse = (arr, result = [], i = 1) => {
if (arr.length < i) return result
result[i - 1] = arr[arr.length - i]
return copyReverse(arr, result, i + 1)
}
기존 배열의 마지막 요소부터 새로운 앞에 하나씩 붙이는 배열을 만들었다.
※ 기존 답지와는 다른 방식으로 접근했다.
답지)
const copyReverse = (a, result = []) => {
if (result.length === a.length) {
return result
}
result.unshift(a[result.length])
return copyReverse(a, result)
}
- 기존 배열의 length와 새로운 배열의 length가 같아지면 새로운 배열을 returnㅎ ㅏㄴ다.
- 이 때 result의 앞에 unshift를 통해 기존 배열의 값을 붙여준다.
- 요소가 하나씩 뒤로 밀려나며 붙게 된다.
※ unshift를 이용하면 시간 복잡도가 다소 증가하게 된다. 하지만 답지의 방법도 익혀놓을 필요성이 있겠다.
'Javascript' 카테고리의 다른 글
Map과 Map의 내부 작동 원리 (0) | 2022.08.12 |
---|---|
배열 관련 문제 풀이 (2) (0) | 2022.08.12 |
Splice() (0) | 2022.08.11 |
unshift() (0) | 2022.08.11 |
shift() (0) | 2022.08.11 |