


EDWIN벨로그, 프로토타입
오늘부터 연재되는 모던자바스크립트 딥다이브, 프로토타입에 대한 부분의 일부를 정리했고,
EDWIN벨로그, DATE 객체
시간과 관련된 부분을 다루는 DATE 객체에 대해서 정리를 이어나갔다.
지용이는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다. 항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.
- 체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다.
- 체크아웃을 할 때 익일 시간은 24+a 로 계산한다. 즉 새벽 2시는 24+2 인 26으로 표기한다.
- 체크인 페이지는 체크아웃이 새벽 5시 정각이나 새벽 5시를 넘어가면 체크아웃을 깜빡한 것으로 간주한다.
따라서 새벽 5시가 넘어가 체크아웃을 하게 되면 자동으로 체크아웃을 오후 9시(21시)로 한 것으로 처리한다.
function solution(arr1, arr2){
let chekout = Array.from({length:7}, (item, i) => arr2[i] > 28 ? 21 : arr2[i])
return chekout.map((el, i) => el-arr1[i]).reduce((acc,cur)=>acc+cur,0)
}
let arr1=[9, 7, 8, 9, 7, 9, 8];
let arr2=[23, 22, 26, 26, 29, 27, 22];
console.log(solution(arr1, arr2))
다르게 풀어보자. reduce메서드
function solution(arr1, arr2) {
return arr2.reduce((acc, cur, i)=> pre+(cur >= 29? 21 : cur) - arr1[i],0)
}
let arr1=[9, 7, 8, 9, 7, 9, 8];
let arr2=[23, 22, 26, 26, 29, 27, 22];
console.log(solution(arr1, arr2))
먼저 체크아웃 시간이 29시(새벽 5시) 보다 많은 값을 21시로 변경해주었다. 이를 위해서 Array.from({length:7}을 통해서 희소배열 7개를 만들고, 조건에 따라서 해당요소가 chekout 객체에 담겨지도록 설정하였다.
둘째, map메서드를 통해서 가공된 체크아웃 배열에서 체크인 배열을 [i]번지마자 빼기를 해주었다.
셋째, reduce메서드를 통해서 합쳐진 배열을 하나의 값으로 출력시켰다.
문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요. 예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.
제한사항
- s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
- 문자열에는 소수가 한개 이상 섞여 있습니다.
- 문자열에는 소수가 아닌 수가 한개 이상 섞여 있습니다.
- 음수는 없습니다.
도대체 "소수" 너 도대체 개념이 뭐니?
소수는 1보다 큰 자연수 중 1과 자기 자신만의 약수를 가지는 수다. 본인과 1로만 나눌 수 있는 수가 소수이다. 먼저 소수에는 2,3,5,7 로부터 시작해서, 이후의 숫자는 2,3,5,7로 나눴을 때 0이 아닌 수가 소수이다. 2,3,5,7,11,13......

정말코딩의 세계는 어렵다.
let str = "109 6 34 56 67 89 54 97 97"
solution(str)
먼저, 위를 보면 정렬되지 않은 문자열 자료가 있다. 이를 가공해서 소수의 최대값과, 소수가 아닌 숫자의 최소값을 다시 문자열로 반환하는 문제이다.
let arr = str.split(' ').map(el => Number(el)).sort((a,b)=> a-b);
다음은 띄어쓰기 단위로 자르고, map메서드를 통해서 내용을 숫자로 변경해주고, 오름차순으로 정렬을 해주었다.
let divide = [2,3,5,7]
let primeNum = arr.filter(item => item==2 || item==3 || item==5 || item==7 ? item : item%2!==0 && item%3!==0 && item%5!==0 && item%7!==0)
셋째, item => item==2 || item==3 || item==5 || item==7 ? 조건부 삼항 연산자를 통해서 먼저 소수에 해당되는 2,3,5,7 를 먼저 조건문을 통해서 소수에 대입시켜주고, 이외의 값에 대해서 2,3,5,7 로 나눠지지 않는 값만 필터를 통해서 배열에 반환되도록 하였다.
넷째, let isNotPrime = arr.filter(item =>!primeNum.includes(item)) 이번에는 소수가 아닌 숫자를 배열에서 추출해야 하는데 역시 filter 메서드를 통해서 primeNum에 존재하지 않는 요소만 반환되도록 처리하였다.
이렇게 소수의 배열과, 소수가 아닌 배열, 2개의 배열이 하나의 문자열에서 추출되었다.
let result = []
result.push(Math.min(...isNotPrime))
result.push(Math.max(...primeNum))
다섯째, 빈배열을 만들어주고, 최소값과 최대값을 구하는 내용을 전개구문으로 하여 배열에 넣어주었고, 이어지는 구문에서 join메서드를 통해서 배열을 문자열로 반환하며 최종값을 위의 codepen에서 볼 수 있도록 정보를 HTML로 전달해주었다.
여전히 메서드는 어렵다. map메서드와 함께 if문을 사용하려하니, map메서드는 원본배열의 길이와 같은 값을 배출한다. 그러기에 특정 값을 배열에서 제거하기 원한다면, filter메서드를 통해서 접근해야 한다. 이렇게 조금씩 메서드들이 할 수 있는 일과 할 수 없는 일을 구분하는 단계로 나아가고 있는 중이다. 암기가 아니라 숙달이다. 많이 코딩 테스트를 통해서 메서드들의 영역을 더 구분해야 할 것이다. 시간이 있을 때마다 틈틈히 정리하자. 그렇게 쌓인 나의 벨로그의 자료는 나에게 무한한 자산이 될 것이다.
그냥 막연했던 친구가 이제는 조금 익숙해져가고 있다. 내가 구문을 작성하지는 못하더라도, 코드를 보면 해석은 할 수 있다는 점이다. 대표적으로 오늘만 하더라도 질문방에서 특별한 언급을 매니저님께서 해주시지 않았지만, 희소배열을 만들고 그 안에 요소를 채워줄 수 있는 Array.from 메서드에 대해서 한 걸음 더 나아갈 수 있었기 때문이다. 어제만 하더라도 Array.from 메서드 정적 메서드로만 알고 있었다. 그러나, 오늘 보니 그 안에 함수표현식을 사용해서 복잡한 작업도 가능했다는 것을 보았다. 이렇게 나는 오늘도 발전 중이다.
arthor. EDWIN
date. 23/02/19