4주차 주말복습

냐하호후·2021년 7월 11일
0

고차함수 28

function getLengthOfLongestElement(arr) {
if(arr.length === 0){
  return 0
}
  return arr.reduce(function(acc,cur){
    if(cur.length <= acc.length){
      return acc
    }
   return cur
  },0).length
}

리턴할 때 acc.length,cur.length로 하면 틀리고 위의코드처럼해야 정답이 되는 이유가 있었다.

내가 처음 쓴대로 작동을 한다면
첫 요소가 들어가서 acc.length 를 리턴한순간 누적값이 숫자가 되고
그 다음요소를 비교할때 다시 length를 사용하면 숫자.length 가 되어 undefined으로 비교를 진행한다.

따라서 2번째 reduce함수시작부터는
if(문자.length <= undefined) 가 되고
이경우는 무조건 false를 리턴한다.

이후 계속 else문항이 반복되고
결국 맨 마지막요소.length가 리턴될 것이다.

고차함수 31

function studentReports(students) {

const festudent = students.filter(function(el){
  return el.gender === 'female'
})

return festudent.map(function(el){
  const sum = el.grades.reduce(function(acc,cur){
  return acc + cur
  })

  const avg = sum / el.grades.length
  el.grades = avg
  return el
})
}

//여성으로만 이루어진 배열을 students.filer를 이용해서 리턴
//이것을 변수 festudent에 할당

//festudent 배열에서 
//grades에 있는 요소들을 전부 더하는 함수를 reduce를 이용해서 만든다
//그것을 sum이라는 변수에 할당한다

//sum을 grades의 길이로 나누어서 평균값을 리턴
//.map()으로 리턴한다

고차함수 32

function sumOfArraysInArray(arr) {
  const oneArray = arr.reduce(function(acc,cur){
    return acc.concat(cur)
  })
  
return oneArray.reduce(function(acc,cur){
  if(typeof(cur) === 'number'){
return acc + cur
  }
  return acc
},0)

}

//arr의 el들을 reduce 함수로 새로운 배열로 만든다.
//그 안에서 concat을 이용해서 arr를 1차원 배열로만든다
//그 후에 배열의 type이 "number"라면
//reduce를 이용해서 다 더해준다.
//다 더한값을 리턴한다.
function sumOfArraysInArray(arr) {
 const concated = arr.reduce(function(acc,cur){
   acc = acc.concat(cur)
   return acc
 })

  const filtered = concated.filter(function(el){
    return typeof el === "number"
  })
if(filtered.length === 0){
  return 0
}

  return filtered.reduce(function(acc,cur){
    return acc = acc + cur
  })
}

//reduce함수로 concat을 이용해서 배열들을 하나의 배열로 만들어준다.
//변수 filtered를 선언한다. filter를 이용해서 typeof 했을 때 'number'인 것들만 걸러낸다.
//reduce를 이용해서 filtered의 숫자요소들을 다 합친값을 리턴한다.

처음 푼 방법이 더 간단한 것 같다. 근데 두번째 방법이 이해하기는 더 쉽다 ㅎ

알고리즘 5번

function firstReverse(str) {
 let word = str.split('').reverse()
 let result = ''
 for(let i = 0; i < str.length ; i = i + 1) {
   result = result + word[i]
 }
 return result
}

//변수 word를 선언한다. str.split('')을 할당한다
//변수 word는 배열이다.
//변수 result를 선언한다. ''를 할당한다.
//for문을 만들어 word의 뒤집혀진 letter들을 하나하나 살펴본다.
//i를 선언해준다. i에 0을 할당해준다. i는 str.length보다 짧다. i는 1씩 커진다.
//word.reverse()를 사용하면 배열 word의 letter들은 반대로 정렬된다.(' ' 빈칸까지!)
//result 에 word.reverse()[i]를 더해준다.  (->letter가 그대로 출력된다.)
//result를 리턴해준다!

알고리즘 6번

function letterCapitalize(str) {
let word = str.split(' ')

for(let i = 0; i < word.length ; i++){
if(word[i].length > 0){
  word[i] = word[i][0].toUpperCase() + word[i].substr(1)
}
 }
 str = word.join(' ')
return str
}

//변수 word를 선언한다. str.split(' ')를 할당한다.
//word는 배열이된다.
//만약 str이 빈 문자열이라면 ''를 리턴한다.
//for문을 만든다. i는 0이다 i는 str길이보다 작다. i++
//만약 word[i]의 길이가 0보다 크다면
//word[i][0]을 toUpperCase()를 이용해서 대문자로 바꾸어주고
//substr(1)을 사용해서 word[i][1]부터 끝까지 word[i]를 온전히 붙여준다.
//word에 join(' ')을 사용해서 떨어져있는 요소들을 붙여준다. 그러면 string이 된다.
//word.join(' ')를 리턴해준다.

