숫자 묶음에서 3개를 뽑아 더한 합이 소수인지 알아보는 문제가 나왔다. 처음에는 순열이라고 생각했지만, 순서 상관없이 합만 보는 것이니 조합이구나 싶어 생각을 고쳐먹었다.
일단 코드부터 기록해두자.
순열조합 쓸 때마다 항상 고마운 참고 블로그
const getCombination = (arr, select) => {
const result = [];
// 1개 뽑을 시 바로 모든배열의 원소 return
if (select === 1) return arr.map((el) => [el])
arr.forEach((fixed, index, origin) => {
// 뽑은 수 fixed를 제외한 나머지 뒤
const rest = origin.slice(index + 1)
// 나머지에 대해서 재귀로 조합 시행
const combination = getCombination(rest, select -1);
// 돌아온 조합에 이미 뽑아서 떼놓았던 값 붙이기
const attached = combination.map((el) => [fixed, ...el])
// spread 연산자로 모두다 push
result.push(...attached)
});
return result;
}
야 너좀 쩔더라
reduce가 무슨 메서드인지, 사람들이 reduce를 왜 쓰는지도 몰랐는데 MDN과 블로그들을 살펴보니 꽤 유용했다. for문이나 forEach를 돌지 않고도 합을 금방 구해낼 수 있다.
(물론 나는 이차원배열 내부값에서 합들을 구해야 했기에 결국 forEach를 돌았지만)
function findPrimeNumber (nums) {
const pickedNumbers = getCombination(nums, 3);
const sum = [];
const pickedSum = pickedNumbers.forEach((v,i) => {
const addnum = pickedNumbers[i].reduce((a,b) => a + b, 0)
sum.push(addnum)
})
소수의 정의가 '1과 자기 자신으로만 나누어 떨어지는 수' 인건 아는데, 사실 이 특성은 약수가 더 있는 다른 수에도 부합하는 조건이기에 마땅한 방법이 떠오르지 않았다. 직접 나눠야 만 하나? 그런 Brutal한 방법 말곤 없나...?🤔
참고 블로그 덕분에 제곱근을 이용해 푸는 방법을 보았다. 그런데 관련한 얘기를 전에 은택님에게 들은 것 같은데?
-> 240930 TIL에 짤막한 언급이 있었다.
은택님이 기사 문제 관련해서 약수의 개수 구하는 방법을 알려주신 적이 있었는데, 굳이 제곱근보다 큰 수까지 반복문을 돌리지 않아도 된다고 한다. 어차피 제곱근 이전에서 약수가 나온다면 그것의 *2를 하면 되고, 제곱근 이전에서 약수가 안 나오면 그 뒤로도 안 나오기 때문이라고.
-> 이게 시간복잡도 상 가장 빠르고 괜찮은 방법이라고 한다. 오호😚
챌린지반에서 했었다. 241017 챌린지반 기록
튜터님이 로컬 서버를 쓰신다는 말씀에 화들짝 놀라 호다닥 구글링.
참고 블로그를 토대로 오라클에서 MySQL Server를 다운로드 받고 설치... 하려면 일단 오라클에 가입부터 해야한다.😑
MySQL Download 탭에 가서 MySQL Community(GPL) Downloads를 누른다.
MySQL Community Server를 선택
난 LTS를 선택하고 MSI Installer를 받았다.
다운로드 완료 후 실행하면 이렇게 나온다.
진행하다 보면 설치 유형을 선택하라고 하는데, 나는 C 말고 다른 드라이브에 설치해서 Custom? 을 누른거 같다.
어찌저찌 참고 블로그를 봐가며 설치를 진행하다 보면 Configurator를 실행하겠냐? 라는 식으로 물었던 것 같다.
예전 인스톨러는 Configurator가 합쳐져 있는 것 같았는데 지금은 아닌 듯. 일단 실행하고 진행.
참고 블로그 탐독 중 당황한 것. 예? 워크벤치요...? 워크벤치가 뭔데요...?
없는 게 없는 구글. 대충 DBeaver 같은 건가보다.
받아서 설치하고 실행해봤더니, 아까 MySQL Local DB 설정 때 만들었던 인스턴스를 자동으로 잡아 주어 편했다.
call, bind, apply를 this 바인딩 때 봤던 기억은 있는데 이들이 뭐였는지 기억나지 않는다. 도와줘요 MDN.
MDN
여기 인자로 pools를 안 넣어줘서 그랬다.
모처럼 인자로 pool을 받아왔는데 쓰이질 않길래 봤더니 내가 await pools.query
라고 써놨었다. 이것까지 고쳤더니 크래시 문제는 해결된 것 같았는데...
학습 도중 노트북을 들고 카페로 이동했더니, 여기는 프로젝트 폴더가 아예 없어 git clone부터 진행했다. 거기에 뭐가 다 있겠지 라고 생각하고 말았는데 왜 에러가 터지나 살펴보니 여기는 .env 파일이 없었다. 로컬DB를 만들면서 계정과 비밀번호를 설정해놓고는 정작 그걸 참조할 .env는 만들지 않은 것.
학습자료를 통해 부랴부랴 .env를 만들고 비밀번호도 내가 설정해놓은 걸로 바꾸니 더이상 Access denied는 뜨지 않았다.
응 아니야. 니가 미리 스키마 짜서 생성해뒀어야지.
우리가 지금 하는 작업은 커넥션 풀 짜서 연결만 해주는 것이기 때문에, DB는 미리 만들어 두었어야 한다.
그렇다면 내가 로컬에 만들어둔 SQL DB와 연결은 어떻게 할까? 연결을 해야 DB를 만들든 말든 할텐데. 🤔
VS Code 확장 프로그램 중 표시해둔 MySQL 이라는 걸 받자.
나는 로컬호스트의 3306 포트로 연결할 예정이라 이렇게 써주었다. 이러고 save 누르면 저장된다. 혹시 연결을 확인해보고 싶으면 Connect를 눌러보자.
MySQL 서버가 연결되고 나면 + 버튼을 누르면 저렇게 DB를 만들 수 있도록 CREATE DATABASE
라고 뜬다. 이름을 작성하고 Run을 눌러주면 좌측 목록에 DB가 생성된다.
그러고 나서 서버를 다시 켜보면 이번엔 성공.