1.React에서 배열에 map 메서드를 사용할 때
key를 사용하지 않으면 비효율적이고
중복된 key를 사용하면 DOM에서 문제가 발생하는 것 까지는 알았지만
key가 정확하게 하는 일이 무엇인지 궁금했다.
어차피 VirtualDOM에서 일을 처리하는데
왜 우리는 굳이 key를 추가하기를 권장받을까?
가장 큰 이유는 효율성과 안정성이었다.
key를 사용하지 않을 경우
domTree에서는 배열을 순차적으로 비교하며
배열의 내용 중 하나라도 순서가 일치하지 않으면 전체를 변경해버린다.
예를 들어 [1,2,3,4,5,6,7]이 [1,2,3,4,5,6,8]로 바뀐 경우에도
7개의 값을 모두 비교한 다음 배열의 변경을 인식하고
배열을 다시 렌더링해준다.
하지만 key를 사용한다면 key-value의 매칭을 통해 비교하며
[1,2,3,4,5,6] 까지의 부분은 리렌더링하지 않고
간단하게 7을 8로 변경하는 작업만으로 끝내줄 수 있다.
이런 빠른 리렌더링을 일반적인 개인 프로젝트에서 체감하기 힘들지만
무한스크롤 등 많은 데이터를 배열로 mapping하는 경우
변경된 것 하나만 리렌더링 하는 것과
전체를 리렌더링 하는 것은 엄청난 차이를 보일 것이다.
또한 key라는 고유성을 부여해 안정성 또한 부여할 수 있다고 한다.
(1).백준 1929 소수 구하기는 범위 소수를 모두 출력하는 문제였다.
특정 숫자의 소수 여부를 체크하는 것이 아니기 때문에
당연히 에라토스테네스의 체가 제일 효율적이었다.
기존에 에라토스테네스의 체를 사용해서 할 때는
1~100까지를 체크해야 한다고 할 경우 100을 제외한 2~99까지 진행했었다.
최소 소수인 2부터 n-1까지를 진행했던 이유는
n은 이전에 판단이 되기 때문에 소수인지 판별이 이전에 나서 확인을 안했는데
이번 기회에 에라토스테네스의 체의 정확한 이름을 찾기 위해 검색해보니
여태 시간복잡도상 멍청한 계산을 하고 있다는 사실을 알 수 있었다.
예를 들어 97이라는 소수를 판별하기 위해서는
당연히 96까지 체크할 필요가 없다.
96의 경우 48로 나누어진다는 부분이 중요한 것이 아니라
그 이전에 2로 해결이 된다는 부분이 중요했는데
기존 소수 체크를 위해 Math.sqrt를 사용하듯
제곱근보다 큰 숫자로는 체크할 필요가 없는 것이었다.
Math.ceil(Math.sqrt(endNum))를 사용해 범위를 대폭 줄이고
문제가 잘 해결되는 것을 볼 수 있었다.
1에서 100까지라고 가정할 때 100까지가 아닌 10까지만 체크하면 되기 때문에
제곱근까지만 체크할 경우 log₂N만큼 단축되는 것을 볼 수 있다.
const [startNum, endNum] = `3 100`.split(' ').map(Number)
let primeArr = [0,0]
for(let i = 2 ; i <= endNum ; i++){
if(i < startNum){
primeArr.push(0)
}
else{
primeArr.push(i)
}
}
for(let i = 2 ; i <= Math.ceil(Math.sqrt(endNum)) ; i++){
for(let j = 2 ; j*i <= endNum ; j++){
primeArr[i*j] = 0
}
}
console.log(primeArr.filter(el => el).join('\n'))
'회고' 카테고리의 다른 글
| [취업준비일지] - 104 (0) | 2023.02.01 |
|---|---|
| [취업준비일지] - 103 (0) | 2023.01.31 |
| [취업준비일지] - 101 (0) | 2023.01.29 |
| [취업준비일지] - 100 (0) | 2023.01.28 |
| [취업준비일지] - 99 (0) | 2023.01.27 |
