당근먹는하니
귀엽고 행복해
당근먹는하니
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 다람쥐🐿 (26)
    • C++ 공부빵야 (7)
    • 공부👻 (5)
    • 프론트엔드✏️ (228)
      • 코드캠프 (120)
      • 팀 프로젝트✨ (31)
      • 개인공부 (67)
    • 프론트엔드 - 바닐라js (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 리액트
  • emotion
  • CSS
  • React-hook-form
  • graphql
  • 공통 컴포넌트
  • 프론트엔드
  • typescript
  • 회고
  • 코딩
  • next.js
  • 코드캠프
  • 자바스크립트
  • JS
  • HTML
  • javascrpit
  • 팀플
  • ssg
  • 프로그래머스
  • 부트캠프
  • react
  • 알고리즘
  • 팀 프로젝트
  • algorithm
  • 팀프로젝트
  • 배열
  • 코딩 부트캠프
  • refreshtoken
  • javascript
  • 배포

최근 댓글

최근 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
당근먹는하니

귀엽고 행복해

알고리즘 : reduce, filter, Math.min, splice
프론트엔드✏️/코드캠프

알고리즘 : reduce, filter, Math.min, splice

2022. 6. 2. 18:17
728x90
반응형
0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

// 처음 푼 풀이
function solution(numbers) {
    var answer = 0;
	console.log(numbers);
  for(let i = 0; i<10; i++){
    if(!numbers.includes(i)) answer += i;    
  }
  
  return answer;
}

solution([1,2,3,4,6,7,8,0]);

왜 별안간 가운데 정렬이 되는지...

 

numbers.reduce((cur,acc)=> console.log(cur,acc))


// 1 2
undefined 3
undefined 4
undefined 6
undefined 7
undefined 8
undefined 0

reduce가 아직 어려워서, 무조건 괄호 하나 더 쓰고 그 안에 cur, acc 를 담고 콘솔에 출력해보는 식으로 하고 있다. 

 

answer = numbers.reduce((cur,acc)=> cur + acc);
console.log(answer); // 31

reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다. (MDN)

cur - 누적값

acc - 현재값

 

cur에 acc를 차곡차곡 더한다는 뜻(있는 원소들의 합)

뒤에 초기값으로 0을 줘도 된다. 

 

여기까지는 어찌저찌 생각했을 지 몰라도! 45에서 이 값을 빼는 건 생각 못 했을 것 같다... 

function solution(numbers) {
    var answer = 0;
	answer = numbers.reduce((cur,acc)=> cur + acc)
  return 45-answer;
}

solution([1,2,3,4,6,7,8,0]); // 14

answer를 선언하지 않고 바로 return 45 - numbers.reduce((cur,acc)=> cur + acc) 라고 해도 된다! 한 줄로 줄이기 가능

 

멘토님 풀이 신기...

 

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

 

그래도 알고리즘 푸는 이 시간이 뭔가 제일 행복해

 

arr의 첫번째 원소를 비교인자로 두고 순서대로 비교하면서 작은 값을 com에 담는다. 

// 의식의 흐름대로 적은 풀이과정
function solution(arr) {
    var answer = [];
 		// sort 해서 제일 뒤에 꺼 제거 해도 될 것 같고
  // 근데 그럼 원래 배열 순서대로 어떻게 돌려놔? 
  // 제일 작은 애 인덱스를 찾아서 제거하는게 좋을지도
  let com = arr[0];
  console.log(com)
  for(let i = 0; i < arr.length; ++i) {
    if(com > arr[i]) com = arr[i]
    arr.pop(i);
    console.log(arr)
    // 그럼 com의 인덱스는 어케 찾아? 'ㅅ'..
		answer = arr.indexOf(arr[i]);
    //뭔가 너무 돌아가는 것 같아ㅠㅠ 인덱스를 받고 그걸로 제거
    arr.splice(answer, 1);
    // 게다가 안됐어... 그냥 찾아서 그 인덱스를 pop  
    console.log(arr)
  }
}

solution([4,2,3,1])
// 제출한 코드
function solution(arr) {
  if(!arr || arr[0]===10) return [-1]; // 여기 문제 잘못이해..ㅎㅎ
  var answer = [];
  let com = arr[0];
  for(let i = 0; i < arr.length; ++i) {
    if(com > arr[i]) com = arr[i]
  }
  answer = arr.filter(function(el) { return el > com });
  return answer;
}

filter 아직 낯설,,,

그리고 너무 복잡하게 푼 것 같아, 문제 처리 시간?도 3초인가로 오래걸렸다. 

+++ 이거 완전 문제를 잘못이해했다. 10 하나가 들어가면 자기 자신이 제거 되니까 빈배열이 됐을 때 -1을 리턴하라는건데ㅠㅠ 왜 10한테만 그러나 했네

마지막에 빈 배열인지 아닌지 확인하고 리턴하면 될 것 같아. (arr.length) 

처음부터 하나 들어왔을 때 [-1] 리턴은 안되나....?? 근데 문제에서 리턴하려는 배열이 빈 배열인 경우라고 명시되어 있으니까 마지막에 검증하고 보내는 게 나을 것 같다. 혹시 몰라... 

왜 7점이나 올려주지?

// 다른 사람 풀이
function solution(arr) {
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    if(arr.length<1)return[-1];
    return arr;
}

start

 배열의 변경을 시작할 인덱스입니다. 배열의 길이보다 큰 값이라면 실제 시작 인덱스는 배열의 길이로 설정됩니다. 음수인 경우 배열의 끝에서부터 요소를 세어나갑니다(원점 -1, 즉 -n이면 요소 끝의 n번째 요소를 가리키며 array.length - n번째 인덱스와 같음). 값의 절대값이 배열의 길이 보다 큰 경우 0으로 설정됩니다.

delete

 Count Optional배열에서 제거할 요소의 수입니다.deleteCount를 생략하거나 값이 array.length - start보다 크면 start부터의 모든 요소를 제거합니다.deleteCount가 0 이하라면 어떤 요소도 제거하지 않습니다. 이 때는 최소한 하나의 새로운 요소를 지정해야 합니다.

(출처: MDN)

 

 

제일 작은 값을 찾을 때는 배열의 제일 앞 숫자를 기준으로 잡는다. (ex. min = 0으로 잡으면 0보다 작은 애가 없으면...? 비교 못하잖아)

let min = arr[0];

for(let i = 1; i < arr.length; i++) {

	if(arr[i] < min _ {
  		min = arr[i];	
	}
}

// 이때는 for문을 돌릴 때 i = 1 부터 시작([0]은 이미 비교했기 때문)
// 배열에서 Math.min 쓰기  - 스프레드 연산자 쓰기

arr = [1, 2, 3, 4];
Math.min(arr) // NaN

Math.min(...arr) // 1

 


// 버블 정렬
function bubbleSort(array) {
  for (let i =0; i< array.length; ++i) {
    for(let j = 0; j < array.length-i-1; ++j) {
      if(array[j]>array[j+1]) {
        [array[j], array[j+1]] = [array[j+1],array[j]];
      }
    }
  }
  return array;
}

console.log(bubbleSort([5, 4, 2, 1, 3]));
function bubbleSort(array, type) {
  
  function HoF(a, b) {
    return a > b ? true : false;
  }
  for (let i =0; i< array.length; ++i) {
    for(let j = 0; j < array.length-i-1; ++j) {
      if(type ? array[j] > array[j+1] : array[j+1] > array[j]) { if(HoF(array[j], array[j+1]))
        [array[j], array[j+1]] = [array[j+1],array[j]];
      }
    }
  }
  return array;
}

이러라고 HoF를 준 건 아닌 것 같은데.. 어떻게 하는거지 ㅠㅠ

 

버블 정렬할 때 제일 큰 값은 i가 0일때, 즉 1회차때 맨 오른쪽으로 가게 되어있으므로(정렬 되므로), 이는 한 회차 돌 때마다 반복되므로 j의 조건문의 array.length에서 -i를 해준다. -1은 왜 하는거지? 

 

 

728x90
반응형
저작자표시 비영리 동일조건 (새창열림)

'프론트엔드✏️ > 코드캠프' 카테고리의 다른 글

220602 프론트엔드 부트캠프 23일차 : 이미지 프로세스, ref  (0) 2022.06.03
220601 프론트엔드 부트캠프 22일차 : CORS, API, firebase  (0) 2022.06.03
220531 프론트엔드 부트캠프 21일차 : [Backend]Open-API, DB / 태그  (0) 2022.05.31
알고리즘 - reduce  (0) 2022.05.31
220530 프론트엔드 부트캠프 20일차 : 클래스 컴포넌트, 생명주기(Lifecycle)  (0) 2022.05.31
    '프론트엔드✏️/코드캠프' 카테고리의 다른 글
    • 220602 프론트엔드 부트캠프 23일차 : 이미지 프로세스, ref
    • 220601 프론트엔드 부트캠프 22일차 : CORS, API, firebase
    • 220531 프론트엔드 부트캠프 21일차 : [Backend]Open-API, DB / 태그
    • 알고리즘 - reduce
    당근먹는하니
    당근먹는하니

    티스토리툴바