JSEXP 3번 문제들
3-1
다양한 타입의 데이터가 들어있는 배열을 입력받아, 각 인덱스에 어떤 타입의 데이터가 들어있는지 적은 새로운 배열을 반환하는 함수를 완성하세요
- 입력받은 배열을 수정해서는 안됩니다
- 빈 배열을 입력받은 경우, 새로운 빈 배열을 반환해야 합니다
ex) typeArray([1, 'st', true])
=> ['number', 'string', 'boolean']
typeArray([undefined, [1, 2], { hello: "world"}])
=> ['undefined', 'array', 'object']function typeArray(arr) { let result= []; for(let i= 0; i<arr.length; i++){ if(Array.isArray(arr[i]) ===true){ result.push('array') console.log(result) } else if(Array.isArray(arr[i]) !==true){ result.push(typeof arr[i]) } } return result }
새로운 배열을 반환하는 함수(데이터가 들어간)
=result
- Array.isArray() 메서드는 인자가 Array인지 판별
if(Array.isArray(arr[i]) ===true)
arr의 i번째의 객체가 배열이 맞다면
- arr.push(element1...,elementx)
result.push('array')
객체의 array를 []에 감싸서 push해줘라
그게(TRUE)가 아니면
result.push(typeof arr[i])
arr의 i번째의 객체의 타입을 결과값에 push해줘- typeof(식) : 식의 타입을 알려줘
참고 ex) typeArray([1, 'st', true])
=> ['number', 'string', 'boolean'] 에선
1이 arr.[0], true가 arr.[2]이다.
3-2
임의의 배열을 입력받아, 맨 처음의 값을 제외한 나머지 배열을 반환하는 함수를 완성하세요
ex) cutFirstIdx([1, 2, 3, 4, 5]) => [2, 3, 4, 5]function cutFirstIdx(arr) { arr.shift(0) return arr }
arr.shift(): 해당배열에 맨 앞 인덱스를 뺀다.
3-3
임의의 배열을 입력받아, 가장 마지막 인덱스의 값을 제외한 나머지 배열을 찾은 후
[ 원본 배열, 마지막이 제거된 배열 ] 형태를 가지는 새로운 2차원 배열을 리턴해주세요.
- 원본 배열이 수정되어서는 안됩니다.
ex) cutLastIdx([1, 2, 3]) => [ [1, 2, 3], [1, 2] ]function cutLastIdx(arr) {```
let result = arr
result.pop()
return [arr, result]
}arr.pop() : 고정적으로 맨뒤 원소 제거
3-4
임의의 배열을 입력받아, 배열의 길이를 리턴하는 함수를 완성하세요
- 반복문을 사용해야 합니다
- length 메소드는 사용이 금지됩니다function returnLength(arr) { let arrLength = 0 arr.forEach(() => { arrLength=arrLength+1 // arrLength++ 가능 }) return arrLength; }
- arr.forEach((함수)=>{각 배열의 원소에 반복하고싶은 코드})
3-5
임의의 배열 2개를 입력받아, arr1 배열 뒤에 arr2 배열을 합친 새로운 배열을 리턴해주세요.
ex) merge([1, 2], [3, 4]) => [1, 2, 3, 4]
let result
result = arr1.concat(arr2)
return result
}
배열을 합친다? concat
3-6
휴대전화 번호가 담긴 배열을 입력받아, 가운데 4자리를 별표(*)로 바꾸어 반환하는 함수를 완성하세요
- 배열의 각 인덱스로 주어지는 휴대전화 번호는 "01012345678"과 같은 형태입니다. (string)
- 문자열 배열을 리턴해야 합니다
function phoneNumCutter(arr)
let result = []
arr.forEach((e) => {
let abc = e.split('')
abc = abc.fill('*', 3, 7).join('')
result.push(abc)
})
return result
}
배열로 선언해주고
3-4에서 했듯이 arr.forEach((변수명)=>{각 배열의 원소에 반복하고싶은 코드}) 를 이용해보자
변수선언을 왜 arr.forEach안에 ?
-> forEach자체에 e 라는 변수가 있다.
밖에서 e를 선언해주면
forEach안의 식에서 e를 모른다.
그럼 왜 e.split('')일까?
문자열 배열을 리턴 => split
사용법은 ?
str.split(문자열을 잘라올 기준,횟수 제한) ※횟수제한 없어도가능
fill(바꿀원소,시작점,끝점)
시작점
즉 3번째 이후부터 바뀌는것 이상이 아니라 초과개념
끝점 = 이하 개념 즉 포함
arr.join(구분자)
1)구분자가 있을때는 해당 구분자를 문자열로 반환
2)생략하게 되면_ 모든 요소들이 쉼표
즉('') 생략을 했으니 ,들을 모두 제거하고 합쳐준다
ex): '0,1,0,%,%,%,%,5,6,7,8'
-> '010%%%%5678'
result.push(abc)에서 push해주는 이유 ?
push를 안해주면 기껏 구해놓은 배열들이 덮어씌워짐
물론 밑에 예시들은 return result 해준것임
ex): result=(abc) 이면
(["01012345678", "01087654321") ]
=> [ '010****4321' ]
뒤에것만 나온다.
ex): result.push(abc)
=>['010xxxx5678', '010xxxx4321']
3-7
학생들의 정보가 담긴 객체를 입력받아 거주지(home)가 '
구로구'이면 true를, 그렇지 않을 경우 '
false'를 반환하는 함수를 완성하세요function classmates(obj) { if(obj.home === '구로구') { return true } else { return false } }
문제의
객체를 입력받아 home = obj.home
3-8
전자제품의 정보가 담긴 객체를 입력받아,
{ category: "전자제품" }
을 추가하여 리턴해야 합니다
입력 예시
{
name: "디지털 카메라"
company: "캐논"
made: "일본"}
출력 예시 {
name: "디지털 카메라"
company: "캐논"
made: "일본"
category: "전자제품"
}function addAttribute(obj) { obj.category = '전자제품' return obj }
=혼동 주의! = 은 오른쪽에서왼쪽대입
==, ===는 왼,오 가 같은지 대입!
아무렇게나 =or=== 쓰기 X
3-9
학생들의 정보가 담긴 객체가 저장된 배열을 입력받아,
"코드초등학교" 에 다니는 학생의 이름을 담은 배열을 리턴해야 합니다
입력 예시
[
{name: "홍길동", school: "동화초등학교", age: "10"},
{name: "김코딩", school: "코드초등학교", age: "12"},
{name: "박해커", school: "캠프초등학교", age: "9"},
{name: "최맥북", school: "삼성초등학교", age: "13"},
{name: "이삼성", school: "애플초등학교", age: "11"},
{name: "나서버", school: "코드초등학교", age: "10"}
]
출력 예시
["김코딩", "나서버"]let result = []; arr.forEach((e) => { if(e.school === "코드초등학교") { result.push(e.name) } }) return result }
let result = [] 는?
출력값들이 [] 안에 있어야 하기때문
arr.forEach((e) => {
if(e.school === "코드초등학교") {
result.push(e.name)
}
forEach 문안에 반복되는 코드에 if문을 주었다.
for문이었으면 e.을 붙일 필요가 없다.
if(e.school === "코드초등학교") {
result.push(e.name)
만약 코드에 school이 "코드초등학교" 라는 객체가 있다면
그 name을 result값(=객체)에 push해줘라
3-10
선수들의 정보가 담긴 객체가 저장된 배열을 입력받아, '코드어벤저스' 팀에 속한 '야구' 종목 선수의 수를 리턴해야 합니다
3-11
좌석이 몇번째 행(row)과 열(col)까지 있는 지 입력받아, 배열을 이용하여 각 자리에 번호를 붙여야 합니다.function seatNumber(row, col) { let count = 1; let result = new Array(row).fill(0).map(()=>new Array(col).fill(0)) for(let i=0; i<row; i++){ for(let j=0; j<col; j++){ result[i][j]= count count++ } } return result }
배열안 좌석은 1부터 시작하니까 count 를1 로 할당
결과값 = 새로운배열(임의의 row값)에 0으로채우며 map(모든 배열의 원소에게 임의의col값에 0을 채운다.
for(let i=0; i<row; i++){
for(let j=0; j<col; j++){
result[i][j]= count
count++ }
}
seatNumber(3, 5)일경우
i, j, count
0, 0 , 1
0, 1 , 2
0, 2 , 3
0, 3 , 4
0, 4 , 5
1, 0 , 6
1, 1 , 7
1, 2 , 8
1, 3 , 9
1, 4 , 10
2, 0 , 11
2, 1 , 12
2, 2 , 13
2, 3 , 14
2, 4 , 15
========
[
[ 1, 2, 3, 4, 5 ],
[ 6, 7, 8, 9, 10 ],
[ 11, 12, 13, 14, 15 ]
]
이렇게 나온다. 여기에 직접명시된 숫자가 count
3-12
임의의 문자열을 입력받아, 문자열에 각 단어가 몇번 등장하는 지 기록한 객체를 리턴하는 함수를 완성하세요
- 알파벳 및 공백이 포함될 수 있는 string이 입력됩니다 - 단어가 존재하지 않는 경우, 빈 객체를 리턴
- 대소문자를 구분X
- str.trim 사용은 금지
- 공백은 1칸이상