join(' ')를 쓰면 요소들이 문자열로 붙을 때 띄어쓰기가 한칸 늘어나서 붙는다
이말은 str.split(' ')으로 한칸 줄었던 space가 join(' ')를 사용해서 space가 한칸더 생겨서 원래의 모습대로 돌아간다는 소리이다.

알고리즘 7번

function convertListToObject(arr) {
  let obj = {}

  for(let i = 0; i < arr.length ; i++) {        
    if(arr[i].length === 0){
    continue
    }
  
  if(obj[arr[i][0]] === undefined ){
   obj[arr[i][0]] = arr[i][1]
  }
}
  return obj
}

//배열을 요소로 갖는 배열을 입력받아 각 배열을 이용해 만든 객체를 리턴해야한다

//변수 obj를 선언한다. {}를 할당해준다
//
//for문을 만든다. i를 선언한다. 0 을 할당한다. i는 arr의 길이보다 짧다; i++
//만약 빈배열이 있다면 넘어간다

//처음 키를 넣고 값이 없는 키의 값은 undefined
//다음에 같은 키가 오면 그 키의 값으로 값이 변한다
//키가 이전에 들어왔다면 뒤에들어온 키값은 넣지말아야한다.
//
//arr[i][0]은 obj의 key가 되고 arr[i][1]은 obj의 value가 되어야한다
//obj를 리턴한다



//2중 for문이 돌아가는 과정

//바깥 for문에서 i 가 arr의 길이인 4보다 작은지 확인한다 
// i는 0이된다 // j가 arr[i]의 길이인 2보다 작은지 확인한다 //i가 0이고 j가 0은 arr[0][0]이다. 이때 'some'이 나온다
//만약 arr[i]가 빈 배열이라면 continue로 넘어간다. arr[0][0]이 obj의 key가 된다.
 //j에 1이 추가되어서 j는 1이다. //j가 arr[i]의 길이 2보다 작은지 확인한다. // arr[0][1]이되고 'like'가 된다.
 //arr[0][1]은 빈 배열이 아니기 때문에 arr[0][1]은 obj의 value가 된다.
 //j에 1이 추가되어 j는 2가된다 // j가 2보다 작은지 확인한다. //안쪽 for문에서 j가 2보다 작지 않아서 안쪽for문의 작동이 끝난다.

 //바깥for문이 작동한다. // i가 0에서 1이 추가되어서 i는 1이된다. // arr의 길이 4보다 작은지 확인한다. 
 //안쪽for문이 다시 작동한다. // i가 1일때 j가 0이된다 //j가 arr[i]길이 2보다 작은지 확인한다. // 코드는 arr[1][0] 'some'이 된다.
 //arr[1][0]은 obj의 key가 된다. //j에 1이 추가가 되어 j는 1이된다. // j가 arr[i]길이 4보다 작은지 확인한다. //
 //arr[1][1] 'dislike'이 된다. // arr[1][1]은 빈 배열이 아니기 때문에 arr[1][1]은 obj의 value가 된다.
 // j에 1이 추가되어 2가된다 // j가 2보다 작은지 확인한다. 안쪽 for문에서 j가 2보다 작지 않아서 안쪽 for문의 작동이 끝난다

알고리즘 8번

function convertDoubleSpaceToSingle(str) {
  let result = ''

  for(let i = 0; i < str.length; i++){
    if(str[i] === ' ' && str[i+1] === ' '){
      i = i+1
    }
    result = result + str[i]
  }
  return result
}

//두칸의 공백이 포함된 문자열 str을 입력받는다
//변수 result를 선언한다 ''를 할당해준다
//for문을 만들어서 str을 하나하나 살펴본다
//for문에 i를 선언해주고 0을 할당한다. i 는 str의 길이보다 짧다. i는 1씩 증가한다
//만약 str[i]가 빈칸이고 str[i+1]이 빈칸이라면 i를 1 더해준다 --->수도코드를 글로 쓰자 
//i에 1을 더해주어야 i번의 차례가 왔을때 i에 1이 추가되고 원래는 그 다음순서인 i+1번의 공백을 건너뛸 수 있기 때문이다
//result에 str[i]를 추가해준다
profile
DONE is better than PERFECT

0개의 댓글