1주차 토요일 모던자바스크립트 Deep Dive(3)

Edwin·2023년 2월 18일
post-thumbnail



이번주 1등 먹었다. ㅋㅋ 111시간 55분... 이제 자야지..

오늘의 자바스크립트

EDWIN벨로그, 프로토타입
오늘부터 연재되는 모던자바스크립트 딥다이브, 프로토타입에 대한 부분의 일부를 정리했고,

EDWIN벨로그, DATE 객체
시간과 관련된 부분을 다루는 DATE 객체에 대해서 정리를 이어나갔다.

오늘의 코테

오늘의 코테는 프로그래머스의 문제가 아니라 스파르타코딩클럽의 다음주 시험문제예제에 해당된다. 솔직히 어렵다. 1번 문제의 경우 말이다. 그래도 풀어보자.

1) 몇시간 했더라? (중)

지용이는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다. 항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.

  • 체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다.
  • 체크아웃을 할 때 익일 시간은 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메서드를 통해서 합쳐진 배열을 하나의 값으로 출력시켰다.


2) 소수의 개수와 덧셈 (상)

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요. 예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.

제한사항

  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
  • 문자열에는 소수가 한개 이상 섞여 있습니다.
  • 문자열에는 소수가 아닌 수가 한개 이상 섞여 있습니다.
  • 음수는 없습니다.
  1. 문제를 읽어보자. 변수로 담겨오는 S변수는 공백으로 구분된 숫자들이 저장되어 있다.
  2. 숫자 중에서 소수의 최대값소수가 아닌 수의 최소값을 찾아 이를 반환하라.

도대체 "소수" 너 도대체 개념이 뭐니?

소수는 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

profile
신학전공자의 개발자 도전기!!

0개의 댓글