From a18681d3554acd638d4e09efa45ecd1f6c978908 Mon Sep 17 00:00:00 2001 From: codeisneverodd Date: Tue, 19 Jul 2022 10:53:32 +0900 Subject: [PATCH 01/17] =?UTF-8?q?solution:=20level=202=20/=20=ED=95=98?= =?UTF-8?q?=EB=85=B8=EC=9D=B4=20=ED=83=91=20=ED=92=80=EC=9D=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\354\235\264\354\235\230-\355\203\221.js" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 "level-2/\355\225\230\353\205\270\354\235\264\354\235\230-\355\203\221.js" diff --git "a/level-2/\355\225\230\353\205\270\354\235\264\354\235\230-\355\203\221.js" "b/level-2/\355\225\230\353\205\270\354\235\264\354\235\230-\355\203\221.js" new file mode 100644 index 0000000..5b57c2d --- /dev/null +++ "b/level-2/\355\225\230\353\205\270\354\235\264\354\235\230-\355\203\221.js" @@ -0,0 +1,28 @@ +//https://github.com/codeisneverodd/programmers-coding-test +//완벽한 정답이 아닙니다. +//정답 1 - codeisneverodd +function solution(n) { + return move(1, 3, 2, n); +} +const move = (departure, destination, waypoint, numberOfPlate) => { + if (numberOfPlate === 1) return [[departure, destination]]; + return [ + ...move(departure, waypoint, destination, numberOfPlate - 1), + ...move(departure, destination, waypoint, 1), + ...move(waypoint, destination, departure, numberOfPlate - 1), + ]; +}; +//재귀를 생각해보기에 좋은 문제입니다. +//추천 레퍼런스 https://shoark7.github.io/programming/algorithm/tower-of-hanoi +/* +n개가 있다면 +1. 1->2로 n-1개를 옮김 +2. 1->3으로 가장 큰 1개를 옮김 +3. 2->1로 n-2개를 옮김 +4. 2->3으로 2번에 있는 것 중 가장 큰 1개를 옮김 +의 반복 + +결국 무엇이든 a -> b 로 n 를 옮기는 동작의 반복이므로 이를 재귀로 표현하면 됨. +a->b 로 n 을 옮기는 것은 a->c로 n-1개를 옮겨놓고, a->b로 하나를 옮긴 후, c->b로 n-1개를 옮기는 것의 반복 +함수에서 a는 depature(출발지), b는 destination(도착지), c는 waypoint(경유지)로 작성되어있음. +*/ From 32adc56c89210e29ca5075f49db88d60216f4929 Mon Sep 17 00:00:00 2001 From: codeisneverodd Date: Wed, 20 Jul 2022 10:30:40 +0900 Subject: [PATCH 02/17] =?UTF-8?q?solution:=20=EB=AA=A8=EC=9D=8C=EC=82=AC?= =?UTF-8?q?=EC=A0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\354\235\214-\354\202\254\354\240\204.js" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 "level-2/\353\252\250\354\235\214-\354\202\254\354\240\204.js" diff --git "a/level-2/\353\252\250\354\235\214-\354\202\254\354\240\204.js" "b/level-2/\353\252\250\354\235\214-\354\202\254\354\240\204.js" new file mode 100644 index 0000000..e1df7ce --- /dev/null +++ "b/level-2/\353\252\250\354\235\214-\354\202\254\354\240\204.js" @@ -0,0 +1,30 @@ +//https://github.com/codeisneverodd/programmers-coding-test +//완벽한 정답이 아닙니다. +//정답 1 - codeisneverodd +function solution(word) { + const alphabetRank = { A: 0, E: 1, I: 2, O: 3, U: 4 }; + const price = calculatePrice([1], 5); + return word + .split("") + .map((alphabet, index) => 1 + price[index] * alphabetRank[alphabet]) + .reduce((acc, curr) => acc + curr, 0); +} +const calculatePrice = (result = [1], targetLength) => { + if (result.length === targetLength) return result; + return calculatePrice([result[0] * 5 + 1, ...result], targetLength); +}; +/* +각 자리 문자를 바로 다음 문자로 바꾸는 데에 얼마의 비용이 들까? +4번째 자리 - 1 +3번째 자리 - 1*5 + 1 = 6 +2번째 자리 - 6*5 + 1 = 31 +1번째 자리 - 31*5 + 1 = 156 +0번째 자리 - 156*5 + 1 = 781 + +검증(1부터 시작하므로 1 + 비용) +I => (1 + 781 * 2) = 1563 +EIO => (1 + 781 * 1) + (1 + 156 * 2) + (1 + 31 * 3) = 1189 +AAAE => 1 + 1 + 1 + (1 + 6 * 1) = 10 +AAAAE => 1 + 1 + 1 + 1 + (1 + 1*1) = 6 +추천 레퍼런스: https://seongho96.tistory.com/50 +*/ From 876d450e090ae402c783a42285f28f2e9f540ba1 Mon Sep 17 00:00:00 2001 From: chaerin-dev Date: Tue, 19 Jul 2022 19:19:32 +0900 Subject: [PATCH 03/17] =?UTF-8?q?solution=20=EC=B2=B4=EC=9C=A1=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\354\262\264\354\234\241\353\263\265.js" | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git "a/level-1/\354\262\264\354\234\241\353\263\265.js" "b/level-1/\354\262\264\354\234\241\353\263\265.js" index 07e99b8..5baa4f6 100644 --- "a/level-1/\354\262\264\354\234\241\353\263\265.js" +++ "b/level-1/\354\262\264\354\234\241\353\263\265.js" @@ -88,3 +88,40 @@ function solution(n, lost, reserve) { //그리디 // lost 배열과 reserve 배열을 순회하여 체육복을 추가, 제거 해줍니다. // 그 후에 최종적으로 i부터 n까지 for문을 순회하며 i번쨰 학생과 i+1번째의 학생이 가진 체육복 수를 비교하여 빌려 줄 수 있는지, 빌려줄 수 없는지 확인 합니다. + +//정답 4 - chaerin-dev +function solution(n, lost, reserve) { + // 학생들의 체육복 개수를 저장할 배열 students + // 학생의 index가 1번부터 시작하므로 배열의 길이를 n+1로 설정 + // 0번 학생은 실제로는 없지만 초기값을 1로 설정하면 이후 연산에 영향을 미치지 않음 + const students = Array.from({ length: n + 1 }, () => 1); + + // 체육복 분실/여분 정보 students 배열에 반영 + lost.forEach((lostStudent) => students[lostStudent]--); + reserve.forEach((reserveStudent) => students[reserveStudent]++); + + // 체육복이 없어 체육 수업을 들을 수 없는 학생 수를 저장할 변수 cnt + let cnt = 0; + students.forEach((student, i) => { + // 현재 인덱스의 학생이 체육복이 없다면 + if (student === 0) { + // 바로 앞 학생이 체육복 여분이 있다면 + if (students[i - 1] === 2) { + // 바로 앞 학생에게 체육복 빌리기 + students[i - 1]--; + student++; + } + // 바로 앞 학생에게 체육복을 빌리지 못했고, 바로 뒤 학생이 체육복 여분이 있다면 + else if (students[i + 1] === 2) { + // 바로 뒤 학생에게 체육복 빌리기 + students[i + 1]--; + student++; + } + // 바로 앞 학생과 바로 뒤 학생 모두에게 체육복을 빌리지 못했다면 체육 수업을 들을 수 없음 + else cnt++; + } + }); + + // 체육 수업을 들을 수 있는 학생 수 = 전체 학생 수 - 체육 수업을 들을 수 없는 학생 수 + return n - cnt; +} \ No newline at end of file From 8127da5280544fe915bd1fb1820833a3ca1e6bcb Mon Sep 17 00:00:00 2001 From: chaerin-dev Date: Tue, 19 Jul 2022 19:20:49 +0900 Subject: [PATCH 04/17] =?UTF-8?q?solution=20=EB=AA=A8=EC=9D=98=EA=B3=A0?= =?UTF-8?q?=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\354\235\230\352\263\240\354\202\254.js" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git "a/level-1/\353\252\250\354\235\230\352\263\240\354\202\254.js" "b/level-1/\353\252\250\354\235\230\352\263\240\354\202\254.js" index 2e682d2..c91c3b1 100644 --- "a/level-1/\353\252\250\354\235\230\352\263\240\354\202\254.js" +++ "b/level-1/\353\252\250\354\235\230\352\263\240\354\202\254.js" @@ -108,4 +108,28 @@ function solution(answers) { if (score[i] === Math.max(...score)) answer.push(i+1) } return answer; +} + +//정답 5 - chaerin-dev +function solution(answers) { + const pattern = [ + [1, 2, 3, 4, 5], + [2, 1, 2, 3, 2, 4, 2, 5], + [3, 3, 1, 1, 2, 2, 4, 4, 5, 5], + ]; + const scores = [0, 0, 0]; + + answers.forEach((answer, i) => { + for (let j = 0; j < pattern.length; j++) { + const patternLength = pattern[j].length; + if (answer === pattern[j][i % patternLength]) scores[j]++; + } + }); + + const answer = []; + const maxScore = Math.max(...scores); + scores.forEach((score, i) => { + if (score === maxScore) answer.push(i + 1); + }); + return answer; } \ No newline at end of file From 80613455147aa2526f1c51ffd3a3e55bda7babef Mon Sep 17 00:00:00 2001 From: chaerin-dev Date: Tue, 19 Jul 2022 19:22:00 +0900 Subject: [PATCH 05/17] =?UTF-8?q?solution=20=EC=9C=84=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "level-2/\354\234\204\354\236\245.js" | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git "a/level-2/\354\234\204\354\236\245.js" "b/level-2/\354\234\204\354\236\245.js" index 01ff8ff..1466598 100644 --- "a/level-2/\354\234\204\354\236\245.js" +++ "b/level-2/\354\234\204\354\236\245.js" @@ -66,4 +66,24 @@ function solution(clothes) { 2. obj에 해당 키가 없으면 값을 1(옷을 입지 않은 경우)로 지정하고 1(옷의 개수)을 더해줌. 3. obj에 해당 키가 있으면 해당 키의 값을 불러오고 1을 더해줌. 4. for in 구문으로 obj의 키를 반복하여 불러오고 해당 값을 answer에 곱해줌 -5. 최소한 1가지 이상의 옷을 입기 떄문에 옷을 입지 않은 경우 -1로 제외. */ \ No newline at end of file +5. 최소한 1가지 이상의 옷을 입기 떄문에 옷을 입지 않은 경우 -1로 제외. */ + +//정답 5 - chaerin-dev +function solution(clothes) { + // 각 카테고리별 의상의 수를 clothsObj 객체에 저장 + const clothsObj = {}; + clothes.forEach((cloth) => + clothsObj[cloth[1]] ? clothsObj[cloth[1]]++ : (clothsObj[cloth[1]] = 1) + ); + + // 어떤 카테고리의 옷의 개수가 n개라면, 스파이는 해당 카테고리에 대해 n+1가지 선택권을 가짐 + // (옷을 입지 않거나, 1번 옷을 입거나, 2번 옷을 입거나, ..., n번 옷을 입거나) + // 즉, (각 카테고리의 옷의 개수 + 1)를 answer에 차례로 곱해주면 됨 + let answer = 1; + for (let key of Object.keys(clothsObj)) { + answer *= clothsObj[key] + 1; + } + + // 스파이는 하루에 최소 한 개의 의상은 입어야 하므로 아무것도 입지 않는 경우 빼기 + return answer - 1; +} \ No newline at end of file From 4fb5408572e7a957c20cf2e74100fd710fcc7af6 Mon Sep 17 00:00:00 2001 From: chaerin-dev Date: Tue, 19 Jul 2022 19:22:53 +0900 Subject: [PATCH 06/17] =?UTF-8?q?solution=20=ED=8A=9C=ED=94=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "level-2/\355\212\234\355\224\214.js" | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/level-2/\355\212\234\355\224\214.js" "b/level-2/\355\212\234\355\224\214.js" index bcde779..bcdce86 100644 --- "a/level-2/\355\212\234\355\224\214.js" +++ "b/level-2/\355\212\234\355\224\214.js" @@ -10,4 +10,24 @@ function solution(s) { .sort((a, b) => a.length - b.length) for (const set of sets) answer.push(...set.filter(x => !answer.includes(x))) return answer; +} + +//정답 2 - chaerin-dev +function solution(s) { + // 문자열 -> 정수 이차원 배열 + const sArr = s + .substring(2, s.length - 2) + .split("},{") + .map((e) => e.split(",").map((e) => parseInt(e))) + .sort((a, b) => a.length - b.length); + // 정답을 저장할 배열 + const answer = []; + // 이차원배열을 순회하며 직전 배열과 겹치지 않는 요소만 answer에 추가 + for (let i = 0; i < sArr.length; i++) { + for (let j = 0; j < sArr[i].length; j++) { + const temp = sArr[i][j]; + if (!answer.includes(sArr[i][j])) answer.push(sArr[i][j]); + } + } + return answer; } \ No newline at end of file From 1cbfe9279fd8f8363d60f3bfb8fb92123d811ae3 Mon Sep 17 00:00:00 2001 From: codeisneverodd Date: Wed, 20 Jul 2022 11:02:05 +0900 Subject: [PATCH 07/17] =?UTF-8?q?=EB=B8=8C=EB=9E=9C=EC=B9=98=20=ED=9D=90?= =?UTF-8?q?=EB=A6=84=20=EC=A0=95=EB=A6=AC=20(#71)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: 커밋 컨벤션 수정 및 contributor 추가 * Automatic Update README.md * fix: 오타 수정 * docs: 커밋 컨벤션 변경 및 리드미 디자인 수정 * docs: 풀이 완료시점 수정 * Automatic Update README.md * docs: PR 템플릿 추가 Co-authored-by: github-actions --- .github/workflows/PULL_REQUEST_TEMPLATE.md | 8 +++ .github/workflows/update-README.yml | 7 +- README.md | 76 ++++++++++++---------- package-lock.json | 22 ++++++- package.json | 3 +- utils/build.js | 76 ++++++++++++---------- 6 files changed, 114 insertions(+), 78 deletions(-) create mode 100644 .github/workflows/PULL_REQUEST_TEMPLATE.md diff --git a/.github/workflows/PULL_REQUEST_TEMPLATE.md b/.github/workflows/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..1a98a58 --- /dev/null +++ b/.github/workflows/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +## 새롭게 추가된 문제 풀이 + + + + +## 기존 풀이에 추가한 풀이 + +## 관련 이슈 diff --git a/.github/workflows/update-README.yml b/.github/workflows/update-README.yml index e3fbac5..b31a500 100644 --- a/.github/workflows/update-README.yml +++ b/.github/workflows/update-README.yml @@ -7,14 +7,13 @@ on: push: branches: - main - - cruelladevil-readme-test + - manage pull_request: branches: - main - - cruelladevil-readme-test + - manage jobs: build: - runs-on: ubuntu-latest steps: @@ -23,7 +22,7 @@ jobs: uses: actions/setup-node@v3 with: node-version: 16.14.0 - cache: 'npm' + cache: "npm" - name: install package run: npm install - name: build README.md diff --git a/README.md b/README.md index 92a506a..cb78099 100644 --- a/README.md +++ b/README.md @@ -16,27 +16,28 @@ ### 🧪 기능 구현 -| Main Contributors | Contribute Lists | About Me | -| ----------------------------------------------- | --------------------------- | -------- | -| [cruelladevil](https://github.com/cruelladevil) | - README 자동 업데이트 구현 | 🚧 | +| Main Contributors | +| ----------------------------------------------- | +| [cruelladevil](https://github.com/cruelladevil) | ### 🔥 문제 풀이 -| Main Contributors | Commits | About Me | -| --------------------------------------------------- | ------- | -------- | -| [codeisneverodd](https://github.com/codeisneverodd) | 🚧 | 🚧 | -| [chaerin-dev](https://github.com/chaerin-dev) | 🚧 | 🚧 | -| [jaewon1676](https://github.com/jaewon1676) | 🚧 | 🚧 | -| [prove-ability](https://github.com/prove-ability) | 🚧 | 🚧 | -| [yongchanson](https://github.com/yongchanson) | 🚧 | 🚧 | - -| Contributors | Commits | -| ------------------------------------------- | ------- | -| [createhb21](https://github.com/createhb21) | 🚧 | -| [le2sky](https://github.com/le2sky) | 🚧 | -| [ljw0096](https://github.com/ljw0096) | 🚧 | +| Main Contributors | +| --------------------------------------------------- | +| [codeisneverodd](https://github.com/codeisneverodd) | +| [chaerin-dev](https://github.com/chaerin-dev) | +| [jaewon1676](https://github.com/jaewon1676) | +| [prove-ability](https://github.com/prove-ability) | +| [yongchanson](https://github.com/yongchanson) | + +| Contributors | +| ------------------------------------------- | +| [createhb21](https://github.com/createhb21) | +| [le2sky](https://github.com/le2sky) | +| [ljw0096](https://github.com/ljw0096) | +| [minjongbaek](https://github.com/minjongbaek) | ### Level 1 ✅ @@ -106,7 +107,7 @@ - 전체 문제 수: 64문제 - 풀이 문제 수: 52문제 -- 풀이 완료 예상 시점: 2022년 4월 중 +- 풀이 완료 예상 시점: 2022년 7월 중 | 번호 | 문제 출처 | 풀이 | | --- | ------- | --- | @@ -167,7 +168,7 @@ - 전체 문제 수: 52문제 - 풀이 문제 수: 9문제 -- 풀이 완료 예상 시점: 2022년 8월 중 +- 풀이 완료 예상 시점: 2022년 10월 중 | 번호 | 문제 출처 | 풀이 | | --- | ------- | --- | @@ -203,24 +204,27 @@ ## 🙏🏻 아직 풀리지 않은 문제의 해답을 추가해 주세요! ### 커밋 컨벤션 -| 접두어 | 작업 내용 | -| ------- | -------------------------------------------------- | -| Create | 새로운 파일 생성 후 문제풀이 코드를 추가 할 경우 | -| Add | 기존 파일에 문제풀이 코드를 추가 할 경우 | -| Update | 파일의 기존 코드를 수정 할 경우 | -| Rename | 파일 혹은 폴더명을 수정하거나 옮기는 작업만일 경우 | -| Remove | 파일을 삭제하는 작업만 수행한 경우 | -| Comment | 주석 추가 및 수정의 경우 | - -### 추가 방법 - -1. 우측 상단의 Fork를 눌러 본인의 GitHub로 이동합니다. -2. Fork한 Repository를 `git clone 자신이-Fork한-자신의-Repository-주소` 를 통해 다운받습니다. -3. 해답을 해당하는 Level의 폴더에 `00-해답-예시.js`에 따라 생성합니다. 이때, **반드시 공백은`-` 바꾸어** 파일 이름을 짓습니다. -4. 자신이 Fork한 자신의 Repository에 push를 한 후, GitHub에서 Create pull request를 통해 기여합니다. -5. 해설은 검수자들의 확인이 끝나는대로 본 Repository에 반영됩니다. - -## 저작권 + +| 접두어 | 작업 내용 | +| -------- | ----------------------------------- | +| solution | 풀이 추가 | +| fix | 모든 종류의 오류 수정 | +| docs | 문서 수정(코드 수정 없음) | +| etc | 위의 경우에 해당하는 것이 없는 경우 | + +### 🌱 풀이 기여 방법 + +1. Fork 한 후 본인의 해설을 추가합니다. +2. 본인의 저장소에서 이곳으로 PR을 하면, 검토 및 코드리뷰 후 반영됩니다. + +### 🔥 기여 시 필수 사항 +1. 파일 이름은 공백이 없어야하며, 공백은 - 로 채웁니다.(문제풀이 창에서 문제 이름을 복사하여 사용하는 것을 권장드립니다 + +예시) 가장 먼 노드 => 가장-먼-노드.js // [1차] 뉴스 클러스터링 => [1차]-뉴스-클러스터링 + +2. 풀이를 추가할 시 반드시 주석을 작성하여야합니다. 기존 파일에 추가할 때는, 기존 해설들의 주석을. 새롭게 파일을 생성하실 때는 00-해답-예시.js 를 참고하시면 됩니다. + +## 👉 저작권 해당 Repository의 해답을 자신의 저작물에 추가할 수 있지만 **반드시** 본 Repository의 주소 `https://github.com/codeisneverodd/programmers-coding-test` diff --git a/package-lock.json b/package-lock.json index 231da30..9858c59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "MIT", "dependencies": { "cheerio": "^1.0.0-rc.10", - "node-fetch": "^3.2.3" + "node-fetch": "^3.2.3", + "prettier": "^2.7.1" } }, "node_modules/boolbase": { @@ -256,6 +257,20 @@ "parse5": "^6.0.1" } }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", @@ -426,6 +441,11 @@ "parse5": "^6.0.1" } }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" + }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", diff --git a/package.json b/package.json index 1eb001e..3c04800 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "homepage": "https://github.com/codeisneverodd/programmers-coding-test#readme", "dependencies": { "cheerio": "^1.0.0-rc.10", - "node-fetch": "^3.2.3" + "node-fetch": "^3.2.3", + "prettier": "^2.7.1" } } diff --git a/utils/build.js b/utils/build.js index 5c42d23..099fe20 100644 --- a/utils/build.js +++ b/utils/build.js @@ -22,27 +22,28 @@ const updateData = `# 프로그래머스 모든 문제 풀이 ### 🧪 기능 구현 -| Main Contributors | Contribute Lists | About Me | -| ----------------------------------------------- | --------------------------- | -------- | -| [cruelladevil](https://github.com/cruelladevil) | - README 자동 업데이트 구현 | 🚧 | +| Main Contributors | +| ----------------------------------------------- | +| [cruelladevil](https://github.com/cruelladevil) | ### 🔥 문제 풀이 -| Main Contributors | Commits | About Me | -| --------------------------------------------------- | ------- | -------- | -| [codeisneverodd](https://github.com/codeisneverodd) | 🚧 | 🚧 | -| [chaerin-dev](https://github.com/chaerin-dev) | 🚧 | 🚧 | -| [jaewon1676](https://github.com/jaewon1676) | 🚧 | 🚧 | -| [prove-ability](https://github.com/prove-ability) | 🚧 | 🚧 | -| [yongchanson](https://github.com/yongchanson) | 🚧 | 🚧 | - -| Contributors | Commits | -| ------------------------------------------- | ------- | -| [createhb21](https://github.com/createhb21) | 🚧 | -| [le2sky](https://github.com/le2sky) | 🚧 | -| [ljw0096](https://github.com/ljw0096) | 🚧 | +| Main Contributors | +| --------------------------------------------------- | +| [codeisneverodd](https://github.com/codeisneverodd) | +| [chaerin-dev](https://github.com/chaerin-dev) | +| [jaewon1676](https://github.com/jaewon1676) | +| [prove-ability](https://github.com/prove-ability) | +| [yongchanson](https://github.com/yongchanson) | + +| Contributors | +| ------------------------------------------- | +| [createhb21](https://github.com/createhb21) | +| [le2sky](https://github.com/le2sky) | +| [ljw0096](https://github.com/ljw0096) | +| [minjongbaek](https://github.com/minjongbaek) | ### Level 1 ✅ @@ -58,7 +59,7 @@ ${getTableStr(1)} - 전체 문제 수: 64문제 - 풀이 문제 수: ${getInfoList(2).length}문제 -- 풀이 완료 예상 시점: 2022년 4월 중 +- 풀이 완료 예상 시점: 2022년 7월 중 | 번호 | 문제 출처 | 풀이 | | --- | ------- | --- | @@ -68,7 +69,7 @@ ${getTableStr(2)} - 전체 문제 수: 52문제 - 풀이 문제 수: ${getInfoList(3).length}문제 -- 풀이 완료 예상 시점: 2022년 8월 중 +- 풀이 완료 예상 시점: 2022년 10월 중 | 번호 | 문제 출처 | 풀이 | | --- | ------- | --- | @@ -96,24 +97,27 @@ ${getTableStr(5)} ## 🙏🏻 아직 풀리지 않은 문제의 해답을 추가해 주세요! ### 커밋 컨벤션 -| 접두어 | 작업 내용 | -| ------- | -------------------------------------------------- | -| Create | 새로운 파일 생성 후 문제풀이 코드를 추가 할 경우 | -| Add | 기존 파일에 문제풀이 코드를 추가 할 경우 | -| Update | 파일의 기존 코드를 수정 할 경우 | -| Rename | 파일 혹은 폴더명을 수정하거나 옮기는 작업만일 경우 | -| Remove | 파일을 삭제하는 작업만 수행한 경우 | -| Comment | 주석 추가 및 수정의 경우 | - -### 추가 방법 - -1. 우측 상단의 Fork를 눌러 본인의 GitHub로 이동합니다. -2. Fork한 Repository를 \`git clone 자신이-Fork한-자신의-Repository-주소\` 를 통해 다운받습니다. -3. 해답을 해당하는 Level의 폴더에 \`00-해답-예시.js\`에 따라 생성합니다. 이때, **반드시 공백은\`-\` 바꾸어** 파일 이름을 짓습니다. -4. 자신이 Fork한 자신의 Repository에 push를 한 후, GitHub에서 Create pull request를 통해 기여합니다. -5. 해설은 검수자들의 확인이 끝나는대로 본 Repository에 반영됩니다. - -## 저작권 + +| 접두어 | 작업 내용 | +| -------- | ----------------------------------- | +| solution | 풀이 추가 | +| fix | 모든 종류의 오류 수정 | +| docs | 문서 수정(코드 수정 없음) | +| etc | 위의 경우에 해당하는 것이 없는 경우 | + +### 🌱 풀이 기여 방법 + +1. Fork 한 후 본인의 해설을 추가합니다. +2. 본인의 저장소에서 이곳으로 PR을 하면, 검토 및 코드리뷰 후 반영됩니다. + +### 🔥 기여 시 필수 사항 +1. 파일 이름은 공백이 없어야하며, 공백은 - 로 채웁니다.(문제풀이 창에서 문제 이름을 복사하여 사용하는 것을 권장드립니다 + +예시) 가장 먼 노드 => 가장-먼-노드.js // [1차] 뉴스 클러스터링 => [1차]-뉴스-클러스터링 + +2. 풀이를 추가할 시 반드시 주석을 작성하여야합니다. 기존 파일에 추가할 때는, 기존 해설들의 주석을. 새롭게 파일을 생성하실 때는 00-해답-예시.js 를 참고하시면 됩니다. + +## 👉 저작권 해당 Repository의 해답을 자신의 저작물에 추가할 수 있지만 **반드시** 본 Repository의 주소 \`https://github.com/codeisneverodd/programmers-coding-test\` From 4440efc51b7727017ae830a2b4663caa1d7e76f5 Mon Sep 17 00:00:00 2001 From: codeisneverodd Date: Fri, 22 Jul 2022 13:53:35 +0900 Subject: [PATCH 08/17] =?UTF-8?q?fix:=20base=20url=20=ED=95=AB=ED=94=BD?= =?UTF-8?q?=EC=8A=A4=20(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: 커밋 컨벤션 수정 및 contributor 추가 * Automatic Update README.md * fix: 오타 수정 * docs: 커밋 컨벤션 변경 및 리드미 디자인 수정 * docs: 풀이 완료시점 수정 * Automatic Update README.md * docs: PR 템플릿 추가 * fix: 링크 base url 수정 (#73) * Automatic Update README.md Co-authored-by: github-actions --- README.md | 234 ++++++++++++++++++++++++------------------------ utils/string.js | 36 ++++---- 2 files changed, 135 insertions(+), 135 deletions(-) diff --git a/README.md b/README.md index cb78099..fc79d7f 100644 --- a/README.md +++ b/README.md @@ -47,61 +47,61 @@ | 번호 | 문제 출처 | 풀이 | | --- | ------- | --- | -| 1 | [2016년](/learn/courses/30/lessons/12901) | [2016년.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/2016년.js) | -| 2 | [3진법 뒤집기](/learn/courses/30/lessons/68935) | [3진법-뒤집기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/3진법-뒤집기.js) | -| 3 | [K번째수](/learn/courses/30/lessons/42748) | [K번째수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/K번째수.js) | -| 4 | [[1차] 다트 게임](/learn/courses/30/lessons/17682) | [[1차]-다트-게임.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/[1차]-다트-게임.js) | -| 5 | [[1차] 비밀지도](/learn/courses/30/lessons/17681) | [[1차]-비밀지도.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/[1차]-비밀지도.js) | -| 6 | [x만큼 간격이 있는 n개의 숫자](/learn/courses/30/lessons/12954) | [x만큼-간격이-있는-n개의-숫자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/x만큼-간격이-있는-n개의-숫자.js) | -| 7 | [가운데 글자 가져오기](/learn/courses/30/lessons/12903) | [가운데-글자-가져오기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/가운데-글자-가져오기.js) | -| 8 | [같은 숫자는 싫어](/learn/courses/30/lessons/12906) | [같은-숫자는-싫어.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/같은-숫자는-싫어.js) | -| 9 | [나누어 떨어지는 숫자 배열](/learn/courses/30/lessons/12910) | [나누어-떨어지는-숫자-배열.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/나누어-떨어지는-숫자-배열.js) | -| 10 | [나머지가 1이 되는 수 찾기](/learn/courses/30/lessons/87389) | [나머지가-1이-되는-수-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/나머지가-1이-되는-수-찾기.js) | -| 11 | [내적](/learn/courses/30/lessons/70128) | [내적.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/내적.js) | -| 12 | [두 개 뽑아서 더하기](/learn/courses/30/lessons/68644) | [두-개-뽑아서-더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/두-개-뽑아서-더하기.js) | -| 13 | [두 정수 사이의 합](/learn/courses/30/lessons/12912) | [두-정수-사이의-합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/두-정수-사이의-합.js) | -| 14 | [로또의 최고 순위와 최저 순위](/learn/courses/30/lessons/77484) | [로또의-최고-순위와-최저-순위.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/로또의-최고-순위와-최저-순위.js) | -| 15 | [모의고사](/learn/courses/30/lessons/42840) | [모의고사.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/모의고사.js) | -| 16 | [문자열 내 p와 y의 개수](/learn/courses/30/lessons/12916) | [문자열-내-p와-y의-개수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-내-p와-y의-개수.js) | -| 17 | [문자열 내 마음대로 정렬하기](/learn/courses/30/lessons/12915) | [문자열-내-마음대로-정렬하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-내-마음대로-정렬하기.js) | -| 18 | [문자열 내림차순으로 배치하기](/learn/courses/30/lessons/12917) | [문자열-내림차순으로-배치하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-내림차순으로-배치하기.js) | -| 19 | [문자열 다루기 기본](/learn/courses/30/lessons/12918) | [문자열-다루기-기본.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-다루기-기본.js) | -| 20 | [문자열을 정수로 바꾸기](/learn/courses/30/lessons/12925) | [문자열을-정수로-바꾸기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열을-정수로-바꾸기.js) | -| 21 | [부족한 금액 계산하기](/learn/courses/30/lessons/82612) | [부족한-금액-계산하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/부족한-금액-계산하기.js) | -| 22 | [서울에서 김서방 찾기](/learn/courses/30/lessons/12919) | [서울에서-김서방-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/서울에서-김서방-찾기.js) | -| 23 | [소수 만들기](/learn/courses/30/lessons/12977) | [소수-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/소수-만들기.js) | -| 24 | [소수 찾기](/learn/courses/30/lessons/42839) | [소수-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/소수-찾기.js) | -| 25 | [수박수박수박수박수박수?](/learn/courses/30/lessons/12922) | [수박수박수박수박수박수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/수박수박수박수박수박수.js) | -| 26 | [숫자 문자열과 영단어](/learn/courses/30/lessons/81301) | [숫자-문자열과-영단어.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/숫자-문자열과-영단어.js) | -| 27 | [시저 암호](/learn/courses/30/lessons/12926) | [시저-암호.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/시저-암호.js) | -| 28 | [신고 결과 받기](/learn/courses/30/lessons/92334) | [신고-결과-받기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/신고-결과-받기.js) | -| 29 | [신규 아이디 추천](/learn/courses/30/lessons/72410) | [신규-아이디-추천.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/신규-아이디-추천.js) | -| 30 | [실패율](/learn/courses/30/lessons/42889) | [실패율.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/실패율.js) | -| 31 | [약수의 개수와 덧셈](/learn/courses/30/lessons/77884) | [약수의-개수와-덧셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/약수의-개수와-덧셈.js) | -| 32 | [약수의 합](/learn/courses/30/lessons/12928) | [약수의-합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/약수의-합.js) | -| 33 | [없는 숫자 더하기](/learn/courses/30/lessons/86051) | [없는-숫자-더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/없는-숫자-더하기.js) | -| 34 | [예산](/learn/courses/30/lessons/12982) | [예산.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/예산.js) | -| 35 | [완주하지 못한 선수](/learn/courses/30/lessons/42576) | [완주하지-못한-선수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/완주하지-못한-선수.js) | -| 36 | [음양 더하기](/learn/courses/30/lessons/76501) | [음양-더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/음양-더하기.js) | -| 37 | [이상한 문자 만들기](/learn/courses/30/lessons/12930) | [이상한-문자-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/이상한-문자-만들기.js) | -| 38 | [자릿수 더하기](/learn/courses/30/lessons/12931) | [자릿수-더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/자릿수-더하기.js) | -| 39 | [자연수 뒤집어 배열로 만들기](/learn/courses/30/lessons/12932) | [자연수-뒤집어-배열로-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/자연수-뒤집어-배열로-만들기.js) | -| 40 | [정수 내림차순으로 배치하기](/learn/courses/30/lessons/12933) | [정수-내림차순으로-배치하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/정수-내림차순으로-배치하기.js) | -| 41 | [정수 제곱근 판별](/learn/courses/30/lessons/12934) | [정수-제곱근-판별.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/정수-제곱근-판별.js) | -| 42 | [제일 작은 수 제거하기](/learn/courses/30/lessons/12935) | [제일-작은-수-제거하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/제일-작은-수-제거하기.js) | -| 43 | [직사각형 별찍기](/learn/courses/30/lessons/12969) | [직사각형-별찍기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/직사각형-별찍기.js) | -| 44 | [짝수와 홀수](/learn/courses/30/lessons/12937) | [짝수와-홀수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/짝수와-홀수.js) | -| 45 | [체육복](/learn/courses/30/lessons/42862) | [체육복.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/체육복.js) | -| 46 | [최대공약수와 최소공배수](/learn/courses/30/lessons/12940) | [최대공약수와-최소공배수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/최대공약수와-최소공배수.js) | -| 47 | [최소직사각형](/learn/courses/30/lessons/86491) | [최소직사각형.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/최소직사각형.js) | -| 48 | [콜라츠 추측](/learn/courses/30/lessons/12943) | [콜라츠-추측.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/콜라츠-추측.js) | -| 49 | [크레인 인형뽑기 게임](/learn/courses/30/lessons/64061) | [크레인-인형뽑기-게임.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/크레인-인형뽑기-게임.js) | -| 50 | [키패드 누르기](/learn/courses/30/lessons/67256) | [키패드-누르기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/키패드-누르기.js) | -| 51 | [평균 구하기](/learn/courses/30/lessons/12944) | [평균-구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/평균-구하기.js) | -| 52 | [폰켓몬](/learn/courses/30/lessons/1845) | [폰켓몬.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/폰켓몬.js) | -| 53 | [하샤드 수](/learn/courses/30/lessons/12947) | [하샤드-수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/하샤드-수.js) | -| 54 | [핸드폰 번호 가리기](/learn/courses/30/lessons/12948) | [핸드폰-번호-가리기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/핸드폰-번호-가리기.js) | -| 55 | [행렬의 덧셈](/learn/courses/30/lessons/12950) | [행렬의-덧셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/행렬의-덧셈.js) | +| 1 | [2016년](https://school.programmers.co.kr//learn/courses/30/lessons/12901) | [2016년.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/2016년.js) | +| 2 | [3진법 뒤집기](https://school.programmers.co.kr//learn/courses/30/lessons/68935) | [3진법-뒤집기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/3진법-뒤집기.js) | +| 3 | [K번째수](https://school.programmers.co.kr//learn/courses/30/lessons/42748) | [K번째수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/K번째수.js) | +| 4 | [[1차] 다트 게임](https://school.programmers.co.kr//learn/courses/30/lessons/17682) | [[1차]-다트-게임.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/[1차]-다트-게임.js) | +| 5 | [[1차] 비밀지도](https://school.programmers.co.kr//learn/courses/30/lessons/17681) | [[1차]-비밀지도.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/[1차]-비밀지도.js) | +| 6 | [x만큼 간격이 있는 n개의 숫자](https://school.programmers.co.kr//learn/courses/30/lessons/12954) | [x만큼-간격이-있는-n개의-숫자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/x만큼-간격이-있는-n개의-숫자.js) | +| 7 | [가운데 글자 가져오기](https://school.programmers.co.kr//learn/courses/30/lessons/12903) | [가운데-글자-가져오기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/가운데-글자-가져오기.js) | +| 8 | [같은 숫자는 싫어](https://school.programmers.co.kr//learn/courses/30/lessons/12906) | [같은-숫자는-싫어.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/같은-숫자는-싫어.js) | +| 9 | [나누어 떨어지는 숫자 배열](https://school.programmers.co.kr//learn/courses/30/lessons/12910) | [나누어-떨어지는-숫자-배열.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/나누어-떨어지는-숫자-배열.js) | +| 10 | [나머지가 1이 되는 수 찾기](https://school.programmers.co.kr//learn/courses/30/lessons/87389) | [나머지가-1이-되는-수-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/나머지가-1이-되는-수-찾기.js) | +| 11 | [내적](https://school.programmers.co.kr//learn/courses/30/lessons/70128) | [내적.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/내적.js) | +| 12 | [두 개 뽑아서 더하기](https://school.programmers.co.kr//learn/courses/30/lessons/68644) | [두-개-뽑아서-더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/두-개-뽑아서-더하기.js) | +| 13 | [두 정수 사이의 합](https://school.programmers.co.kr//learn/courses/30/lessons/12912) | [두-정수-사이의-합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/두-정수-사이의-합.js) | +| 14 | [로또의 최고 순위와 최저 순위](https://school.programmers.co.kr//learn/courses/30/lessons/77484) | [로또의-최고-순위와-최저-순위.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/로또의-최고-순위와-최저-순위.js) | +| 15 | [모의고사](https://school.programmers.co.kr//learn/courses/30/lessons/42840) | [모의고사.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/모의고사.js) | +| 16 | [문자열 내 p와 y의 개수](https://school.programmers.co.kr//learn/courses/30/lessons/12916) | [문자열-내-p와-y의-개수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-내-p와-y의-개수.js) | +| 17 | [문자열 내 마음대로 정렬하기](https://school.programmers.co.kr//learn/courses/30/lessons/12915) | [문자열-내-마음대로-정렬하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-내-마음대로-정렬하기.js) | +| 18 | [문자열 내림차순으로 배치하기](https://school.programmers.co.kr//learn/courses/30/lessons/12917) | [문자열-내림차순으로-배치하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-내림차순으로-배치하기.js) | +| 19 | [문자열 다루기 기본](https://school.programmers.co.kr//learn/courses/30/lessons/12918) | [문자열-다루기-기본.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-다루기-기본.js) | +| 20 | [문자열을 정수로 바꾸기](https://school.programmers.co.kr//learn/courses/30/lessons/12925) | [문자열을-정수로-바꾸기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열을-정수로-바꾸기.js) | +| 21 | [부족한 금액 계산하기](https://school.programmers.co.kr//learn/courses/30/lessons/82612) | [부족한-금액-계산하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/부족한-금액-계산하기.js) | +| 22 | [서울에서 김서방 찾기](https://school.programmers.co.kr//learn/courses/30/lessons/12919) | [서울에서-김서방-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/서울에서-김서방-찾기.js) | +| 23 | [소수 만들기](https://school.programmers.co.kr//learn/courses/30/lessons/12977) | [소수-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/소수-만들기.js) | +| 24 | [소수 찾기](https://school.programmers.co.kr//learn/courses/30/lessons/42839) | [소수-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/소수-찾기.js) | +| 25 | [수박수박수박수박수박수?](https://school.programmers.co.kr//learn/courses/30/lessons/12922) | [수박수박수박수박수박수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/수박수박수박수박수박수.js) | +| 26 | [숫자 문자열과 영단어](https://school.programmers.co.kr//learn/courses/30/lessons/81301) | [숫자-문자열과-영단어.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/숫자-문자열과-영단어.js) | +| 27 | [시저 암호](https://school.programmers.co.kr//learn/courses/30/lessons/12926) | [시저-암호.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/시저-암호.js) | +| 28 | [신고 결과 받기](https://school.programmers.co.kr//learn/courses/30/lessons/92334) | [신고-결과-받기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/신고-결과-받기.js) | +| 29 | [신규 아이디 추천](https://school.programmers.co.kr//learn/courses/30/lessons/72410) | [신규-아이디-추천.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/신규-아이디-추천.js) | +| 30 | [실패율](https://school.programmers.co.kr//learn/courses/30/lessons/42889) | [실패율.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/실패율.js) | +| 31 | [약수의 개수와 덧셈](https://school.programmers.co.kr//learn/courses/30/lessons/77884) | [약수의-개수와-덧셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/약수의-개수와-덧셈.js) | +| 32 | [약수의 합](https://school.programmers.co.kr//learn/courses/30/lessons/12928) | [약수의-합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/약수의-합.js) | +| 33 | [없는 숫자 더하기](https://school.programmers.co.kr//learn/courses/30/lessons/86051) | [없는-숫자-더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/없는-숫자-더하기.js) | +| 34 | [예산](https://school.programmers.co.kr//learn/courses/30/lessons/12982) | [예산.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/예산.js) | +| 35 | [완주하지 못한 선수](https://school.programmers.co.kr//learn/courses/30/lessons/42576) | [완주하지-못한-선수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/완주하지-못한-선수.js) | +| 36 | [음양 더하기](https://school.programmers.co.kr//learn/courses/30/lessons/76501) | [음양-더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/음양-더하기.js) | +| 37 | [이상한 문자 만들기](https://school.programmers.co.kr//learn/courses/30/lessons/12930) | [이상한-문자-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/이상한-문자-만들기.js) | +| 38 | [자릿수 더하기](https://school.programmers.co.kr//learn/courses/30/lessons/12931) | [자릿수-더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/자릿수-더하기.js) | +| 39 | [자연수 뒤집어 배열로 만들기](https://school.programmers.co.kr//learn/courses/30/lessons/12932) | [자연수-뒤집어-배열로-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/자연수-뒤집어-배열로-만들기.js) | +| 40 | [정수 내림차순으로 배치하기](https://school.programmers.co.kr//learn/courses/30/lessons/12933) | [정수-내림차순으로-배치하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/정수-내림차순으로-배치하기.js) | +| 41 | [정수 제곱근 판별](https://school.programmers.co.kr//learn/courses/30/lessons/12934) | [정수-제곱근-판별.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/정수-제곱근-판별.js) | +| 42 | [제일 작은 수 제거하기](https://school.programmers.co.kr//learn/courses/30/lessons/12935) | [제일-작은-수-제거하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/제일-작은-수-제거하기.js) | +| 43 | [직사각형 별찍기](https://school.programmers.co.kr//learn/courses/30/lessons/12969) | [직사각형-별찍기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/직사각형-별찍기.js) | +| 44 | [짝수와 홀수](https://school.programmers.co.kr//learn/courses/30/lessons/12937) | [짝수와-홀수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/짝수와-홀수.js) | +| 45 | [체육복](https://school.programmers.co.kr//learn/courses/30/lessons/42862) | [체육복.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/체육복.js) | +| 46 | [최대공약수와 최소공배수](https://school.programmers.co.kr//learn/courses/30/lessons/12940) | [최대공약수와-최소공배수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/최대공약수와-최소공배수.js) | +| 47 | [최소직사각형](https://school.programmers.co.kr//learn/courses/30/lessons/86491) | [최소직사각형.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/최소직사각형.js) | +| 48 | [콜라츠 추측](https://school.programmers.co.kr//learn/courses/30/lessons/12943) | [콜라츠-추측.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/콜라츠-추측.js) | +| 49 | [크레인 인형뽑기 게임](https://school.programmers.co.kr//learn/courses/30/lessons/64061) | [크레인-인형뽑기-게임.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/크레인-인형뽑기-게임.js) | +| 50 | [키패드 누르기](https://school.programmers.co.kr//learn/courses/30/lessons/67256) | [키패드-누르기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/키패드-누르기.js) | +| 51 | [평균 구하기](https://school.programmers.co.kr//learn/courses/30/lessons/12944) | [평균-구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/평균-구하기.js) | +| 52 | [폰켓몬](https://school.programmers.co.kr//learn/courses/30/lessons/1845) | [폰켓몬.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/폰켓몬.js) | +| 53 | [하샤드 수](https://school.programmers.co.kr//learn/courses/30/lessons/12947) | [하샤드-수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/하샤드-수.js) | +| 54 | [핸드폰 번호 가리기](https://school.programmers.co.kr//learn/courses/30/lessons/12948) | [핸드폰-번호-가리기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/핸드폰-번호-가리기.js) | +| 55 | [행렬의 덧셈](https://school.programmers.co.kr//learn/courses/30/lessons/12950) | [행렬의-덧셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/행렬의-덧셈.js) | ### Level 2 👨🏻‍💻(풀이 중..) @@ -111,58 +111,58 @@ | 번호 | 문제 출처 | 풀이 | | --- | ------- | --- | -| 1 | [124 나라의 숫자](/learn/courses/30/lessons/12899) | [124-나라의-숫자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/124-나라의-숫자.js) | -| 2 | [2개 이하로 다른 비트](/learn/courses/30/lessons/77885) | [2개-이하로-다른-비트.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/2개-이하로-다른-비트.js) | -| 3 | [H-Index](/learn/courses/30/lessons/42747) | [H-Index.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/H-Index.js) | -| 4 | [JadenCase 문자열 만들기](/learn/courses/30/lessons/12951) | [JadenCase-문자열-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/JadenCase-문자열-만들기.js) | -| 5 | [N개의 최소공배수](/learn/courses/30/lessons/12953) | [N개의-최소공배수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/N개의-최소공배수.js) | -| 6 | [[1차] 뉴스 클러스터링](/learn/courses/30/lessons/17677) | [[1차]-뉴스-클러스터링.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[1차]-뉴스-클러스터링.js) | -| 7 | [[1차] 캐시](/learn/courses/30/lessons/17680) | [[1차]-캐시.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[1차]-캐시.js) | -| 8 | [[3차] n진수 게임](/learn/courses/30/lessons/17687) | [[3차]-n진수-게임.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[3차]-n진수-게임.js) | -| 9 | [[3차] 방금그곡](/learn/courses/30/lessons/17683) | [[3차]-방금그곡.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[3차]-방금그곡.js) | -| 10 | [[3차] 파일명 정렬](/learn/courses/30/lessons/17686) | [[3차]-파일명-정렬.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[3차]-파일명-정렬.js) | -| 11 | [k진수에서 소수 개수 구하기](/learn/courses/30/lessons/92335) | [k진수에서-소수-개수-구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/k진수에서-소수-개수-구하기.js) | -| 12 | [n^2 배열 자르기](/learn/courses/30/lessons/87390) | [n^2-배열-자르기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/n^2-배열-자르기.js) | -| 13 | [가장 큰 수](/learn/courses/30/lessons/42746) | [가장-큰-수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/가장-큰-수.js) | -| 14 | [가장 큰 정사각형 찾기](/learn/courses/30/lessons/12905) | [가장-큰-정사각형-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/가장-큰-정사각형-찾기.js) | -| 15 | [거리두기 확인하기](/learn/courses/30/lessons/81302) | [거리두기-확인하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/거리두기-확인하기.js) | -| 16 | [게임 맵 최단거리](/learn/courses/30/lessons/1844) | [게임-맵-최단거리.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/게임-맵-최단거리.js) | -| 17 | [괄호 변환](/learn/courses/30/lessons/60058) | [괄호-변환.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/괄호-변환.js) | -| 18 | [괄호 회전하기](/learn/courses/30/lessons/76502) | [괄호-회전하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/괄호-회전하기.js) | -| 19 | [구명보트](/learn/courses/30/lessons/42885) | [구명보트.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/구명보트.js) | -| 20 | [기능개발](/learn/courses/30/lessons/42586) | [기능개발.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/기능개발.js) | -| 21 | [다리를 지나는 트럭](/learn/courses/30/lessons/42583) | [다리를-지나는-트럭.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/다리를-지나는-트럭.js) | -| 22 | [다음 큰 숫자](/learn/courses/30/lessons/12911) | [다음-큰-숫자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/다음-큰-숫자.js) | -| 23 | [땅따먹기](/learn/courses/30/lessons/12913) | [땅따먹기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/땅따먹기.js) | -| 24 | [멀쩡한 사각형](/learn/courses/30/lessons/62048) | [멀쩡한-사각형.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/멀쩡한-사각형.js) | -| 25 | [메뉴 리뉴얼](/learn/courses/30/lessons/72411) | [메뉴-리뉴얼.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/메뉴-리뉴얼.js) | -| 26 | [문자열 압축](/learn/courses/30/lessons/60057) | [문자열-압축.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/문자열-압축.js) | -| 27 | [빛의 경로 사이클](/learn/courses/30/lessons/86052) | [빛의-경로-사이클.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/빛의-경로-사이클.js) | -| 28 | [삼각 달팽이](/learn/courses/30/lessons/68645) | [삼각-달팽이.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/삼각-달팽이.js) | -| 29 | [소수 찾기](/learn/courses/30/lessons/42839) | [소수-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/소수-찾기.js) | -| 30 | [수식 최대화](/learn/courses/30/lessons/67257) | [수식-최대화.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/수식-최대화.js) | -| 31 | [숫자의 표현](/learn/courses/30/lessons/12924) | [숫자의-표현.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/숫자의-표현.js) | -| 32 | [스킬트리](/learn/courses/30/lessons/49993) | [스킬트리.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/스킬트리.js) | -| 33 | [영어 끝말잇기](/learn/courses/30/lessons/12981) | [영어-끝말잇기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/영어-끝말잇기.js) | -| 34 | [예상 대진표](/learn/courses/30/lessons/12985) | [예상-대진표.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/예상-대진표.js) | -| 35 | [오픈채팅방 ](/learn/courses/30/lessons/42888) | [오픈채팅방.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/오픈채팅방.js) | -| 36 | [올바른 괄호](/learn/courses/30/lessons/12909) | [올바른-괄호.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/올바른-괄호.js) | -| 37 | [위장](/learn/courses/30/lessons/42578) | [위장.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/위장.js) | -| 38 | [점프와 순간 이동](/learn/courses/30/lessons/12980) | [점프와-순간-이동.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/점프와-순간-이동.js) | -| 39 | [조이스틱](/learn/courses/30/lessons/42860) | [조이스틱.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/조이스틱.js) | -| 40 | [주차 요금 계산](/learn/courses/30/lessons/92341) | [주차-요금-계산.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/주차-요금-계산.js) | -| 41 | [짝지어 제거하기](/learn/courses/30/lessons/12973) | [짝지어-제거하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/짝지어-제거하기.js) | -| 42 | [최댓값과 최솟값](/learn/courses/30/lessons/12939) | [최댓값과-최솟값.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/최댓값과-최솟값.js) | -| 43 | [최솟값 만들기](/learn/courses/30/lessons/12941) | [최솟값-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/최솟값-만들기.js) | -| 44 | [카펫](/learn/courses/30/lessons/42842) | [카펫.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/카펫.js) | -| 45 | [큰 수 만들기](/learn/courses/30/lessons/42883) | [큰-수-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/큰-수-만들기.js) | -| 46 | [타겟 넘버](/learn/courses/30/lessons/43165) | [타겟-넘버.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/타겟-넘버.js) | -| 47 | [튜플](/learn/courses/30/lessons/64065) | [튜플.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/튜플.js) | -| 48 | [프린터](/learn/courses/30/lessons/42587) | [프린터.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/프린터.js) | -| 49 | [피보나치 수](/learn/courses/30/lessons/12945) | [피보나치-수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/피보나치-수.js) | -| 50 | [행렬 테두리 회전하기](/learn/courses/30/lessons/77485) | [행렬-테두리-회전하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/행렬-테두리-회전하기.js) | -| 51 | [행렬의 곱셈](/learn/courses/30/lessons/12949) | [행렬의-곱셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/행렬의-곱셈.js) | -| 52 | [후보키](/learn/courses/30/lessons/42890) | [후보키.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/후보키.js) | +| 1 | [124 나라의 숫자](https://school.programmers.co.kr//learn/courses/30/lessons/12899) | [124-나라의-숫자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/124-나라의-숫자.js) | +| 2 | [2개 이하로 다른 비트](https://school.programmers.co.kr//learn/courses/30/lessons/77885) | [2개-이하로-다른-비트.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/2개-이하로-다른-비트.js) | +| 3 | [H-Index](https://school.programmers.co.kr//learn/courses/30/lessons/42747) | [H-Index.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/H-Index.js) | +| 4 | [JadenCase 문자열 만들기](https://school.programmers.co.kr//learn/courses/30/lessons/12951) | [JadenCase-문자열-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/JadenCase-문자열-만들기.js) | +| 5 | [N개의 최소공배수](https://school.programmers.co.kr//learn/courses/30/lessons/12953) | [N개의-최소공배수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/N개의-최소공배수.js) | +| 6 | [[1차] 뉴스 클러스터링](https://school.programmers.co.kr//learn/courses/30/lessons/17677) | [[1차]-뉴스-클러스터링.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[1차]-뉴스-클러스터링.js) | +| 7 | [[1차] 캐시](https://school.programmers.co.kr//learn/courses/30/lessons/17680) | [[1차]-캐시.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[1차]-캐시.js) | +| 8 | [[3차] n진수 게임](https://school.programmers.co.kr//learn/courses/30/lessons/17687) | [[3차]-n진수-게임.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[3차]-n진수-게임.js) | +| 9 | [[3차] 방금그곡](https://school.programmers.co.kr//learn/courses/30/lessons/17683) | [[3차]-방금그곡.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[3차]-방금그곡.js) | +| 10 | [[3차] 파일명 정렬](https://school.programmers.co.kr//learn/courses/30/lessons/17686) | [[3차]-파일명-정렬.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[3차]-파일명-정렬.js) | +| 11 | [k진수에서 소수 개수 구하기](https://school.programmers.co.kr//learn/courses/30/lessons/92335) | [k진수에서-소수-개수-구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/k진수에서-소수-개수-구하기.js) | +| 12 | [n^2 배열 자르기](https://school.programmers.co.kr//learn/courses/30/lessons/87390) | [n^2-배열-자르기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/n^2-배열-자르기.js) | +| 13 | [가장 큰 수](https://school.programmers.co.kr//learn/courses/30/lessons/42746) | [가장-큰-수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/가장-큰-수.js) | +| 14 | [가장 큰 정사각형 찾기](https://school.programmers.co.kr//learn/courses/30/lessons/12905) | [가장-큰-정사각형-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/가장-큰-정사각형-찾기.js) | +| 15 | [거리두기 확인하기](https://school.programmers.co.kr//learn/courses/30/lessons/81302) | [거리두기-확인하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/거리두기-확인하기.js) | +| 16 | [게임 맵 최단거리](https://school.programmers.co.kr//learn/courses/30/lessons/1844) | [게임-맵-최단거리.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/게임-맵-최단거리.js) | +| 17 | [괄호 변환](https://school.programmers.co.kr//learn/courses/30/lessons/60058) | [괄호-변환.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/괄호-변환.js) | +| 18 | [괄호 회전하기](https://school.programmers.co.kr//learn/courses/30/lessons/76502) | [괄호-회전하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/괄호-회전하기.js) | +| 19 | [구명보트](https://school.programmers.co.kr//learn/courses/30/lessons/42885) | [구명보트.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/구명보트.js) | +| 20 | [기능개발](https://school.programmers.co.kr//learn/courses/30/lessons/42586) | [기능개발.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/기능개발.js) | +| 21 | [다리를 지나는 트럭](https://school.programmers.co.kr//learn/courses/30/lessons/42583) | [다리를-지나는-트럭.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/다리를-지나는-트럭.js) | +| 22 | [다음 큰 숫자](https://school.programmers.co.kr//learn/courses/30/lessons/12911) | [다음-큰-숫자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/다음-큰-숫자.js) | +| 23 | [땅따먹기](https://school.programmers.co.kr//learn/courses/30/lessons/12913) | [땅따먹기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/땅따먹기.js) | +| 24 | [멀쩡한 사각형](https://school.programmers.co.kr//learn/courses/30/lessons/62048) | [멀쩡한-사각형.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/멀쩡한-사각형.js) | +| 25 | [메뉴 리뉴얼](https://school.programmers.co.kr//learn/courses/30/lessons/72411) | [메뉴-리뉴얼.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/메뉴-리뉴얼.js) | +| 26 | [문자열 압축](https://school.programmers.co.kr//learn/courses/30/lessons/60057) | [문자열-압축.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/문자열-압축.js) | +| 27 | [빛의 경로 사이클](https://school.programmers.co.kr//learn/courses/30/lessons/86052) | [빛의-경로-사이클.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/빛의-경로-사이클.js) | +| 28 | [삼각 달팽이](https://school.programmers.co.kr//learn/courses/30/lessons/68645) | [삼각-달팽이.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/삼각-달팽이.js) | +| 29 | [소수 찾기](https://school.programmers.co.kr//learn/courses/30/lessons/42839) | [소수-찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/소수-찾기.js) | +| 30 | [수식 최대화](https://school.programmers.co.kr//learn/courses/30/lessons/67257) | [수식-최대화.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/수식-최대화.js) | +| 31 | [숫자의 표현](https://school.programmers.co.kr//learn/courses/30/lessons/12924) | [숫자의-표현.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/숫자의-표현.js) | +| 32 | [스킬트리](https://school.programmers.co.kr//learn/courses/30/lessons/49993) | [스킬트리.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/스킬트리.js) | +| 33 | [영어 끝말잇기](https://school.programmers.co.kr//learn/courses/30/lessons/12981) | [영어-끝말잇기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/영어-끝말잇기.js) | +| 34 | [예상 대진표](https://school.programmers.co.kr//learn/courses/30/lessons/12985) | [예상-대진표.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/예상-대진표.js) | +| 35 | [오픈채팅방 ](https://school.programmers.co.kr//learn/courses/30/lessons/42888) | [오픈채팅방.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/오픈채팅방.js) | +| 36 | [올바른 괄호](https://school.programmers.co.kr//learn/courses/30/lessons/12909) | [올바른-괄호.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/올바른-괄호.js) | +| 37 | [위장](https://school.programmers.co.kr//learn/courses/30/lessons/42578) | [위장.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/위장.js) | +| 38 | [점프와 순간 이동](https://school.programmers.co.kr//learn/courses/30/lessons/12980) | [점프와-순간-이동.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/점프와-순간-이동.js) | +| 39 | [조이스틱](https://school.programmers.co.kr//learn/courses/30/lessons/42860) | [조이스틱.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/조이스틱.js) | +| 40 | [주차 요금 계산](https://school.programmers.co.kr//learn/courses/30/lessons/92341) | [주차-요금-계산.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/주차-요금-계산.js) | +| 41 | [짝지어 제거하기](https://school.programmers.co.kr//learn/courses/30/lessons/12973) | [짝지어-제거하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/짝지어-제거하기.js) | +| 42 | [최댓값과 최솟값](https://school.programmers.co.kr//learn/courses/30/lessons/12939) | [최댓값과-최솟값.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/최댓값과-최솟값.js) | +| 43 | [최솟값 만들기](https://school.programmers.co.kr//learn/courses/30/lessons/12941) | [최솟값-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/최솟값-만들기.js) | +| 44 | [카펫](https://school.programmers.co.kr//learn/courses/30/lessons/42842) | [카펫.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/카펫.js) | +| 45 | [큰 수 만들기](https://school.programmers.co.kr//learn/courses/30/lessons/42883) | [큰-수-만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/큰-수-만들기.js) | +| 46 | [타겟 넘버](https://school.programmers.co.kr//learn/courses/30/lessons/43165) | [타겟-넘버.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/타겟-넘버.js) | +| 47 | [튜플](https://school.programmers.co.kr//learn/courses/30/lessons/64065) | [튜플.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/튜플.js) | +| 48 | [프린터](https://school.programmers.co.kr//learn/courses/30/lessons/42587) | [프린터.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/프린터.js) | +| 49 | [피보나치 수](https://school.programmers.co.kr//learn/courses/30/lessons/12945) | [피보나치-수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/피보나치-수.js) | +| 50 | [행렬 테두리 회전하기](https://school.programmers.co.kr//learn/courses/30/lessons/77485) | [행렬-테두리-회전하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/행렬-테두리-회전하기.js) | +| 51 | [행렬의 곱셈](https://school.programmers.co.kr//learn/courses/30/lessons/12949) | [행렬의-곱셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/행렬의-곱셈.js) | +| 52 | [후보키](https://school.programmers.co.kr//learn/courses/30/lessons/42890) | [후보키.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/후보키.js) | ### Level 3 👨🏻‍💻(풀이 중..) @@ -172,15 +172,15 @@ | 번호 | 문제 출처 | 풀이 | | --- | ------- | --- | -| 1 | [2 x n 타일링](/learn/courses/30/lessons/12900) | [2-x-n-타일링.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/2-x-n-타일링.js) | -| 2 | [N-Queen](/learn/courses/30/lessons/12952) | [N-Queen.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/N-Queen.js) | -| 3 | [가장 먼 노드](/learn/courses/30/lessons/49189) | [가장-먼-노드.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/가장-먼-노드.js) | -| 4 | [네트워크](/learn/courses/30/lessons/43162) | [네트워크.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/네트워크.js) | -| 5 | [단속카메라](/learn/courses/30/lessons/42884) | [단속카메라.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/단속카메라.js) | -| 6 | [베스트앨범](/learn/courses/30/lessons/42579) | [베스트앨범.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/베스트앨범.js) | -| 7 | [여행경로](/learn/courses/30/lessons/43164) | [여행경로.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/여행경로.js) | -| 8 | [이중우선순위큐](/learn/courses/30/lessons/42628) | [이중우선순위큐.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/이중우선순위큐.js) | -| 9 | [입국심사](/learn/courses/30/lessons/43238) | [입국심사.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/입국심사.js) | +| 1 | [2 x n 타일링](https://school.programmers.co.kr//learn/courses/30/lessons/12900) | [2-x-n-타일링.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/2-x-n-타일링.js) | +| 2 | [N-Queen](https://school.programmers.co.kr//learn/courses/30/lessons/12952) | [N-Queen.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/N-Queen.js) | +| 3 | [가장 먼 노드](https://school.programmers.co.kr//learn/courses/30/lessons/49189) | [가장-먼-노드.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/가장-먼-노드.js) | +| 4 | [네트워크](https://school.programmers.co.kr//learn/courses/30/lessons/43162) | [네트워크.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/네트워크.js) | +| 5 | [단속카메라](https://school.programmers.co.kr//learn/courses/30/lessons/42884) | [단속카메라.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/단속카메라.js) | +| 6 | [베스트앨범](https://school.programmers.co.kr//learn/courses/30/lessons/42579) | [베스트앨범.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/베스트앨범.js) | +| 7 | [여행경로](https://school.programmers.co.kr//learn/courses/30/lessons/43164) | [여행경로.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/여행경로.js) | +| 8 | [이중우선순위큐](https://school.programmers.co.kr//learn/courses/30/lessons/42628) | [이중우선순위큐.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/이중우선순위큐.js) | +| 9 | [입국심사](https://school.programmers.co.kr//learn/courses/30/lessons/43238) | [입국심사.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/입국심사.js) | ### Level 4 @@ -190,7 +190,7 @@ | 번호 | 문제 출처 | 풀이 | | --- | ------- | --- | -| 1 | [단어 퍼즐](/learn/courses/30/lessons/12983) | [단어-퍼즐.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-4/단어-퍼즐.js) | +| 1 | [단어 퍼즐](https://school.programmers.co.kr//learn/courses/30/lessons/12983) | [단어-퍼즐.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-4/단어-퍼즐.js) | ### Level 5 diff --git a/utils/string.js b/utils/string.js index d2f0966..12fe79a 100644 --- a/utils/string.js +++ b/utils/string.js @@ -1,6 +1,6 @@ -import * as fs from 'fs'; -import path from 'path'; -import fetchTitleLink from './fetch.js'; +import * as fs from "fs"; +import path from "path"; +import fetchTitleLink from "./fetch.js"; const __dirname = path.resolve(); const titleLinkObject = await fetchTitleLink(); @@ -9,8 +9,8 @@ function getFileNameList(dir) { try { return fs .readdirSync(dir) - .map(fileName => fileName.normalize('NFC')) - .filter(fileName => fileName !== '00-해답-예시.js') + .map((fileName) => fileName.normalize("NFC")) + .filter((fileName) => fileName !== "00-해답-예시.js") .sort(); } catch (err) { return []; @@ -19,30 +19,30 @@ function getFileNameList(dir) { function checkException(title) { switch (title) { - case '수박수박수박수박수박수': - return '수박수박수박수박수박수?'; - case 'H Index': - return 'H-Index'; - case 'N Queen': - return 'N-Queen'; - case '오픈채팅방': - return '오픈채팅방 '; + case "수박수박수박수박수박수": + return "수박수박수박수박수박수?"; + case "H Index": + return "H-Index"; + case "N Queen": + return "N-Queen"; + case "오픈채팅방": + return "오픈채팅방 "; default: return title; } } function getTitle(fileName) { - const title = fileName.split('-').join(' ').slice(0, -3); + const title = fileName.split("-").join(" ").slice(0, -3); return checkException(title); } export function getInfoList(levelNumber) { const levelDir = path.resolve(__dirname, `./level-${levelNumber}`); const fileNameList = getFileNameList(levelDir); - const infoList = fileNameList.map(fileName => { + const infoList = fileNameList.map((fileName) => { const title = getTitle(fileName); - const link = titleLinkObject[title]; + const link = "https://school.programmers.co.kr/" + titleLinkObject[title]; return { title, link, fileName, levelNumber }; }); return infoList; @@ -55,9 +55,9 @@ function makeReadmeStr(infoItem, index) { } export function getTableStr(levelNumber) { - if (getInfoList(levelNumber).length === 0) return ''; + if (getInfoList(levelNumber).length === 0) return ""; return getInfoList(levelNumber) .map((item, index) => makeReadmeStr(item, index)) - .join('\n'); + .join("\n"); } From 031c52dfb04b42c003ad00f669118c1eefe029aa Mon Sep 17 00:00:00 2001 From: Jaeyeong son Date: Sat, 23 Jul 2022 14:54:50 +0900 Subject: [PATCH 09/17] =?UTF-8?q?[=EC=86=90=EC=9E=AC=EC=98=81]=20level2=20?= =?UTF-8?q?=EB=B0=B0=EB=8B=AC=20=ED=92=80=EC=9D=B4=20=EB=B0=8F=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "level-2/\353\260\260\353\213\254.js" | 189 ++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 "level-2/\353\260\260\353\213\254.js" diff --git "a/level-2/\353\260\260\353\213\254.js" "b/level-2/\353\260\260\353\213\254.js" new file mode 100644 index 0000000..50a350c --- /dev/null +++ "b/level-2/\353\260\260\353\213\254.js" @@ -0,0 +1,189 @@ +//정답 1 - pereng11 +// 다익스트라 + 최소힙 O( N * logN ) +function solution ( N, road, K ) +{ + // [목적지, 거리] 노드를 값으로 가지는, 거리에 대한 최소힙 + class MinHeap{ + constructor () + { + this.heap = [ null ]; + } + // 맨 끝에 노드를 삽입 후 위로 올라가면서 정렬 + push ( val ) + { + this.heap.push(val); + let childIdx = this.heap.length-1; + let parentIdx = Math.floor(childIdx / 2); + while(parentIdx > 0 && this.heap[parentIdx][1] > this.heap[childIdx][1]){ + this.swap( childIdx, parentIdx ); + childIdx = parentIdx; + parentIdx = Math.floor(childIdx / 2); + } + } + pop () + { + if ( this.heap.length === 1 ) + { + return undefined; + } + // 최소값은 빼두었다가 리턴하고, 가장 끝 값을 맨 위로 가져와 아래로 내려가면서 정렬 + const minNode = this.heap[ 1 ]; + this.heap[ 1 ] = this.heap[ this.heap.length - 1 ]; + this.heap.pop(); + let parentIdx = 1; + let leftChildIdx = 2; + let rightChildIdx = 3; + while ( parentIdx < this.heap.length ) + { + // 자식이 없는 경우 + if ( !this.heap[ leftChildIdx ] ) + { + break; + } // 왼쪽 자식만 있는 경우 + else if ( !this.heap[ rightChildIdx ] ) + { + if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] ) + { + this.swap( parentIdx, leftChildIdx ); + } + break; + // 둘 중 하나가 부모보다 작을 때, 더 작은 쪽으로 정렬 + } else if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] || this.heap[ parentIdx ][ 1 ] > this.heap[ rightChildIdx ][ 1 ] ) + { + const minChildIdx = this.heap[ leftChildIdx ][ 1 ] < this.heap[ rightChildIdx ][ 1 ] ? leftChildIdx : rightChildIdx; + this.swap( parentIdx, minChildIdx ); + parentIdx = minChildIdx; + leftChildIdx = parentIdx * 2 + rightChildIdx = parentIdx * 2 + 1; + } else + { + // 끝까지 내려가지 않았더라도 부모가 가장 작으면 정렬 중지 + break; + } + } + return minNode; + } + swap ( idx1, idx2 ) + { + [ this.heap[ idx1 ], this.heap[ idx2 ] ] = [ this.heap[ idx2 ], this.heap[ idx1 ] ]; + } + length () + { + return this.heap.length; + } + } + + + const roadsTable = {}; //전체 도로 정보 + + // 도로 정보 초기화 roadTable[시작점] = [목적지, 거리] 배열 + for ( let i = 1; i <= N; i++ ) + { + roadsTable[ i ] = []; + } + road.forEach( road => + { + let [ sp, ep, dist ] = road; + roadsTable[ sp ].push( [ ep, dist ] ); + roadsTable[ ep ].push( [ sp, dist ] ); + } ); + + function djikstra ( sp ) + { + const visited = new Array( N + 1 ).fill( false ); //방문 확인 배열 + const dist = new Array( N + 1 ).fill( Infinity ); //목표지점까지 거리 + const heap = new MinHeap(); + + //시작점 삽입 + heap.push( [sp, 0] ); + + // 가장 가까운 목적지부터 순서대로 방문 + while ( heap.length() > 1 ) + { + //힙에 저장된 목적지 중 가장 가까운 거리의 목적지를 꺼냄 [목적지, 거리] + const [ ep, val ] = heap.pop(); + //아직 방문하지 않은 곳만 처리 + if ( !visited[ ep ] ) + { + //방문처리, 거리 저장 + visited[ ep ] = true; + dist[ ep ] = val; + //방문 지점을 거쳐서 가는 다른 목적지 구하기 + const nexts = roadsTable[ ep ]; + if ( nexts ) + { + nexts.forEach( n => + { + let [ nextEp, nextVal ] = n; + if ( !visited[ nextEp ] ) //아직 방문하지 않은 곳일 경우, '지금까지의 거리 + 현재 위치에서의 거리'로 힙에 삽입 + { + heap.push( [ nextEp, val + nextVal ] ); + } + }) + } + } + } + // 거리가 K이하인 지점의 개수 반환 + const result = dist.filter( d => d <= K ).length; + return result; + } + + const answer = djikstra( 1 ); + return answer; +} + +//정답 2 - pereng11 O(N * N); +//다익스트라 + 선형탐색 +function solution ( N, road, K ) +{ + + const roadsTable = {}; //전체 도로 정보 + + // 도로 정보 초기화 roadTable[시작점] = [목적지, 거리] 배열 + for ( let i = 1; i <= N; i++ ) + { + roadsTable[ i ] = []; + } + road.forEach( road => + { + let [ sp, ep, dist ] = road; + roadsTable[ sp ].push( [ ep, dist ] ); + roadsTable[ ep ].push( [ sp, dist ] ); + } ); + + function djikstra ( sp ) + { + const dist = new Array( N + 1 ).fill( Infinity ); //목표지점까지 거리 + const queue = []; + + queue.push( [sp, 0] ); + + while ( queue.length > 0 ) + { + const [ ep, val ] = queue.shift(); + if ( dist[ ep ] > val ) + { + dist[ ep ] = val; + const nexts = roadsTable[ ep ]; + if ( nexts ) + { + nexts.forEach( n => + { + let [ nextEp, nextVal ] = n; + //거리가 더 줄어드는 경우, '지금까지의 거리 + 현재 위치에서의 거리'로 힙에 삽입 + if ( dist[ nextEp ] > val + nextVal ) + { + queue.push( [ nextEp, val + nextVal ] ); + } + } ); + } + } + } + // 거리가 K이하인 지점의 개수 반환 + const result = dist.filter( d => d <= K ).length; + return result; + } + + const answer = djikstra( 1 ); + return answer; +} \ No newline at end of file From d2b9fd39aceb0ab2fd2c33e7139e15a2f8d4e043 Mon Sep 17 00:00:00 2001 From: iHoHyeon Date: Sun, 24 Jul 2022 15:58:51 +0900 Subject: [PATCH 10/17] =?UTF-8?q?solution=20=EA=B5=AC=EB=AA=85=EB=B3=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...54\353\252\205\353\263\264\355\212\270.js" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git "a/level-2/\352\265\254\353\252\205\353\263\264\355\212\270.js" "b/level-2/\352\265\254\353\252\205\353\263\264\355\212\270.js" index c6819b5..3bfd2a7 100644 --- "a/level-2/\352\265\254\353\252\205\353\263\264\355\212\270.js" +++ "b/level-2/\352\265\254\353\252\205\353\263\264\355\212\270.js" @@ -40,4 +40,27 @@ function solution(people, limit) { } return count; +} + +// 정답 3 - iHoHyeon +function solution(people, limit) { + people.sort((a, b) => a - b); // 오름차순 정렬 + + let cnt = 0; // 구명보트 개수 + + let front = 0; // 가장 몸무게가 작은 사람의 index + let last = people.length; // 가장 몸무게가 큰 사람의 index + + while (last > front) { + cnt++; + + const now = people.pop(); + last--; + + if (now + people[front] <= limit) { + front++; // shift() 연산의 비효율로 인해 front 사용 + } + } + + return cnt; } \ No newline at end of file From 8938fca9f0de91b554c407f81518732cc7685394 Mon Sep 17 00:00:00 2001 From: Jaeyeong son Date: Mon, 25 Jul 2022 20:38:10 +0900 Subject: [PATCH 11/17] =?UTF-8?q?fix:=20=EC=B5=9C=EC=86=8C=ED=9E=99=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B0=94=EA=B9=A5=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC&=ED=8C=8C=EC=9D=BC=20=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "level-2/\353\260\260\353\213\254.js" | 129 +++++++++++++------------- 1 file changed, 65 insertions(+), 64 deletions(-) diff --git "a/level-2/\353\260\260\353\213\254.js" "b/level-2/\353\260\260\353\213\254.js" index 50a350c..fb70325 100644 --- "a/level-2/\353\260\260\353\213\254.js" +++ "b/level-2/\353\260\260\353\213\254.js" @@ -1,79 +1,81 @@ +//https://github.com/codeisneverodd/programmers-coding-test +//완벽한 정답이 아닙니다. + //정답 1 - pereng11 // 다익스트라 + 최소힙 O( N * logN ) -function solution ( N, road, K ) -{ // [목적지, 거리] 노드를 값으로 가지는, 거리에 대한 최소힙 - class MinHeap{ - constructor () - { - this.heap = [ null ]; - } - // 맨 끝에 노드를 삽입 후 위로 올라가면서 정렬 - push ( val ) +class MinHeap{ + constructor () + { + this.heap = [ null ]; + } + // 맨 끝에 노드를 삽입 후 위로 올라가면서 정렬 + push ( val ) + { + this.heap.push(val); + let childIdx = this.heap.length-1; + let parentIdx = Math.floor(childIdx / 2); + while(parentIdx > 0 && this.heap[parentIdx][1] > this.heap[childIdx][1]){ + this.swap( childIdx, parentIdx ); + childIdx = parentIdx; + parentIdx = Math.floor(childIdx / 2); + } + } + pop () + { + if ( this.heap.length === 1 ) { - this.heap.push(val); - let childIdx = this.heap.length-1; - let parentIdx = Math.floor(childIdx / 2); - while(parentIdx > 0 && this.heap[parentIdx][1] > this.heap[childIdx][1]){ - this.swap( childIdx, parentIdx ); - childIdx = parentIdx; - parentIdx = Math.floor(childIdx / 2); - } + return undefined; } - pop () + // 최소값은 빼두었다가 리턴하고, 가장 끝 값을 맨 위로 가져와 아래로 내려가면서 정렬 + const minNode = this.heap[ 1 ]; + this.heap[ 1 ] = this.heap[ this.heap.length - 1 ]; + this.heap.pop(); + let parentIdx = 1; + let leftChildIdx = 2; + let rightChildIdx = 3; + while ( parentIdx < this.heap.length ) { - if ( this.heap.length === 1 ) + // 자식이 없는 경우 + if ( !this.heap[ leftChildIdx ] ) { - return undefined; - } - // 최소값은 빼두었다가 리턴하고, 가장 끝 값을 맨 위로 가져와 아래로 내려가면서 정렬 - const minNode = this.heap[ 1 ]; - this.heap[ 1 ] = this.heap[ this.heap.length - 1 ]; - this.heap.pop(); - let parentIdx = 1; - let leftChildIdx = 2; - let rightChildIdx = 3; - while ( parentIdx < this.heap.length ) + break; + } // 왼쪽 자식만 있는 경우 + else if ( !this.heap[ rightChildIdx ] ) { - // 자식이 없는 경우 - if ( !this.heap[ leftChildIdx ] ) - { - break; - } // 왼쪽 자식만 있는 경우 - else if ( !this.heap[ rightChildIdx ] ) - { - if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] ) - { - this.swap( parentIdx, leftChildIdx ); - } - break; - // 둘 중 하나가 부모보다 작을 때, 더 작은 쪽으로 정렬 - } else if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] || this.heap[ parentIdx ][ 1 ] > this.heap[ rightChildIdx ][ 1 ] ) - { - const minChildIdx = this.heap[ leftChildIdx ][ 1 ] < this.heap[ rightChildIdx ][ 1 ] ? leftChildIdx : rightChildIdx; - this.swap( parentIdx, minChildIdx ); - parentIdx = minChildIdx; - leftChildIdx = parentIdx * 2 - rightChildIdx = parentIdx * 2 + 1; - } else + if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] ) { - // 끝까지 내려가지 않았더라도 부모가 가장 작으면 정렬 중지 - break; + this.swap( parentIdx, leftChildIdx ); } + break; + // 둘 중 하나가 부모보다 작을 때, 더 작은 쪽으로 정렬 + } else if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] || this.heap[ parentIdx ][ 1 ] > this.heap[ rightChildIdx ][ 1 ] ) + { + const minChildIdx = this.heap[ leftChildIdx ][ 1 ] < this.heap[ rightChildIdx ][ 1 ] ? leftChildIdx : rightChildIdx; + this.swap( parentIdx, minChildIdx ); + parentIdx = minChildIdx; + leftChildIdx = parentIdx * 2 + rightChildIdx = parentIdx * 2 + 1; + } else + { + // 끝까지 내려가지 않았더라도 부모가 가장 작으면 정렬 중지 + break; } - return minNode; } - swap ( idx1, idx2 ) - { - [ this.heap[ idx1 ], this.heap[ idx2 ] ] = [ this.heap[ idx2 ], this.heap[ idx1 ] ]; - } - length () - { - return this.heap.length; - } - } + return minNode; + } + swap ( idx1, idx2 ) + { + [ this.heap[ idx1 ], this.heap[ idx2 ] ] = [ this.heap[ idx2 ], this.heap[ idx1 ] ]; + } + length () + { + return this.heap.length; + } +} - +function solution ( N, road, K ) +{ const roadsTable = {}; //전체 도로 정보 // 도로 정보 초기화 roadTable[시작점] = [목적지, 거리] 배열 @@ -136,7 +138,6 @@ function solution ( N, road, K ) //다익스트라 + 선형탐색 function solution ( N, road, K ) { - const roadsTable = {}; //전체 도로 정보 // 도로 정보 초기화 roadTable[시작점] = [목적지, 거리] 배열 From 35c30f281d32e29f9166013b52ba2b5e4cf47b20 Mon Sep 17 00:00:00 2001 From: iHoHyeon <74816327+iHoHyeon@users.noreply.github.com> Date: Wed, 3 Aug 2022 15:22:14 +0900 Subject: [PATCH 12/17] =?UTF-8?q?solution=20level2=20-=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EB=B8=94=EB=A1=9D=20(#79)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * solution level2 - 숫자 블록 * Update level-2/숫자-블록.js Co-authored-by: codeisneverodd Co-authored-by: codeisneverodd --- ...3\354\236\220-\353\270\224\353\241\235.js" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 "level-2/\354\210\253\354\236\220-\353\270\224\353\241\235.js" diff --git "a/level-2/\354\210\253\354\236\220-\353\270\224\353\241\235.js" "b/level-2/\354\210\253\354\236\220-\353\270\224\353\241\235.js" new file mode 100644 index 0000000..7bb5d51 --- /dev/null +++ "b/level-2/\354\210\253\354\236\220-\353\270\224\353\241\235.js" @@ -0,0 +1,32 @@ +//https://github.com/codeisneverodd/programmers-coding-test +//완벽한 정답이 아닙니다. +//정답 1 - iHoHyeon +function solution(begin, end) { + return new Array(end - begin + 1).fill(null).map((v, idx) => calc(begin + idx)); + // begin ~ end 각 위치에 대해서 calc 함수의 return 값으로 채운다. +} + +const calc = (number) => { + if (number === 1) return 0; + // 1번째 위치는 무조건 0블록이 위치 + + for (let i = 2; i <= Math.sqrt(number); i++) { + if (number % i === 0 && number / i <= 10_000_000) return number / i; + // 10_000_000번 블록까지만 놓았으므로 숫자를 초과하는 경우는 제외 + } + + return 1; +}; + +/* + 1번 블록부터 10_000_000번 블록까지 전부 규칙에 따라서 놓는 경우는 + 시간 / 공간 복잡도가 급상승 + + -> 따라서 각 위치에 어떤 숫자의 블록이 놓일지를 계산해주자 + + -> n번째 위치에는 1, n을 제외한 n의 가장 큰 약수의 블록이 놓이게 된다. + + -> 가장 큰 약수는 n / (n의 가장 작은 약수)임을 이용해서 계산해주면 된다. + + + 가장 큰 약수가 1인 경우는 소수인 경우이고 숫자 1 블록이 놓인다. +*/ From d503fd8524e58558646898456429de2acca0d3f7 Mon Sep 17 00:00:00 2001 From: JaeyeongSon Date: Mon, 8 Aug 2022 16:36:19 +0900 Subject: [PATCH 13/17] =?UTF-8?q?solution:=20level2=20-=20=ED=94=BC?= =?UTF-8?q?=EB=A1=9C=EB=8F=84=20=EB=AC=B8=EC=A0=9C=20=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\355\224\274\353\241\234\353\217\204.js" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 "level-2/\355\224\274\353\241\234\353\217\204.js" diff --git "a/level-2/\355\224\274\353\241\234\353\217\204.js" "b/level-2/\355\224\274\353\241\234\353\217\204.js" new file mode 100644 index 0000000..ee4d238 --- /dev/null +++ "b/level-2/\355\224\274\353\241\234\353\217\204.js" @@ -0,0 +1,22 @@ +//https://github.com/codeisneverodd/programmers-coding-test +//완벽한 정답이 아닙니다. +//정답 1 - pereng11 +//완전 탐색, greedy O(N^2) + function solution(k, dungeons) { + let answer = 0; + const visited = new Array(dungeons.length).fill(false); + function dfs(k, total){ + answer = Math.max( answer, total ); + //모든 포인트를 출발점으로 전체 경우의 수 탐색 + //0번 인덱스를 출발로 삼은 greedy 탐색이 끝나면 1번 인덱스를 출발점으로 ~ 마지막 인덱스까지 반복 + for(let i = 0; i < dungeons.length; i++){ + if(!visited[i] && dungeons[i][0] <= k){ + visited[i] = true; + dfs(k - dungeons[i][1], total+1); + visited[i] = false; + } + } + } + dfs(k, 0); + return answer; +} From 597555afc55d6eea2f44ba790adb0802135f9c44 Mon Sep 17 00:00:00 2001 From: JaeyeongSon Date: Fri, 12 Aug 2022 18:08:43 +0900 Subject: [PATCH 14/17] =?UTF-8?q?refactor:=20level2=20-=20=ED=94=BC?= =?UTF-8?q?=EB=A1=9C=EB=8F=84(=EA=B0=80=EB=8F=85=EC=84=B1=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 최대한 순수함수에 가깝도록, 함수 내부에서 외부 변수를 참조하거나 조작하지 않도록 수정하였습니다. 2. 변수와 함수 이름을 수정하여 의미를 명확히 하였습니다. 3. 로직의 목적을 쉽게 파악할 수 있도록 일반 for문 대신 배열 메서드를 적극 활용하였습니다. --- .../\355\224\274\353\241\234\353\217\204.js" | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git "a/level-2/\355\224\274\353\241\234\353\217\204.js" "b/level-2/\355\224\274\353\241\234\353\217\204.js" index ee4d238..94a234d 100644 --- "a/level-2/\355\224\274\353\241\234\353\217\204.js" +++ "b/level-2/\355\224\274\353\241\234\353\217\204.js" @@ -2,21 +2,27 @@ //완벽한 정답이 아닙니다. //정답 1 - pereng11 //완전 탐색, greedy O(N^2) - function solution(k, dungeons) { - let answer = 0; - const visited = new Array(dungeons.length).fill(false); - function dfs(k, total){ - answer = Math.max( answer, total ); - //모든 포인트를 출발점으로 전체 경우의 수 탐색 - //0번 인덱스를 출발로 삼은 greedy 탐색이 끝나면 1번 인덱스를 출발점으로 ~ 마지막 인덱스까지 반복 - for(let i = 0; i < dungeons.length; i++){ - if(!visited[i] && dungeons[i][0] <= k){ - visited[i] = true; - dfs(k - dungeons[i][1], total+1); - visited[i] = false; - } - } - } - dfs(k, 0); - return answer; +function solution(currentFatigue, dungeons) { + return getMaxCount(currentFatigue, 0, dungeons); } + +function getMaxCount(currentFatigue, visitedCount, dungeons) { + const possibleDungeons = dungeons.filter(([minNeededFatigue, _]) => minNeededFatigue <= currentFatigue); + if (possibleDungeons.length === 0) return visitedCount; + + const maxCount = possibleDungeons.reduce((prevCount, curr, currentIndex) => { + const [_, usedFatigue] = curr; + const nextDungeons = possibleDungeons.filter((_, index) => index !== currentIndex); + const currentCount = getMaxCount( + currentFatigue - usedFatigue, + visitedCount + 1, + nextDungeons + ); + return Math.max(currentCount, prevCount); + }, 0); + + return maxCount; +} + + + From 3a7effcfacf4d7baa0f52975e50227723b0f706b Mon Sep 17 00:00:00 2001 From: codeisneverodd Date: Wed, 17 Aug 2022 16:07:12 +0900 Subject: [PATCH 15/17] =?UTF-8?q?feat:=20PR=20=ED=85=9C=ED=94=8C=EB=A6=BF?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/{workflows => }/PULL_REQUEST_TEMPLATE.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{workflows => }/PULL_REQUEST_TEMPLATE.md (100%) diff --git a/.github/workflows/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from .github/workflows/PULL_REQUEST_TEMPLATE.md rename to .github/PULL_REQUEST_TEMPLATE.md From 31d203613dea8e71aa501e6ce753067b065e165d Mon Sep 17 00:00:00 2001 From: codeisneverodd Date: Wed, 17 Aug 2022 16:12:19 +0900 Subject: [PATCH 16/17] =?UTF-8?q?feat:=20husky=20=EB=B0=8F=20pre-commit=20?= =?UTF-8?q?hook=20=EC=84=A4=EC=A0=95,=20prettierignore=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/update-README.yml | 2 - .gitignore | 1 + .prettierignore | 6 + ...4\353\212\224-\353\260\251\353\262\225.js" | 12 + package-lock.json | 1717 ++++++++++++++++- package.json | 10 +- 6 files changed, 1740 insertions(+), 8 deletions(-) create mode 100644 .prettierignore create mode 100644 "level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225.js" diff --git a/.github/workflows/update-README.yml b/.github/workflows/update-README.yml index b31a500..79f6d6c 100644 --- a/.github/workflows/update-README.yml +++ b/.github/workflows/update-README.yml @@ -7,11 +7,9 @@ on: push: branches: - main - - manage pull_request: branches: - main - - manage jobs: build: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 3a60430..29284c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ +README.md # Created by https://www.toptal.com/developers/gitignore/api/macos,webstorm # Edit at https://www.toptal.com/developers/gitignore?templates=macos,webstorm diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..695149a --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +/node_modules +.gitignore +.prettierrc.json +README.md +/.github +/.husky diff --git "a/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225.js" "b/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225.js" new file mode 100644 index 0000000..0c3b08d --- /dev/null +++ "b/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225.js" @@ -0,0 +1,12 @@ +function solution(n, k) { + const factorialList = getFactorialList(n); + const numberList = Array.from(Array(n), (_, index) => n - (index + 1)); + return answer; +} +const getFactorialList = (n) => { + const result = [1]; + for (let i = 2; i <= n; i++) { + result.push(result[result.length - 1] * i); + } + return result; +}; diff --git a/package-lock.json b/package-lock.json index 9858c59..65e4ef2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,71 @@ "cheerio": "^1.0.0-rc.10", "node-fetch": "^3.2.3", "prettier": "^2.7.1" + }, + "devDependencies": { + "husky": "^8.0.1", + "lint-staged": "^13.0.3" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/boolbase": { @@ -19,6 +84,18 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cheerio": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", @@ -54,6 +131,90 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -88,6 +249,23 @@ "node": ">= 12" } }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -139,6 +317,18 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -147,6 +337,29 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/fetch-blob": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", @@ -169,6 +382,18 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -180,6 +405,18 @@ "node": ">=12.20.0" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -198,6 +435,390 @@ "entities": "^2.0.0" } }, + "node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/husky": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", + "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lint-staged": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", + "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.17", + "commander": "^9.3.0", + "debug": "^4.3.4", + "execa": "^6.1.0", + "lilconfig": "2.0.5", + "listr2": "^4.0.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.2", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.1.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -233,17 +854,92 @@ "url": "https://opencollective.com/node-fetch" } }, - "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, "dependencies": { - "boolbase": "^1.0.0" + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dependencies": { + "boolbase": "^1.0.0" }, "funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -257,6 +953,39 @@ "parse5": "^6.0.1" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/prettier": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", @@ -271,11 +1000,189 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -283,14 +1190,166 @@ "engines": { "node": ">= 8" } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "dev": true, + "engines": { + "node": ">= 14" + } } }, "dependencies": { + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "cheerio": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", @@ -317,6 +1376,69 @@ "domutils": "^2.8.0" } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "commander": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", + "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -339,6 +1461,15 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -372,11 +1503,40 @@ "domhandler": "^4.2.0" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, "fetch-blob": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", @@ -386,6 +1546,15 @@ "web-streams-polyfill": "^3.0.3" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -394,6 +1563,12 @@ "fetch-blob": "^3.1.2" } }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -405,6 +1580,272 @@ "entities": "^2.0.0" } }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true + }, + "husky": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", + "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "dev": true + }, + "lint-staged": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", + "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", + "dev": true, + "requires": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.17", + "commander": "^9.3.0", + "debug": "^4.3.4", + "execa": "^6.1.0", + "lilconfig": "2.0.5", + "listr2": "^4.0.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.2", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.1.1" + } + }, + "listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -420,6 +1861,29 @@ "formdata-polyfill": "^4.0.10" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -428,6 +1892,30 @@ "boolbase": "^1.0.0" } }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -441,20 +1929,239 @@ "parse5": "^6.0.1" } }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true + }, "prettier": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, "web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", + "dev": true } } } diff --git a/package.json b/package.json index 3c04800..fc0429b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "🌱 프로그래머스의 [코딩테스트 문제]", "type": "module", "scripts": { - "build": "node ./utils/build.js" + "build": "node ./utils/build.js", + "prepare": "husky install" }, "repository": { "type": "git", @@ -20,5 +21,12 @@ "cheerio": "^1.0.0-rc.10", "node-fetch": "^3.2.3", "prettier": "^2.7.1" + }, + "devDependencies": { + "husky": "^8.0.1", + "lint-staged": "^13.0.3" + }, + "lint-staged": { + "**/*": "prettier --write --ignore-unknown" } } From 14e4ee2214c579b20c72345ffceb5e9b91bc0c29 Mon Sep 17 00:00:00 2001 From: codeisneverodd Date: Wed, 17 Aug 2022 16:15:48 +0900 Subject: [PATCH 17/17] =?UTF-8?q?fix:=20=EC=9E=98=EB=AA=BB=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=EB=90=9C=20=ED=95=B4=EC=84=A4=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\204\234\353\212\224-\353\260\251\353\262\225.js" | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 "level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225.js" diff --git "a/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225.js" "b/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225.js" deleted file mode 100644 index 0c3b08d..0000000 --- "a/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225.js" +++ /dev/null @@ -1,12 +0,0 @@ -function solution(n, k) { - const factorialList = getFactorialList(n); - const numberList = Array.from(Array(n), (_, index) => n - (index + 1)); - return answer; -} -const getFactorialList = (n) => { - const result = [1]; - for (let i = 2; i <= n; i++) { - result.push(result[result.length - 1] * i); - } - return result; -};