diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..9669912 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,27 @@ +{ + "extends": [ + "next/core-web-vitals", + "airbnb", + "airbnb-typescript", + "plugin:prettier/recommended" + ], + "parserOptions": { + "project": "./tsconfig.json" + }, + "rules": { + "react/jsx-props-no-spreading": "off", + "react/react-in-jsx-scope": "off", + "react/jsx-filename-extension": [1, { "extensions": [".ts", ".tsx"] }], + "react/require-default-props": "off", + "import/no-extraneous-dependencies": ["error", { "devDependencies": true }], + "@typescript-eslint/no-use-before-define": "off" + }, + "overrides": [ + { + "files": ["src/api/*/**"], + "rules": { + "import/prefer-default-export": "off" + } + } + ] +} diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 1a98a58..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,8 +0,0 @@ -## 새롭게 추가된 문제 풀이 - - - - -## 기존 풀이에 추가한 풀이 - -## 관련 이슈 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml new file mode 100644 index 0000000..1210488 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,20 @@ +name: Lint GitHub Action + +run-name: ${{ github.actor }}님의 빌드 및 Lint 검사 🚀 + +on: + pull_request: + branches: + - main + - dev +jobs: + ESLint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: "14" + - run: yarn + - run: yarn build + - run: yarn lint diff --git a/.github/workflows/update-README.yml b/.github/workflows/update-README.yml deleted file mode 100644 index 5900ec9..0000000 --- a/.github/workflows/update-README.yml +++ /dev/null @@ -1,40 +0,0 @@ -# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: update README.md - -on: - push: - branches: - - main - - feat/id-based-parsing - pull_request: - branches: - - main -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js 16.14.0 - uses: actions/setup-node@v3 - with: - node-version: 16.14.0 - cache: "npm" - - name: install package - run: npm install - - name: build README.md - run: npm run build - - name: get diff - id: get_diff - run: | - git diff --quiet ./README.md || echo "::set-output name=new_changes_exist::true" - - name: update README.md - if: steps.get_diff.outputs.new_changes_exist == 'true' - run: | - git add ./README.md - git config user.name github-actions - git config user.email github-actions@github.com - git commit -m "Automatic Update README.md" - git push diff --git a/.gitignore b/.gitignore index 29284c6..84a91bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,152 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -README.md -# Created by https://www.toptal.com/developers/gitignore/api/macos,webstorm -# Edit at https://www.toptal.com/developers/gitignore?templates=macos,webstorm +# dependencies +/node_modules +/.pnp +.pnp.js +# testing +/coverage -.idea/* -temp.txt +# next.js +/.next/ +/out/ -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### WebStorm ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# AWS User-specific -.idea/**/aws.xml - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/artifacts -# .idea/compiler.xml -# .idea/jarRepositories.xml -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr +# production +/build -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# SonarLint plugin -.idea/sonarlint/ - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### WebStorm Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -# https://plugins.jetbrains.com/plugin/7973-sonarlint -.idea/**/sonarlint/ +# misc +.DS_Store +*.pem -# SonarQube Plugin -# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin -.idea/**/sonarIssues.xml +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* -# Markdown Navigator plugin -# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced -.idea/**/markdown-navigator.xml -.idea/**/markdown-navigator-enh.xml -.idea/**/markdown-navigator/ +# local env files +.env*.local -# Cache file creation bug -# See https://youtrack.jetbrains.com/issue/JBR-2257 -.idea/$CACHE_FILE$ +# vercel +.vercel -# CodeStream plugin -# https://plugins.jetbrains.com/plugin/12206-codestream -.idea/codestream.xml +# typescript +*.tsbuildinfo -# End of https://www.toptal.com/developers/gitignore/api/macos,webstorm -/references/ -/node_modules/ -/test/ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..765baae --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +yarn pre-commit diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 695149a..0000000 --- a/.prettierignore +++ /dev/null @@ -1,6 +0,0 @@ -/node_modules -.gitignore -.prettierrc.json -README.md -/.github -/.husky diff --git a/.prettierrc.json b/.prettierrc.json index 566966a..0e36e8b 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,7 +1,11 @@ { - "singleQuote": true, + "printWidth": 80, + "semi": true, + "singleQuote": false, + "trailingComma": "none", + "tabWidth": 2, "bracketSpacing": true, - "bracketSameLine": true, - "arrowParens": "avoid", - "printWidth": 120 + "endOfLine": "auto", + "useTabs": false, + "arrowParens": "avoid" } diff --git a/README.md b/README.md index 9e168dd..4a176df 100644 --- a/README.md +++ b/README.md @@ -1,342 +1,103 @@ # 프로그래머스 모든 문제 풀이 -[![방문자수](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https://github.com/codeisneverodd/programmers-coding-test&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=방문자수(Today/Total)&edge_flat=true)](https://github.com/codeisneverodd) -## 👋 소개 -- 🌱 모든 문제는 JavaScript로 풀이되고 다양한 사람의 풀이가 올라와있어요 -- ✅ 프로그래머스는 정답을 통과시키면 다른 사람들의 풀이를 볼 수 있어요! [익스텐션](https://chrome.google.com/webstore/detail/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%95%EB%8B%B5-%ED%86%B5%EA%B3%BC%EA%B8%B0/pogpgnlafgchgebcnohihjjmdjcffenl?hl=ko)을 이용해보세요! -- 🔎 [검색 사이트](https://programmers-solution-bank.netlify.app/) 혹은 본 README에서 검색을 통해 다양한 풀이도 볼 수 있어요! -- ⭐ **도움이 되셨다면** 오른쪽 상단 ↗ 의 ⭐️ **Star를 클릭**해 이 프로젝트를 응원해주세요! -## 👻 [크롬익스텐션](https://chrome.google.com/webstore/detail/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%95%EB%8B%B5-%ED%86%B5%EA%B3%BC%EA%B8%B0/pogpgnlafgchgebcnohihjjmdjcffenl?hl=ko) 이 출시되었습니다 🎉🎉 -- 😆 무료 다운로드 👉 [프로그래머스 정답 통과기 - 크롬 웹 스토어](https://chrome.google.com/webstore/detail/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%95%EB%8B%B5-%ED%86%B5%EA%B3%BC%EA%B8%B0/pogpgnlafgchgebcnohihjjmdjcffenl?hl=ko) +[![방문자수]()](https://github.com/codeisneverodd) -[![extensionIntro](https://user-images.githubusercontent.com/54318460/187886360-dd8f917e-4ffe-4c6f-9b3c-d10a69b5f46e.gif)](https://chrome.google.com/webstore/detail/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%95%EB%8B%B5-%ED%86%B5%EA%B3%BC%EA%B8%B0/pogpgnlafgchgebcnohihjjmdjcffenl?hl=ko) +## 🔎 [검색 사이트 바로가기](https://codeisneverodd-home.vercel.app/solution-pass) +> 검색 사이트의 코드는 [이 저장소](https://github.com/codeisneverodd/home)에 공개되어 있어요 -## 📢 공지 -- 🔥 본 레퍼지토리에 본인의 해설을 PR을 통해 기여하면, 코드리뷰를 받아보실 수 있습니다. (기한: 2022/10/31) -- 기여 방법은 README 최하단을 참고해주세요. +## 👋 소개 + +- 🌱 다양한 사람의 프로그래머스의 코딩테스트 정답이 올라와있어요! +- ✅ 프로그래머스는 정답을 통과시키면 다른 사람들의 풀이를 볼 수 있어요! +- [🔎 검색 사이트](https://codeisneverodd-home.vercel.app/solution-pass) 를 통해 간편하게 검색하고 풀이를 올릴 수 있어요! +- ⭐ **도움이 되셨다면** 오른쪽 상단 ↗ 의 ⭐️ **Star를 클릭**해 이 프로젝트를 응원해주세요! ## 🤔 다른 사람의 풀이가 왜 중요한가요? -- 코딩테스트 공부에 왕도는 없으며, 다양한 사람들의 풀이를 보며 많은 문제를 푸는 것이 최상의 방법입니다. -- [크롬익스텐션](https://chrome.google.com/webstore/detail/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%95%EB%8B%B5-%ED%86%B5%EA%B3%BC%EA%B8%B0/pogpgnlafgchgebcnohihjjmdjcffenl?hl=ko) 을 통해 다른 사람들의 풀이를 확인하고 자신의 풀이를 발전시켜보세요! +- 코딩테스트 공부에 왕도는 없으며, 다양한 사람들의 풀이를 보며 많은 문제를 푸는 것이 최고의 방법입니다. ## 🌟 Contributors + [![contributors](https://contrib.rocks/image?repo=codeisneverodd/programmers-coding-test)](https://github.com/codeisneverodd/programmers-coding-test/graphs/contributors) ## 💡 Solutions - -### 🌱 Level 0 - -- 풀이 문제 수: 100문제 - -| 번호 | 문제 출처 | 풀이 | -| --- | ------- | --- | -| 1 | [2차원으로 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/120842) | [2차원으로 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/2차원으로-만들기&120842&.js) | -| 2 | [369게임](https://school.programmers.co.kr/learn/courses/30/lessons/120891) | [369게임.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/369게임&120891&.js) | -| 3 | [7의 개수](https://school.programmers.co.kr/learn/courses/30/lessons/120912) | [7의 개수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/7의-개수&120912&.js) | -| 4 | [A로 B 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/120886) | [A로 B 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/A로-B-만들기&120886&.js) | -| 5 | [OX퀴즈](https://school.programmers.co.kr/learn/courses/30/lessons/120907) | [OX퀴즈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/OX퀴즈&120907&.js) | -| 6 | [k의 개수](https://school.programmers.co.kr/learn/courses/30/lessons/120887) | [k의 개수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/k의-개수&120887&.js) | -| 7 | [n의 배수 고르기](https://school.programmers.co.kr/learn/courses/30/lessons/120905) | [n의 배수 고르기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/n의-배수-고르기&120905&.js) | -| 8 | [가까운 수](https://school.programmers.co.kr/learn/courses/30/lessons/120890) | [가까운 수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/가까운-수&120890&.js) | -| 9 | [가위 바위 보](https://school.programmers.co.kr/learn/courses/30/lessons/120839) | [가위 바위 보.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/가위-바위-보&120839&.js) | -| 10 | [가장 큰 수 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/120899) | [가장 큰 수 찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/가장-큰-수-찾기&120899&.js) | -| 11 | [각도기](https://school.programmers.co.kr/learn/courses/30/lessons/120829) | [각도기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/각도기&120829&.js) | -| 12 | [개미 군단](https://school.programmers.co.kr/learn/courses/30/lessons/120837) | [개미 군단.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/개미-군단&120837&.js) | -| 13 | [겹치는 선분의 길이](https://school.programmers.co.kr/learn/courses/30/lessons/120876) | [겹치는 선분의 길이.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/겹치는-선분의-길이&120876&.js) | -| 14 | [공 던지기](https://school.programmers.co.kr/learn/courses/30/lessons/120843) | [공 던지기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/공-던지기&120843&.js) | -| 15 | [구슬을 나누는 경우의 수](https://school.programmers.co.kr/learn/courses/30/lessons/120840) | [구슬을 나누는 경우의 수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/구슬을-나누는-경우의-수&120840&.js) | -| 16 | [나머지 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/120810) | [나머지 구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/나머지-구하기&120810&.js) | -| 17 | [나이 출력](https://school.programmers.co.kr/learn/courses/30/lessons/120820) | [나이 출력.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/나이-출력&120820&.js) | -| 18 | [다음에 올 숫자](https://school.programmers.co.kr/learn/courses/30/lessons/120924) | [다음에 올 숫자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/다음에-올-숫자&120924&.js) | -| 19 | [다항식 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/120863) | [다항식 더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/다항식-더하기&120863&.js) | -| 20 | [대문자와 소문자](https://school.programmers.co.kr/learn/courses/30/lessons/120893) | [대문자와 소문자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/대문자와-소문자&120893&.js) | -| 21 | [두 수의 곱](https://school.programmers.co.kr/learn/courses/30/lessons/120804) | [두 수의 곱.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/두-수의-곱&120804&.js) | -| 22 | [두 수의 나눗셈](https://school.programmers.co.kr/learn/courses/30/lessons/120806) | [두 수의 나눗셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/두-수의-나눗셈&120806&.js) | -| 23 | [두 수의 차](https://school.programmers.co.kr/learn/courses/30/lessons/120803) | [두 수의 차.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/두-수의-차&120803&.js) | -| 24 | [두 수의 합](https://school.programmers.co.kr/learn/courses/30/lessons/120802) | [두 수의 합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/두-수의-합&120802&.js) | -| 25 | [등수 매기기](https://school.programmers.co.kr/learn/courses/30/lessons/120882) | [등수 매기기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/등수-매기기&120882&.js) | -| 26 | [로그인 성공?](https://school.programmers.co.kr/learn/courses/30/lessons/120883) | [로그인 성공?.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/로그인-성공?&120883&.js) | -| 27 | [머쓱이보다 키 큰 사람](https://school.programmers.co.kr/learn/courses/30/lessons/120585) | [머쓱이보다 키 큰 사람.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/머쓱이보다-키-큰-사람&120585&.js) | -| 28 | [모스부호 (1)](https://school.programmers.co.kr/learn/courses/30/lessons/120838) | [모스부호 (1).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/모스부호-(1)&120838&.js) | -| 29 | [모음 제거](https://school.programmers.co.kr/learn/courses/30/lessons/120849) | [모음 제거.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/모음-제거&120849&.js) | -| 30 | [몫 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/120805) | [몫 구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/몫-구하기&120805&.js) | -| 31 | [문자 반복 출력하기](https://school.programmers.co.kr/learn/courses/30/lessons/120825) | [문자 반복 출력하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/문자-반복-출력하기&120825&.js) | -| 32 | [문자열 계산하기](https://school.programmers.co.kr/learn/courses/30/lessons/120902) | [문자열 계산하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/문자열-계산하기&120902&.js) | -| 33 | [문자열 뒤집기](https://school.programmers.co.kr/learn/courses/30/lessons/120822) | [문자열 뒤집기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/문자열-뒤집기&120822&.js) | -| 34 | [문자열 밀기](https://school.programmers.co.kr/learn/courses/30/lessons/120921) | [문자열 밀기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/문자열-밀기&120921&.js) | -| 35 | [문자열 정렬하기 (1)](https://school.programmers.co.kr/learn/courses/30/lessons/120850) | [문자열 정렬하기 (1).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/문자열-정렬하기-(1)&120850&.js) | -| 36 | [문자열 정렬하기 (2)](https://school.programmers.co.kr/learn/courses/30/lessons/120911) | [문자열 정렬하기 (2).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/문자열-정렬하기-(2)&120911&.js) | -| 37 | [문자열안에 문자열](https://school.programmers.co.kr/learn/courses/30/lessons/120908) | [문자열안에 문자열.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/문자열안에-문자열&120908&.js) | -| 38 | [배열 두 배 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/120809) | [배열 두 배 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/배열-두-배-만들기&120809&.js) | -| 39 | [배열 뒤집기](https://school.programmers.co.kr/learn/courses/30/lessons/120821) | [배열 뒤집기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/배열-뒤집기&120821&.js) | -| 40 | [배열 원소의 길이](https://school.programmers.co.kr/learn/courses/30/lessons/120854) | [배열 원소의 길이.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/배열-원소의-길이&120854&.js) | -| 41 | [배열 자르기](https://school.programmers.co.kr/learn/courses/30/lessons/120833) | [배열 자르기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/배열-자르기&120833&.js) | -| 42 | [배열 회전시키기](https://school.programmers.co.kr/learn/courses/30/lessons/120844) | [배열 회전시키기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/배열-회전시키기&120844&.js) | -| 43 | [배열의 유사도](https://school.programmers.co.kr/learn/courses/30/lessons/120903) | [배열의 유사도.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/배열의-유사도&120903&.js) | -| 44 | [배열의 평균값](https://school.programmers.co.kr/learn/courses/30/lessons/120817) | [배열의 평균값.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/배열의-평균값&120817&.js) | -| 45 | [분수의 덧셈](https://school.programmers.co.kr/learn/courses/30/lessons/120808) | [분수의 덧셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/분수의-덧셈&120808&.js) | -| 46 | [삼각형의 완성조건 (1)](https://school.programmers.co.kr/learn/courses/30/lessons/120889) | [삼각형의 완성조건 (1).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/삼각형의-완성조건-(1)&120889&.js) | -| 47 | [삼각형의 완성조건 (2)](https://school.programmers.co.kr/learn/courses/30/lessons/120868) | [삼각형의 완성조건 (2).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/삼각형의-완성조건-(2)&120868&.js) | -| 48 | [세균 증식](https://school.programmers.co.kr/learn/courses/30/lessons/120910) | [세균 증식.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/세균-증식&120910&.js) | -| 49 | [소인수분해](https://school.programmers.co.kr/learn/courses/30/lessons/120852) | [소인수분해.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/소인수분해&120852&.js) | -| 50 | [순서쌍의 개수](https://school.programmers.co.kr/learn/courses/30/lessons/120836) | [순서쌍의 개수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/순서쌍의-개수&120836&.js) | -| 51 | [숨어있는 숫자의 덧셈 (1)](https://school.programmers.co.kr/learn/courses/30/lessons/120851) | [숨어있는 숫자의 덧셈 (1).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/숨어있는-숫자의-덧셈-(1)&120851&.js) | -| 52 | [숨어있는 숫자의 덧셈 (2)](https://school.programmers.co.kr/learn/courses/30/lessons/120864) | [숨어있는 숫자의 덧셈 (2).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/숨어있는-숫자의-덧셈-(2)&120864&.js) | -| 53 | [숫자 비교하기](https://school.programmers.co.kr/learn/courses/30/lessons/120807) | [숫자 비교하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/숫자-비교하기&120807&.js) | -| 54 | [숫자 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/120904) | [숫자 찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/숫자-찾기&120904&.js) | -| 55 | [아이스 아메리카노](https://school.programmers.co.kr/learn/courses/30/lessons/120819) | [아이스 아메리카노.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/아이스-아메리카노&120819&.js) | -| 56 | [안전지대](https://school.programmers.co.kr/learn/courses/30/lessons/120866) | [안전지대.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/안전지대&120866&.js) | -| 57 | [암호 해독](https://school.programmers.co.kr/learn/courses/30/lessons/120892) | [암호 해독.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/암호-해독&120892&.js) | -| 58 | [약수 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/120897) | [약수 구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/약수-구하기&120897&.js) | -| 59 | [양꼬치](https://school.programmers.co.kr/learn/courses/30/lessons/120830) | [양꼬치.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/양꼬치&120830&.js) | -| 60 | [연속된 수의 합](https://school.programmers.co.kr/learn/courses/30/lessons/120923) | [연속된 수의 합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/연속된-수의-합&120923&.js) | -| 61 | [영어가 싫어요](https://school.programmers.co.kr/learn/courses/30/lessons/120894) | [영어가 싫어요.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/영어가-싫어요&120894&.js) | -| 62 | [옷가게 할인 받기](https://school.programmers.co.kr/learn/courses/30/lessons/120818) | [옷가게 할인 받기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/옷가게-할인-받기&120818&.js) | -| 63 | [옹알이](https://school.programmers.co.kr/learn/courses/30/lessons/120956) | [옹알이.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/옹알이&120956&.js) | -| 64 | [외계어 사전](https://school.programmers.co.kr/learn/courses/30/lessons/120869) | [외계어 사전.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/외계어-사전&120869&.js) | -| 65 | [외계행성의 나이](https://school.programmers.co.kr/learn/courses/30/lessons/120834) | [외계행성의 나이.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/외계행성의-나이&120834&.js) | -| 66 | [유한소수 판별하기](https://school.programmers.co.kr/learn/courses/30/lessons/120878) | [유한소수 판별하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/유한소수-판별하기&120878&.js) | -| 67 | [이진수 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/120885) | [이진수 더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/이진수-더하기&120885&.js) | -| 68 | [인덱스 바꾸기](https://school.programmers.co.kr/learn/courses/30/lessons/120895) | [인덱스 바꾸기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/인덱스-바꾸기&120895&.js) | -| 69 | [자릿수 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/120906) | [자릿수 더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/자릿수-더하기&120906&.js) | -| 70 | [잘라서 배열로 저장하기](https://school.programmers.co.kr/learn/courses/30/lessons/120913) | [잘라서 배열로 저장하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/잘라서-배열로-저장하기&120913&.js) | -| 71 | [저주의 숫자 3](https://school.programmers.co.kr/learn/courses/30/lessons/120871) | [저주의 숫자 3.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/저주의-숫자-3&120871&.js) | -| 72 | [점의 위치 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/120841) | [점의 위치 구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/점의-위치-구하기&120841&.js) | -| 73 | [제곱수 판별하기](https://school.programmers.co.kr/learn/courses/30/lessons/120909) | [제곱수 판별하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/제곱수-판별하기&120909&.js) | -| 74 | [종이 자르기](https://school.programmers.co.kr/learn/courses/30/lessons/120922) | [종이 자르기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/종이-자르기&120922&.js) | -| 75 | [주사위의 개수](https://school.programmers.co.kr/learn/courses/30/lessons/120845) | [주사위의 개수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/주사위의-개수&120845&.js) | -| 76 | [중복된 문자 제거](https://school.programmers.co.kr/learn/courses/30/lessons/120888) | [중복된 문자 제거.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/중복된-문자-제거&120888&.js) | -| 77 | [중복된 숫자 개수](https://school.programmers.co.kr/learn/courses/30/lessons/120583) | [중복된 숫자 개수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/중복된-숫자-개수&120583&.js) | -| 78 | [중앙값 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/120811) | [중앙값 구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/중앙값-구하기&120811&.js) | -| 79 | [직각삼각형 출력하기](https://school.programmers.co.kr/learn/courses/30/lessons/120823) | [직각삼각형 출력하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/직각삼각형-출력하기&120823&.js) | -| 80 | [직사각형 넓이 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/120860) | [직사각형 넓이 구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/직사각형-넓이-구하기&120860&.js) | -| 81 | [진료순서 정하기](https://school.programmers.co.kr/learn/courses/30/lessons/120835) | [진료순서 정하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/진료순서-정하기&120835&.js) | -| 82 | [짝수 홀수 개수](https://school.programmers.co.kr/learn/courses/30/lessons/120824) | [짝수 홀수 개수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/짝수-홀수-개수&120824&.js) | -| 83 | [짝수는 싫어요](https://school.programmers.co.kr/learn/courses/30/lessons/120813) | [짝수는 싫어요.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/짝수는-싫어요&120813&.js) | -| 84 | [짝수의 합](https://school.programmers.co.kr/learn/courses/30/lessons/120831) | [짝수의 합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/짝수의-합&120831&.js) | -| 85 | [최댓값 만들기(1)](https://school.programmers.co.kr/learn/courses/30/lessons/120847) | [최댓값 만들기(1).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/최댓값-만들기(1)&120847&.js) | -| 86 | [최댓값 만들기 (2)](https://school.programmers.co.kr/learn/courses/30/lessons/120862) | [최댓값 만들기 (2).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/최댓값-만들기-(2)&120862&.js) | -| 87 | [최빈값 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/120812) | [최빈값 구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/최빈값-구하기&120812&.js) | -| 88 | [치킨 쿠폰](https://school.programmers.co.kr/learn/courses/30/lessons/120884) | [치킨 쿠폰.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/치킨-쿠폰&120884&.js) | -| 89 | [캐릭터의 좌표](https://school.programmers.co.kr/learn/courses/30/lessons/120861) | [캐릭터의 좌표.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/캐릭터의-좌표&120861&.js) | -| 90 | [컨트롤 제트](https://school.programmers.co.kr/learn/courses/30/lessons/120853) | [컨트롤 제트.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/컨트롤-제트&120853&.js) | -| 91 | [특이한 정렬](https://school.programmers.co.kr/learn/courses/30/lessons/120880) | [특이한 정렬.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/특이한-정렬&120880&.js) | -| 92 | [특정 문자 제거하기](https://school.programmers.co.kr/learn/courses/30/lessons/120826) | [특정 문자 제거하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/특정-문자-제거하기&120826&.js) | -| 93 | [팩토리얼](https://school.programmers.co.kr/learn/courses/30/lessons/120848) | [팩토리얼.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/팩토리얼&120848&.js) | -| 94 | [편지](https://school.programmers.co.kr/learn/courses/30/lessons/120898) | [편지.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/편지&120898&.js) | -| 95 | [평행](https://school.programmers.co.kr/learn/courses/30/lessons/120875) | [평행.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/평행&120875&.js) | -| 96 | [피자 나눠 먹기 (1)](https://school.programmers.co.kr/learn/courses/30/lessons/120814) | [피자 나눠 먹기 (1).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/피자-나눠-먹기-(1)&120814&.js) | -| 97 | [피자 나눠 먹기 (2)](https://school.programmers.co.kr/learn/courses/30/lessons/120815) | [피자 나눠 먹기 (2).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/피자-나눠-먹기-(2)&120815&.js) | -| 98 | [피자 나눠 먹기 (3)](https://school.programmers.co.kr/learn/courses/30/lessons/120816) | [피자 나눠 먹기 (3).js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/피자-나눠-먹기-(3)&120816&.js) | -| 99 | [한 번만 등장한 문자](https://school.programmers.co.kr/learn/courses/30/lessons/120896) | [한 번만 등장한 문자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/한-번만-등장한-문자&120896&.js) | -| 100 | [합성수 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/120846) | [합성수 찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-0/합성수-찾기&120846&.js) | - - -### 🌱 Level 1 - -- 풀이 문제 수: 57문제 - -| 번호 | 문제 출처 | 풀이 | -| --- | ------- | --- | -| 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년&12901&.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진법-뒤집기&68935&.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번째수&42748&.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차]-다트-게임&17682&.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차]-비밀지도&17681&.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개의-숫자&12954&.js) | -| 7 | [가운데 글자 가져오기](https://school.programmers.co.kr/learn/courses/30/lessons/12903) | [가운데 글자 가져오기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/가운데-글자-가져오기&12903&.js) | -| 8 | [같은 숫자는 싫어](https://school.programmers.co.kr/learn/courses/30/lessons/12906) | [같은 숫자는 싫어.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/같은-숫자는-싫어&12906&.js) | -| 9 | [나누어 떨어지는 숫자 배열](https://school.programmers.co.kr/learn/courses/30/lessons/12910) | [나누어 떨어지는 숫자 배열.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/나누어-떨어지는-숫자-배열&12910&.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이-되는-수-찾기&87389&.js) | -| 11 | [내적](https://school.programmers.co.kr/learn/courses/30/lessons/70128) | [내적.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/내적&70128&.js) | -| 12 | [두 개 뽑아서 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/68644) | [두 개 뽑아서 더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/두-개-뽑아서-더하기&68644&.js) | -| 13 | [두 정수 사이의 합](https://school.programmers.co.kr/learn/courses/30/lessons/12912) | [두 정수 사이의 합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/두-정수-사이의-합&12912&.js) | -| 14 | [로또의 최고 순위와 최저 순위](https://school.programmers.co.kr/learn/courses/30/lessons/77484) | [로또의 최고 순위와 최저 순위.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/로또의-최고-순위와-최저-순위&77484&.js) | -| 15 | [모의고사](https://school.programmers.co.kr/learn/courses/30/lessons/42840) | [모의고사.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/모의고사&42840&.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의-개수&12916&.js) | -| 17 | [문자열 내 마음대로 정렬하기](https://school.programmers.co.kr/learn/courses/30/lessons/12915) | [문자열 내 마음대로 정렬하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-내-마음대로-정렬하기&12915&.js) | -| 18 | [문자열 내림차순으로 배치하기](https://school.programmers.co.kr/learn/courses/30/lessons/12917) | [문자열 내림차순으로 배치하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-내림차순으로-배치하기&12917&.js) | -| 19 | [문자열 다루기 기본](https://school.programmers.co.kr/learn/courses/30/lessons/12918) | [문자열 다루기 기본.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열-다루기-기본&12918&.js) | -| 20 | [문자열을 정수로 바꾸기](https://school.programmers.co.kr/learn/courses/30/lessons/12925) | [문자열을 정수로 바꾸기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/문자열을-정수로-바꾸기&12925&.js) | -| 21 | [부족한 금액 계산하기](https://school.programmers.co.kr/learn/courses/30/lessons/82612) | [부족한 금액 계산하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/부족한-금액-계산하기&82612&.js) | -| 22 | [서울에서 김서방 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/12919) | [서울에서 김서방 찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/서울에서-김서방-찾기&12919&.js) | -| 23 | [성격 유형 검사하기](https://school.programmers.co.kr/learn/courses/30/lessons/118666) | [성격 유형 검사하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/성격-유형-검사하기&118666&.js) | -| 24 | [소수 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/12977) | [소수 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/소수-만들기&12977&.js) | -| 25 | [소수 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/42839) | [소수 찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/소수-찾기&42839&.js) | -| 26 | [수박수박수박수박수박수?](https://school.programmers.co.kr/learn/courses/30/lessons/12922) | [수박수박수박수박수박수?.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/수박수박수박수박수박수?&12922&.js) | -| 27 | [숫자 문자열과 영단어](https://school.programmers.co.kr/learn/courses/30/lessons/81301) | [숫자 문자열과 영단어.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/숫자-문자열과-영단어&81301&.js) | -| 28 | [숫자 짝꿍](https://school.programmers.co.kr/learn/courses/30/lessons/131128) | [숫자 짝꿍.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/숫자-짝꿍&131128&.js) | -| 29 | [시저 암호](https://school.programmers.co.kr/learn/courses/30/lessons/12926) | [시저 암호.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/시저-암호&12926&.js) | -| 30 | [신고 결과 받기](https://school.programmers.co.kr/learn/courses/30/lessons/92334) | [신고 결과 받기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/신고-결과-받기&92334&.js) | -| 31 | [신규 아이디 추천](https://school.programmers.co.kr/learn/courses/30/lessons/72410) | [신규 아이디 추천.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/신규-아이디-추천&72410&.js) | -| 32 | [실패율](https://school.programmers.co.kr/learn/courses/30/lessons/42889) | [실패율.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/실패율&42889&.js) | -| 33 | [약수의 개수와 덧셈](https://school.programmers.co.kr/learn/courses/30/lessons/77884) | [약수의 개수와 덧셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/약수의-개수와-덧셈&77884&.js) | -| 34 | [약수의 합](https://school.programmers.co.kr/learn/courses/30/lessons/12928) | [약수의 합.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/약수의-합&12928&.js) | -| 35 | [없는 숫자 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/86051) | [없는 숫자 더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/없는-숫자-더하기&86051&.js) | -| 36 | [예산](https://school.programmers.co.kr/learn/courses/30/lessons/12982) | [예산.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/예산&12982&.js) | -| 37 | [완주하지 못한 선수](https://school.programmers.co.kr/learn/courses/30/lessons/42576) | [완주하지 못한 선수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/완주하지-못한-선수&42576&.js) | -| 38 | [음양 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/76501) | [음양 더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/음양-더하기&76501&.js) | -| 39 | [이상한 문자 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/12930) | [이상한 문자 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/이상한-문자-만들기&12930&.js) | -| 40 | [자릿수 더하기](https://school.programmers.co.kr/learn/courses/30/lessons/12931) | [자릿수 더하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/자릿수-더하기&12931&.js) | -| 41 | [자연수 뒤집어 배열로 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/12932) | [자연수 뒤집어 배열로 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/자연수-뒤집어-배열로-만들기&12932&.js) | -| 42 | [정수 내림차순으로 배치하기](https://school.programmers.co.kr/learn/courses/30/lessons/12933) | [정수 내림차순으로 배치하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/정수-내림차순으로-배치하기&12933&.js) | -| 43 | [정수 제곱근 판별](https://school.programmers.co.kr/learn/courses/30/lessons/12934) | [정수 제곱근 판별.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/정수-제곱근-판별&12934&.js) | -| 44 | [제일 작은 수 제거하기](https://school.programmers.co.kr/learn/courses/30/lessons/12935) | [제일 작은 수 제거하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/제일-작은-수-제거하기&12935&.js) | -| 45 | [직사각형 별찍기](https://school.programmers.co.kr/learn/courses/30/lessons/12969) | [직사각형 별찍기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/직사각형-별찍기&12969&.js) | -| 46 | [짝수와 홀수](https://school.programmers.co.kr/learn/courses/30/lessons/12937) | [짝수와 홀수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/짝수와-홀수&12937&.js) | -| 47 | [체육복](https://school.programmers.co.kr/learn/courses/30/lessons/42862) | [체육복.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/체육복&42862&.js) | -| 48 | [최대공약수와 최소공배수](https://school.programmers.co.kr/learn/courses/30/lessons/12940) | [최대공약수와 최소공배수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/최대공약수와-최소공배수&12940&.js) | -| 49 | [최소직사각형](https://school.programmers.co.kr/learn/courses/30/lessons/86491) | [최소직사각형.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/최소직사각형&86491&.js) | -| 50 | [콜라츠 추측](https://school.programmers.co.kr/learn/courses/30/lessons/12943) | [콜라츠 추측.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/콜라츠-추측&12943&.js) | -| 51 | [크레인 인형뽑기 게임](https://school.programmers.co.kr/learn/courses/30/lessons/64061) | [크레인 인형뽑기 게임.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/크레인-인형뽑기-게임&64061&.js) | -| 52 | [키패드 누르기](https://school.programmers.co.kr/learn/courses/30/lessons/67256) | [키패드 누르기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/키패드-누르기&67256&.js) | -| 53 | [평균 구하기](https://school.programmers.co.kr/learn/courses/30/lessons/12944) | [평균 구하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/평균-구하기&12944&.js) | -| 54 | [폰켓몬](https://school.programmers.co.kr/learn/courses/30/lessons/1845) | [폰켓몬.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/폰켓몬&1845&.js) | -| 55 | [하샤드 수](https://school.programmers.co.kr/learn/courses/30/lessons/12947) | [하샤드 수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/하샤드-수&12947&.js) | -| 56 | [핸드폰 번호 가리기](https://school.programmers.co.kr/learn/courses/30/lessons/12948) | [핸드폰 번호 가리기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/핸드폰-번호-가리기&12948&.js) | -| 57 | [행렬의 덧셈](https://school.programmers.co.kr/learn/courses/30/lessons/12950) | [행렬의 덧셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-1/행렬의-덧셈&12950&.js) | - - -### 🌱 Level 2 - -- 풀이 문제 수: 72문제 - -| 번호 | 문제 출처 | 풀이 | -| --- | ------- | --- | -| 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-나라의-숫자&12899&.js) | -| 2 | [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-2/2-x-n-타일링&12900&.js) | -| 3 | [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개-이하로-다른-비트&77885&.js) | -| 4 | [3 x n 타일링](https://school.programmers.co.kr/learn/courses/30/lessons/12902) | [3 x n 타일링.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/3-x-n-타일링&12902&.js) | -| 5 | [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&42747&.js) | -| 6 | [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-문자열-만들기&12951&.js) | -| 7 | [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-2/N-Queen&12952&.js) | -| 8 | [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개의-최소공배수&12953&.js) | -| 9 | [[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차]-뉴스-클러스터링&17677&.js) | -| 10 | [[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차]-캐시&17680&.js) | -| 11 | [[1차] 프렌즈4블록](https://school.programmers.co.kr/learn/courses/30/lessons/17679) | [[1차] 프렌즈4블록.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[1차]-프렌즈4블록&17679&.js) | -| 12 | [[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진수-게임&17687&.js) | -| 13 | [[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차]-방금그곡&17683&.js) | -| 14 | [[3차] 압축](https://school.programmers.co.kr/learn/courses/30/lessons/17684) | [[3차] 압축.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/[3차]-압축&17684&.js) | -| 15 | [[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차]-파일명-정렬&17686&.js) | -| 16 | [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진수에서-소수-개수-구하기&92335&.js) | -| 17 | [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-배열-자르기&87390&.js) | -| 18 | [가장 큰 수](https://school.programmers.co.kr/learn/courses/30/lessons/42746) | [가장 큰 수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/가장-큰-수&42746&.js) | -| 19 | [가장 큰 정사각형 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/12905) | [가장 큰 정사각형 찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/가장-큰-정사각형-찾기&12905&.js) | -| 20 | [거리두기 확인하기](https://school.programmers.co.kr/learn/courses/30/lessons/81302) | [거리두기 확인하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/거리두기-확인하기&81302&.js) | -| 21 | [게임 맵 최단거리](https://school.programmers.co.kr/learn/courses/30/lessons/1844) | [게임 맵 최단거리.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/게임-맵-최단거리&1844&.js) | -| 22 | [괄호 변환](https://school.programmers.co.kr/learn/courses/30/lessons/60058) | [괄호 변환.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/괄호-변환&60058&.js) | -| 23 | [괄호 회전하기](https://school.programmers.co.kr/learn/courses/30/lessons/76502) | [괄호 회전하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/괄호-회전하기&76502&.js) | -| 24 | [교점에 별 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/87377) | [교점에 별 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/교점에-별-만들기&87377&.js) | -| 25 | [구명보트](https://school.programmers.co.kr/learn/courses/30/lessons/42885) | [구명보트.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/구명보트&42885&.js) | -| 26 | [기능개발](https://school.programmers.co.kr/learn/courses/30/lessons/42586) | [기능개발.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/기능개발&42586&.js) | -| 27 | [다리를 지나는 트럭](https://school.programmers.co.kr/learn/courses/30/lessons/42583) | [다리를 지나는 트럭.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/다리를-지나는-트럭&42583&.js) | -| 28 | [다음 큰 숫자](https://school.programmers.co.kr/learn/courses/30/lessons/12911) | [다음 큰 숫자.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/다음-큰-숫자&12911&.js) | -| 29 | [두 큐 합 같게 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/118667) | [두 큐 합 같게 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/두-큐-합-같게-만들기&118667&.js) | -| 30 | [땅따먹기](https://school.programmers.co.kr/learn/courses/30/lessons/12913) | [땅따먹기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/땅따먹기&12913&.js) | -| 31 | [멀리 뛰기](https://school.programmers.co.kr/learn/courses/30/lessons/12914) | [멀리 뛰기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/멀리-뛰기&12914&.js) | -| 32 | [멀쩡한 사각형](https://school.programmers.co.kr/learn/courses/30/lessons/62048) | [멀쩡한 사각형.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/멀쩡한-사각형&62048&.js) | -| 33 | [메뉴 리뉴얼](https://school.programmers.co.kr/learn/courses/30/lessons/72411) | [메뉴 리뉴얼.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/메뉴-리뉴얼&72411&.js) | -| 34 | [모음사전](https://school.programmers.co.kr/learn/courses/30/lessons/84512) | [모음사전.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/모음사전&84512&.js) | -| 35 | [문자열 압축](https://school.programmers.co.kr/learn/courses/30/lessons/60057) | [문자열 압축.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/문자열-압축&60057&.js) | -| 36 | [방문 길이](https://school.programmers.co.kr/learn/courses/30/lessons/49994) | [방문 길이.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/방문-길이&49994&.js) | -| 37 | [배달](https://school.programmers.co.kr/learn/courses/30/lessons/12978) | [배달.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/배달&12978&.js) | -| 38 | [빛의 경로 사이클](https://school.programmers.co.kr/learn/courses/30/lessons/86052) | [빛의 경로 사이클.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/빛의-경로-사이클&86052&.js) | -| 39 | [삼각 달팽이](https://school.programmers.co.kr/learn/courses/30/lessons/68645) | [삼각 달팽이.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/삼각-달팽이&68645&.js) | -| 40 | [소수 찾기](https://school.programmers.co.kr/learn/courses/30/lessons/42839) | [소수 찾기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/소수-찾기&42839&.js) | -| 41 | [수식 최대화](https://school.programmers.co.kr/learn/courses/30/lessons/67257) | [수식 최대화.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/수식-최대화&67257&.js) | -| 42 | [순위 검색](https://school.programmers.co.kr/learn/courses/30/lessons/72412) | [순위 검색.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/순위-검색&72412&.js) | -| 43 | [숫자 블록](https://school.programmers.co.kr/learn/courses/30/lessons/12923) | [숫자 블록.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/숫자-블록&12923&.js) | -| 44 | [숫자의 표현](https://school.programmers.co.kr/learn/courses/30/lessons/12924) | [숫자의 표현.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/숫자의-표현&12924&.js) | -| 45 | [스킬트리](https://school.programmers.co.kr/learn/courses/30/lessons/49993) | [스킬트리.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/스킬트리&49993&.js) | -| 46 | [양궁대회](https://school.programmers.co.kr/learn/courses/30/lessons/92342) | [양궁대회.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/양궁대회&92342&.js) | -| 47 | [영어 끝말잇기](https://school.programmers.co.kr/learn/courses/30/lessons/12981) | [영어 끝말잇기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/영어-끝말잇기&12981&.js) | -| 48 | [예상 대진표](https://school.programmers.co.kr/learn/courses/30/lessons/12985) | [예상 대진표.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/예상-대진표&12985&.js) | -| 49 | [오픈채팅방](https://school.programmers.co.kr/learn/courses/30/lessons/42888) | [오픈채팅방.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/오픈채팅방&42888&.js) | -| 50 | [올바른 괄호](https://school.programmers.co.kr/learn/courses/30/lessons/12909) | [올바른 괄호.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/올바른-괄호&12909&.js) | -| 51 | [위장](https://school.programmers.co.kr/learn/courses/30/lessons/42578) | [위장.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/위장&42578&.js) | -| 52 | [이진 변환 반복하기](https://school.programmers.co.kr/learn/courses/30/lessons/70129) | [이진 변환 반복하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/이진-변환-반복하기&70129&.js) | -| 53 | [전력망을 둘로 나누기](https://school.programmers.co.kr/learn/courses/30/lessons/86971) | [전력망을 둘로 나누기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/전력망을-둘로-나누기&86971&.js) | -| 54 | [점프와 순간 이동](https://school.programmers.co.kr/learn/courses/30/lessons/12980) | [점프와 순간 이동.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/점프와-순간-이동&12980&.js) | -| 55 | [조이스틱](https://school.programmers.co.kr/learn/courses/30/lessons/42860) | [조이스틱.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/조이스틱&42860&.js) | -| 56 | [주차 요금 계산](https://school.programmers.co.kr/learn/courses/30/lessons/92341) | [주차 요금 계산.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/주차-요금-계산&92341&.js) | -| 57 | [줄 서는 방법](https://school.programmers.co.kr/learn/courses/30/lessons/12936) | [줄 서는 방법.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/줄-서는-방법&12936&.js) | -| 58 | [짝지어 제거하기](https://school.programmers.co.kr/learn/courses/30/lessons/12973) | [짝지어 제거하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/짝지어-제거하기&12973&.js) | -| 59 | [최댓값과 최솟값](https://school.programmers.co.kr/learn/courses/30/lessons/12939) | [최댓값과 최솟값.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/최댓값과-최솟값&12939&.js) | -| 60 | [최솟값 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/12941) | [최솟값 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/최솟값-만들기&12941&.js) | -| 61 | [카펫](https://school.programmers.co.kr/learn/courses/30/lessons/42842) | [카펫.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/카펫&42842&.js) | -| 62 | [쿼드압축 후 개수 세기](https://school.programmers.co.kr/learn/courses/30/lessons/68936) | [쿼드압축 후 개수 세기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/쿼드압축-후-개수-세기&68936&.js) | -| 63 | [큰 수 만들기](https://school.programmers.co.kr/learn/courses/30/lessons/42883) | [큰 수 만들기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/큰-수-만들기&42883&.js) | -| 64 | [타겟 넘버](https://school.programmers.co.kr/learn/courses/30/lessons/43165) | [타겟 넘버.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/타겟-넘버&43165&.js) | -| 65 | [튜플](https://school.programmers.co.kr/learn/courses/30/lessons/64065) | [튜플.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/튜플&64065&.js) | -| 66 | [프린터](https://school.programmers.co.kr/learn/courses/30/lessons/42587) | [프린터.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/프린터&42587&.js) | -| 67 | [피로도](https://school.programmers.co.kr/learn/courses/30/lessons/87946) | [피로도.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/피로도&87946&.js) | -| 68 | [피보나치 수](https://school.programmers.co.kr/learn/courses/30/lessons/12945) | [피보나치 수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/피보나치-수&12945&.js) | -| 69 | [하노이의 탑](https://school.programmers.co.kr/learn/courses/30/lessons/12946) | [하노이의 탑.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/하노이의-탑&12946&.js) | -| 70 | [행렬 테두리 회전하기](https://school.programmers.co.kr/learn/courses/30/lessons/77485) | [행렬 테두리 회전하기.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/행렬-테두리-회전하기&77485&.js) | -| 71 | [행렬의 곱셈](https://school.programmers.co.kr/learn/courses/30/lessons/12949) | [행렬의 곱셈.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/행렬의-곱셈&12949&.js) | -| 72 | [후보키](https://school.programmers.co.kr/learn/courses/30/lessons/42890) | [후보키.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-2/후보키&42890&.js) | - - -### 🌱 Level 3 - -- 풀이 문제 수: 9문제 - -| 번호 | 문제 출처 | 풀이 | -| --- | ------- | --- | -| 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-타일링&12900&.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&12952&.js) | -| 3 | [가장 먼 노드](https://school.programmers.co.kr/learn/courses/30/lessons/49189) | [가장 먼 노드.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/가장-먼-노드&49189&.js) | -| 4 | [네트워크](https://school.programmers.co.kr/learn/courses/30/lessons/43162) | [네트워크.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/네트워크&43162&.js) | -| 5 | [단속카메라](https://school.programmers.co.kr/learn/courses/30/lessons/42884) | [단속카메라.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/단속카메라&42884&.js) | -| 6 | [베스트앨범](https://school.programmers.co.kr/learn/courses/30/lessons/42579) | [베스트앨범.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/베스트앨범&42579&.js) | -| 7 | [여행경로](https://school.programmers.co.kr/learn/courses/30/lessons/43164) | [여행경로.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/여행경로&43164&.js) | -| 8 | [이중우선순위큐](https://school.programmers.co.kr/learn/courses/30/lessons/42628) | [이중우선순위큐.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/이중우선순위큐&42628&.js) | -| 9 | [입국심사](https://school.programmers.co.kr/learn/courses/30/lessons/43238) | [입국심사.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-3/입국심사&43238&.js) | - - -### 🌱 Level 4 - -- 풀이 문제 수: 4문제 - -| 번호 | 문제 출처 | 풀이 | -| --- | ------- | --- | -| 1 | [가사 검색.js](https://school.programmers.co.kr/learn/courses/30/lessons/undefined) | [가사 검색.js.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-4/가사-검색.js) | -| 2 | [단어 퍼즐](https://school.programmers.co.kr/learn/courses/30/lessons/12983) | [단어 퍼즐.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-4/단어-퍼즐&12983&.js) | -| 3 | [무지의 먹방 라이브.js](https://school.programmers.co.kr/learn/courses/30/lessons/undefined) | [무지의 먹방 라이브.js.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-4/무지의-먹방-라이브.js) | -| 4 | [올바른 괄호의 갯수](https://school.programmers.co.kr/learn/courses/30/lessons/12929) | [올바른 괄호의 갯수.js](https://github.com/codeisneverodd/programmers-coding-test/blob/main/level-4/올바른-괄호의-갯수&12929&.js) | - - - - -## 🙏🏻 아직 풀리지 않은 문제의 해답을 추가해 주세요! -### 커밋 컨벤션 - -| 접두어 | 작업 내용 | -| -------- | ----------------------------------- | -| feat | 풀이 추가 등 코드 수정 | -| fix | 모든 종류의 오류 수정 | -| docs | 문서 수정(코드 수정 없음) | -| etc | 위의 경우들에 해당 하지 경우 | - -### 🌱 기여 방법 - -1. Fork 한 후 본인의 해설을 추가합니다. -2. 본인의 저장소에서 이곳으로 PR을 한다. - -### 🔥 필수 확인 사항 -1. 파일 이름은 공백이 없어야하며, 공백은 - 로 채웁니다. 문제풀이 창에서 문제 이름을 복사하여 사용하는 것을 권장합니다. - -- 예시) 가장 먼 노드 => 가장-먼-노드.js // [1차] 뉴스 클러스터링 => [1차]-뉴스-클러스터링 - -2. 새로운 파일을 추가할 시, 00-해답-예시.js 파일을 복제해서 사용할 것을 권장합니다. - -3. 기존 파일에 풀이를 추가할 시, 다른 사람과의 주석 컨벤션을 맞춥니다. +- 문제 업로드 방식 개선과 정답 관리를 위해 **기존 README 방식에서 [🔎 검색 사이트](https://codeisneverodd-home.vercel.app/solution-pass)에서 검색하는 방식으로** 바뀌었어요! +- 문제 목록과 정답은 [이 파일들](https://github.com/codeisneverodd/programmers-coding-test/tree/main-v2/data)로 관리되고 있어요. GitHub API를 이용해서 해당 파일을 자유롭게 사용해도 좋아요! 단, 코드를 보여주는 경우 반드시 아래 저작권을 따라주세요. ## 👉 저작권 해당 Repository의 해답을 자신의 저작물에 추가할 수 있지만 **반드시** 본 Repository의 주소 `https://github.com/codeisneverodd/programmers-coding-test` -를 명시하여야합니다. \ No newline at end of file +를 명시하여야합니다. + +## 📃 Types and Example +저와 같이 우리 레포의 데이터를 활용하고 싶으신 분들을 위해 타입과 간단한 예제를 남겨놓을게요! + +### Fetch 예제 +axios나 tanstack query 등 라이브러리 사용에 익숙하지 않거나 TypeScript에 익숙하지 않은 분들을 위한 간단한 예제에요. +```js +const DATA_ENDPOINT = + "https://raw.githubusercontent.com/codeisneverodd/programmers-coding-test/main-v2/data"; + +export const getProbs = async () => { + const res = await fetch(`${DATA_ENDPOINT}/problems.json`); + return res.json(); +}; + +export const getSols = async () => { + const res = await fetch(`${DATA_ENDPOINT}/solutions.json`); + return res.json(); +}; + +``` + + +### TypeScript & Tanstack Query(React Query) 예제 +우리 레포에서 오는 값을 사용할 수 있는 custom hook 인 `useRepo`를 만드는 예제에요. + +```ts +import { useQuery } from "@tanstack/react-query"; +import axios from "axios"; + +const DATA_ENDPOINT = + "https://raw.githubusercontent.com/codeisneverodd/programmers-coding-test/main-v2/data"; + +export default function useRepo() { + const probsQuery = useQuery({ + queryKey: ["repo", "sols"], + queryFn: async () => { + const res = await axios.get(`${DATA_ENDPOINT}/problems.json`); + return res.data; + } + }); + const solsQuery = useQuery({ + queryKey: ["repo", "probs"], + queryFn: async () => { + const res = await axios.get(`${DATA_ENDPOINT}/solutions.json`); + return res.data; + } + }); + + return { probsQuery, solsQuery }; +} + +export type Prob = { + id: string; + title: string; + solvedCount: number; +}; + +export type Sol = { + id: string; + author: string; + code: string; + probId: string; + createdAt: ReturnType; + lang: Lang; +}; + +export type Lang = "JavaScript" | "Python"; + +``` diff --git a/api.json b/api.json deleted file mode 100644 index e855f83..0000000 --- a/api.json +++ /dev/null @@ -1,1936 +0,0 @@ -[ - { - "id": "120842", - "name": "2차원으로 만들기", - "fileName": "2차원으로-만들기&120842&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num_list, n) {\n let result = [];\n for (let i = 0; i < num_list.length / n; i++) {\n result = [...result, num_list.slice(i * n, i * n + n)];\n }\n return result;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120842" - }, - { - "id": "120891", - "name": "369게임", - "fileName": "369게임&120891&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(order) {\n return [...('' + order)].filter(num => num === '3' || num === '6' || num === '9').length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120891" - }, - { - "id": "120912", - "name": "7의 개수", - "fileName": "7의-개수&120912&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(array) {\n return [...array.join('')].filter(a => a === '7').length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120912" - }, - { - "id": "120886", - "name": "A로 B 만들기", - "fileName": "A로-B-만들기&120886&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(before, after) {\n const sort = str => [...str].sort((a, b) => (a < b ? -1 : a !== b ? 1 : 0)).join('');\n return sort(before) === sort(after) ? 1 : 0;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120886" - }, - { - "id": "120907", - "name": "OX퀴즈", - "fileName": "OX퀴즈&120907&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(quiz) {\n return quiz.map(q => {\n const [formula, answer] = q.split('=');\n return eval(formula) === +answer ? 'O' : 'X';\n });\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120907" - }, - { - "id": "120887", - "name": "k의 개수", - "fileName": "k의-개수&120887&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(i, j, k) {\n let count = 0;\n for (let num = i; num <= j; num++) {\n count += [...('' + num)].filter(n => +n === k).length;\n }\n return count;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120887" - }, - { - "id": "120905", - "name": "n의 배수 고르기", - "fileName": "n의-배수-고르기&120905&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n, numlist) {\n return numlist.filter(num => num % n === 0);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120905" - }, - { - "id": "120890", - "name": "가까운 수", - "fileName": "가까운-수&120890&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(array, n) {\n const minDiff = Math.min(...array.map(a => Math.abs(a - n)));\n return array.sort((a, b) => a - b).find(a => Math.abs(a - n) === minDiff);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120890" - }, - { - "id": "120839", - "name": "가위 바위 보", - "fileName": "가위-바위-보&120839&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(rsp) {\n const win = { 0: 5, 2: 0, 5: 2 };\n return [...rsp].map(num => win[num]).join('');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120839" - }, - { - "id": "120899", - "name": "가장 큰 수 찾기", - "fileName": "가장-큰-수-찾기&120899&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(array) {\n const max = Math.max(...array);\n return [max, array.indexOf(max)];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120899" - }, - { - "id": "120829", - "name": "각도기", - "fileName": "각도기&120829&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(angle) {\n if (angle === 180) return 4;\n if (angle > 90) return 3;\n if (angle === 90) return 2;\n return 1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120829" - }, - { - "id": "120837", - "name": "개미 군단", - "fileName": "개미-군단&120837&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(hp) {\n const first = Math.floor(hp / 5);\n const second = Math.floor((hp - first * 5) / 3);\n const third = hp - first * 5 - second * 3;\n return first + second + third;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120837" - }, - { - "id": "120876", - "name": "겹치는 선분의 길이", - "fileName": "겹치는-선분의-길이&120876&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(lines) {\n const visited = lines.reduce((a, [x, y]) => {\n for (let i = Math.min(x, y) + 1; i <= Math.max(x, y); i++) a[i] = a[i] ? a[i] + 1 : 1;\n return a;\n }, {});\n\n return Object.values(visited).filter(v => v > 1).length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120876" - }, - { - "id": "120843", - "name": "공 던지기", - "fileName": "공-던지기&120843&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers, k) {\n const goNext = current => (current + 2) % numbers.length;\n let current = 0;\n for (let i = 0; i < k - 1; i++) current = goNext(current);\n return numbers[current];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120843" - }, - { - "id": "120840", - "name": "구슬을 나누는 경우의 수", - "fileName": "구슬을-나누는-경우의-수&120840&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(balls, share) {\n const [n, m] = [balls, share];\n const fact = [BigInt(1), BigInt(1)];\n\n for (let i = 2; i <= n; i++) fact[i] = fact[i - 1] * BigInt(i);\n\n return Number(fact[n] / (fact[n - m] * fact[m]));\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120840" - }, - { - "id": "120810", - "name": "나머지 구하기", - "fileName": "나머지-구하기&120810&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num1, num2) {\n return num1 % num2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120810" - }, - { - "id": "120820", - "name": "나이 출력", - "fileName": "나이-출력&120820&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(age) {\n return 2022 - age + 1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120820" - }, - { - "id": "120924", - "name": "다음에 올 숫자", - "fileName": "다음에-올-숫자&120924&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(common) {\n const isAP = arr => arr[2] - arr[1] === arr[1] - arr[0];\n return isAP(common)\n ? common[common.length - 1] + common[1] - common[0]\n : common[common.length - 1] * (common[1] / common[0]);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120924" - }, - { - "id": "120863", - "name": "다항식 더하기", - "fileName": "다항식-더하기&120863&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(polynomial) {\n const countX = x => {\n const count = x.replaceAll('x', '');\n return count === '' ? 1 : +count;\n };\n\n const count = polynomial\n .split(' + ')\n .reduce((a, c) => (c.includes('x') ? { ...a, x: a.x + countX(c) } : { ...a, num: a.num + +c }), {\n x: 0,\n num: 0,\n });\n\n const x = count.x > 0 ? `${count.x > 1 ? count.x : ''}x` : '';\n const num = count.num > 0 ? '' + count.num : '';\n const plus = x !== '' && num !== '' ? ' + ' : '';\n\n return x + plus + num;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120863" - }, - { - "id": "120893", - "name": "대문자와 소문자", - "fileName": "대문자와-소문자&120893&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n return [...my_string].map(char => (char === char.toUpperCase() ? char.toLowerCase() : char.toUpperCase())).join('');\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120893" - }, - { - "id": "120804", - "name": "두 수의 곱", - "fileName": "두-수의-곱&120804&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num1, num2) {\n return num1 * num2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120804" - }, - { - "id": "120806", - "name": "두 수의 나눗셈", - "fileName": "두-수의-나눗셈&120806&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num1, num2) {\n return Math.floor((num1 / num2) * 1000);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120806" - }, - { - "id": "120803", - "name": "두 수의 차", - "fileName": "두-수의-차&120803&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num1, num2) {\n return num1 - num2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120803" - }, - { - "id": "120802", - "name": "두 수의 합", - "fileName": "두-수의-합&120802&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num1, num2) {\n return num1 + num2\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120802" - }, - { - "id": "120882", - "name": "등수 매기기", - "fileName": "등수-매기기&120882&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(score) {\n const avgs = score.map(([a, b]) => (a + b) / 2);\n const avgRank = [...avgs]\n .sort((a, b) => b - a)\n .map((avg, i) => ({ avg, rank: i + 1 }))\n .map((a, i, arr) => (i > 0 && a.avg === arr[i - 1].avg ? { ...a, rank: arr[i - 1].rank } : a));\n\n return avgs.map(_avg => avgRank.find(({ avg }) => _avg === avg).rank);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120882" - }, - { - "id": "120883", - "name": "로그인 성공?", - "fileName": "로그인-성공?&120883&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(id_pw, db) {\n const [id, pw] = id_pw;\n if (!db.find(([_id]) => _id === id)) return 'fail';\n return db.find(([_id, _pw]) => _id === id && _pw === pw) ? 'login' : 'wrong pw';\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120883" - }, - { - "id": "120585", - "name": "머쓱이보다 키 큰 사람", - "fileName": "머쓱이보다-키-큰-사람&120585&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(array, height) {\n return array.filter(a => a > height).length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120585" - }, - { - "id": "120838", - "name": "모스부호 (1)", - "fileName": "모스부호-(1)&120838&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(letter) {\n const morse = { \n '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',\n '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',\n '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',\n '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',\n '-.--':'y','--..':'z'\n }\n return letter\n .split(' ')\n .map(l => morse[l])\n .join('');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120838" - }, - { - "id": "120849", - "name": "모음 제거", - "fileName": "모음-제거&120849&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n return my_string.replace(/[aeiou]/g, '');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120849" - }, - { - "id": "120805", - "name": "몫 구하기", - "fileName": "몫-구하기&120805&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num1, num2) {\n return Math.floor(num1 / num2);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120805" - }, - { - "id": "120825", - "name": "문자 반복 출력하기", - "fileName": "문자-반복-출력하기&120825&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string, n) {\n return [...my_string].map(char => char.repeat(n)).join('');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120825" - }, - { - "id": "120902", - "name": "문자열 계산하기", - "fileName": "문자열-계산하기&120902&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n return eval(my_string);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120902" - }, - { - "id": "120822", - "name": "문자열 뒤집기", - "fileName": "문자열-뒤집기&120822&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n return [...my_string].reverse().join('');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120822" - }, - { - "id": "120921", - "name": "문자열 밀기", - "fileName": "문자열-밀기&120921&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(A, B) {\n const pushRight = str => [str[str.length - 1], ...str.slice(0, str.length - 1)].join('');\n for (let i = 0; i <= A.length; i++) {\n if (A === B) return i;\n A = pushRight(A);\n }\n\n return -1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120921" - }, - { - "id": "120850", - "name": "문자열 정렬하기 (1)", - "fileName": "문자열-정렬하기-(1)&120850&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n return my_string\n .match(/[0-9]/g)\n .map(str => +str)\n .sort((a, b) => a - b);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120850" - }, - { - "id": "120911", - "name": "문자열 정렬하기 (2)", - "fileName": "문자열-정렬하기-(2)&120911&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n return [...my_string]\n .map(char => char.toLowerCase())\n .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))\n .join('');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120911" - }, - { - "id": "120908", - "name": "문자열안에 문자열", - "fileName": "문자열안에-문자열&120908&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(str1, str2) {\n return str1.includes(str2) ? 1 : 2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120908" - }, - { - "id": "120809", - "name": "배열 두 배 만들기", - "fileName": "배열-두-배-만들기&120809&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers) {\n return numbers.map(n => n * 2);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120809" - }, - { - "id": "120821", - "name": "배열 뒤집기", - "fileName": "배열-뒤집기&120821&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num_list) {\n return num_list.reverse();\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120821" - }, - { - "id": "120854", - "name": "배열 원소의 길이", - "fileName": "배열-원소의-길이&120854&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(strlist) {\n return strlist.map(s => s.length);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120854" - }, - { - "id": "120833", - "name": "배열 자르기", - "fileName": "배열-자르기&120833&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers, num1, num2) {\n return numbers.slice(num1, num2 + 1);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120833" - }, - { - "id": "120844", - "name": "배열 회전시키기", - "fileName": "배열-회전시키기&120844&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers, direction) {\n return direction === 'right'\n ? [numbers[numbers.length - 1], ...numbers.slice(0, numbers.length - 1)]\n : [...numbers.slice(1), numbers[0]];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120844" - }, - { - "id": "120903", - "name": "배열의 유사도", - "fileName": "배열의-유사도&120903&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s1, s2) {\n return s1.filter(s => s2.includes(s)).length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120903" - }, - { - "id": "120817", - "name": "배열의 평균값", - "fileName": "배열의-평균값&120817&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers) {\n return numbers.reduce((a, c) => a + c, 0) / numbers.length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120817" - }, - { - "id": "120808", - "name": "분수의 덧셈", - "fileName": "분수의-덧셈&120808&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(denum1, num1, denum2, num2) {\n const denum = denum2 * num1 + denum1 * num2;\n const num = num1 * num2;\n const getGCD = (a, b) => (b === 0 ? a : getGCD(b, a % b));\n const gcd = getGCD(denum, num);\n return [denum / gcd, num / gcd];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120808" - }, - { - "id": "120889", - "name": "삼각형의 완성조건 (1)", - "fileName": "삼각형의-완성조건-(1)&120889&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(sides) {\n const max = Math.max(...sides);\n return max < sides.reduce((a, c) => a + c, 0) - max ? 1 : 2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120889" - }, - { - "id": "120868", - "name": "삼각형의 완성조건 (2)", - "fileName": "삼각형의-완성조건-(2)&120868&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(sides) {\n const min = Math.min(...sides);\n const max1 = Math.max(...sides);\n const max2 = min + max1 - 1;\n return max2 - (max1 - min);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120868" - }, - { - "id": "120910", - "name": "세균 증식", - "fileName": "세균-증식&120910&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n, t) {\n return n * 2 ** t;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120910" - }, - { - "id": "120852", - "name": "소인수분해", - "fileName": "소인수분해&120852&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n let pFactors = [];\n for (let i = 2; i <= Math.sqrt(n); i++) {\n while (n % i === 0) {\n pFactors = [...pFactors, i];\n n /= i;\n }\n }\n if (n >= 2) pFactors = [...pFactors, n];\n return [...new Set(pFactors)].sort((a, b) => a - b);\n}\n\nconst funcB = () => {\n return new Promise(resolve => {\n setTimeout(resolve('guys'), 1000);\n });\n};\n\nconst funcC = async () => {\n const m = 1;\n const res = await funcB();\n return res;\n};\nwindow.addEventListener('DOMContentLoaded', async () => {\n console.log(await funcC());\n});\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120852" - }, - { - "id": "120836", - "name": "순서쌍의 개수", - "fileName": "순서쌍의-개수&120836&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n let count = 0;\n for (let i = 1; i < Math.sqrt(n); i++) {\n if (n % i === 0) count += 2;\n }\n if (n % Math.sqrt(n) === 0) count += 1;\n return count;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120836" - }, - { - "id": "120851", - "name": "숨어있는 숫자의 덧셈 (1)", - "fileName": "숨어있는-숫자의-덧셈-(1)&120851&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n return my_string.match(/[0-9]/g).reduce((a, c) => a + +c, 0);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120851" - }, - { - "id": "120864", - "name": "숨어있는 숫자의 덧셈 (2)", - "fileName": "숨어있는-숫자의-덧셈-(2)&120864&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n const nums = my_string.match(/[0-9]+/g);\n return nums ? nums.map(num => +num).reduce((a, c) => a + c, 0) : 0;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120864" - }, - { - "id": "120807", - "name": "숫자 비교하기", - "fileName": "숫자-비교하기&120807&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num1, num2) {\n return num1 === num2 ? 1 : -1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120807" - }, - { - "id": "120904", - "name": "숫자 찾기", - "fileName": "숫자-찾기&120904&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num, k) {\n const index = [...('' + num)].findIndex(n => +n === k);\n return index === -1 ? -1 : index + 1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120904" - }, - { - "id": "120819", - "name": "아이스 아메리카노", - "fileName": "아이스-아메리카노&120819&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(money) {\n return [Math.floor(money / 5500), money % 5500];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120819" - }, - { - "id": "120866", - "name": "안전지대", - "fileName": "안전지대&120866&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(board) {\n const isBombNearby = (r, c) => {\n const nearby = [\n [-1, -1],\n [-1, 0],\n [-1, 1],\n [0, -1],\n [0, 1],\n [1, -1],\n [1, 0],\n [1, 1],\n ];\n\n const isInBoard = (r, c) => r >= 0 && r < board.length && c >= 0 && c < board.length;\n\n return nearby.some(([dR, dC]) => isInBoard(r + dR, c + dC) && board[r + dR][c + dC] === 1);\n };\n\n let count = 0;\n\n for (let r = 0; r < board.length; r++) {\n for (let c = 0; c < board.length; c++) {\n if (board[r][c] !== 1 && !isBombNearby(r, c)) count += 1;\n }\n }\n return count;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120866" - }, - { - "id": "120892", - "name": "암호 해독", - "fileName": "암호-해독&120892&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(cipher, code) {\n return [...cipher].reduce((a, c, i) => ((i + 1) % code === 0 ? a + c : a), '');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120892" - }, - { - "id": "120897", - "name": "약수 구하기", - "fileName": "약수-구하기&120897&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n let answer = [];\n for (let i = 1; i < Math.sqrt(n); i++) {\n if (n % i === 0) answer = [...answer, i, n / i];\n }\n if (Number.isInteger(Math.sqrt(n))) answer = [...answer, Math.sqrt(n)];\n return answer.sort((a, b) => a - b);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120897" - }, - { - "id": "120830", - "name": "양꼬치", - "fileName": "양꼬치&120830&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n, k) {\n return n * 12000 + (k - Math.floor(n / 10)) * 2000;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120830" - }, - { - "id": "120923", - "name": "연속된 수의 합", - "fileName": "연속된-수의-합&120923&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num, total) {\n const numArr = Array.from({ length: num }, (_, i) => i);\n const sum = numArr.reduce((a, c) => a + c);\n return numArr.map(n => n - (sum - total) / num);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120923" - }, - { - "id": "120894", - "name": "영어가 싫어요", - "fileName": "영어가-싫어요&120894&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers) {\n const nums = { zero: 0, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9 };\n const regex = new RegExp(Object.keys(nums).join('|'), 'g');\n return +numbers.replace(regex, key => nums[key]);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120894" - }, - { - "id": "120818", - "name": "옷가게 할인 받기", - "fileName": "옷가게-할인-받기&120818&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(price) {\n if (price >= 500000) return Math.floor(price * 0.8);\n if (price >= 300000) return Math.floor(price * 0.9);\n if (price >= 100000) return Math.floor(price * 0.95);\n return price;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120818" - }, - { - "id": "120956", - "name": "옹알이", - "fileName": "옹알이&120956&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(babbling) {\n const convertPWordsToNum = word => {\n const pWords = ['aya', 'ye', 'woo', 'ma'];\n return pWords.reduce((result, pWord, i) => result.replaceAll(pWord, i), word);\n };\n const canPronounce = word => {\n const result = convertPWordsToNum(word);\n return !/[^\\d]/.test(result) && [...result].every((num, i) => i + 1 > result.length || num !== result[i + 1]);\n };\n\n return babbling.filter(b => canPronounce(b)).length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120956" - }, - { - "id": "120869", - "name": "외계어 사전", - "fileName": "외계어-사전&120869&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(spell, dic) {\n const sort = str => [...str].sort((a, b) => (a < b ? -1 : a !== b ? 1 : 0)).join('');\n return dic.find(dic => sort(dic) === sort(spell.join(''))) ? 1 : 2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120869" - }, - { - "id": "120834", - "name": "외계행성의 나이", - "fileName": "외계행성의-나이&120834&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(age) {\n return [...('' + age)].map(num => String.fromCharCode('a'.charCodeAt(0) + +num)).join('');\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120834" - }, - { - "id": "120878", - "name": "유한소수 판별하기", - "fileName": "유한소수-판별하기&120878&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(a, b) {\n const getGCD = (a, b) => {\n let gcd = 1;\n for (let i = 1; i <= Math.min(a, b); i++) {\n if (a % i === 0 && b % i === 0) gcd = i;\n }\n return gcd;\n };\n\n const getPrimeFactors = num => {\n let pFactors = [];\n for (let i = 2; i <= Math.sqrt(num); i++) {\n while (num % i === 0) {\n pFactors = [...pFactors, i];\n num /= i;\n }\n }\n if (num > 2) pFactors = [...pFactors, num];\n return pFactors;\n };\n\n return getPrimeFactors(b / getGCD(a, b)).find(n => n !== 2 && n !== 5) ? 2 : 1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120878" - }, - { - "id": "120885", - "name": "이진수 더하기", - "fileName": "이진수-더하기&120885&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(bin1, bin2) {\n return (parseInt(bin1, 2) + parseInt(bin2, 2)).toString(2);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120885" - }, - { - "id": "120895", - "name": "인덱스 바꾸기", - "fileName": "인덱스-바꾸기&120895&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string, num1, num2) {\n const str = [...my_string];\n\n [str[num1], str[num2]] = [str[num2], str[num1]];\n\n return str.join('');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120895" - }, - { - "id": "120906", - "name": "자릿수 더하기", - "fileName": "자릿수-더하기&120906&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n return [...('' + n)].map(num => +num).reduce((a, c) => a + c, 0);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120906" - }, - { - "id": "120913", - "name": "잘라서 배열로 저장하기", - "fileName": "잘라서-배열로-저장하기&120913&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_str, n) {\n let result = [];\n for (let i = 0; i < my_str.length / n; i++) result = [...result, my_str.slice(i * n, i * n + n)];\n return result;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120913" - }, - { - "id": "120871", - "name": "저주의 숫자 3", - "fileName": "저주의-숫자-3&120871&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n let num = 0;\n let count = 0;\n\n while (count < n) {\n num += 1;\n if (!('' + num).includes('3') && num % 3 !== 0) count += 1;\n }\n\n return num;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120871" - }, - { - "id": "120841", - "name": "점의 위치 구하기", - "fileName": "점의-위치-구하기&120841&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(dot) {\n const [x, y] = dot;\n if (y > 0) return x > 0 ? 1 : 2;\n return x < 0 ? 3 : 4;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120841" - }, - { - "id": "120909", - "name": "제곱수 판별하기", - "fileName": "제곱수-판별하기&120909&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n return Number.isInteger(Math.sqrt(n)) ? 1 : 2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120909" - }, - { - "id": "120922", - "name": "종이 자르기", - "fileName": "종이-자르기&120922&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(M, N) {\n return M * N - 1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120922" - }, - { - "id": "120845", - "name": "주사위의 개수", - "fileName": "주사위의-개수&120845&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(box, n) {\n return Math.floor(box[0] / n) * Math.floor(box[1] / n) * Math.floor(box[2] / n);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120845" - }, - { - "id": "120888", - "name": "중복된 문자 제거", - "fileName": "중복된-문자-제거&120888&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string) {\n return [...new Set(my_string)].join('');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120888" - }, - { - "id": "120583", - "name": "중복된 숫자 개수", - "fileName": "중복된-숫자-개수&120583&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(array, n) {\n return array.filter(a => a === n).length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120583" - }, - { - "id": "120811", - "name": "중앙값 구하기", - "fileName": "중앙값-구하기&120811&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(array) {\n return array.sort((a, b) => a - b)[Math.floor(array.length / 2)];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120811" - }, - { - "id": "120823", - "name": "직각삼각형 출력하기", - "fileName": "직각삼각형-출력하기&120823&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nconst readline = require('readline');\nconst rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n});\n\nlet input = [];\n\nrl.on('line', function (line) {\n input = line.split(' ');\n}).on('close', function () {\n for (let i = 1; i <= +input[0]; i++) console.log('*'.repeat(i));\n});\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120823" - }, - { - "id": "120860", - "name": "직사각형 넓이 구하기", - "fileName": "직사각형-넓이-구하기&120860&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(dots) {\n const xDots = dots.flatMap(([x, y]) => x);\n const yDots = dots.flatMap(([x, y]) => y);\n const width = Math.max(...xDots) - Math.min(...xDots);\n const height = Math.max(...yDots) - Math.min(...yDots);\n return width * height;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120860" - }, - { - "id": "120835", - "name": "진료순서 정하기", - "fileName": "진료순서-정하기&120835&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(emergency) {\n const sorted = [...emergency].sort((a, b) => b - a);\n return emergency.map(e => sorted.findIndex(s => s === e) + 1);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120835" - }, - { - "id": "120824", - "name": "짝수 홀수 개수", - "fileName": "짝수-홀수-개수&120824&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(num_list) {\n const evenLength = num_list.filter(n => n % 2 === 0).length;\n return [evenLength, num_list.length - evenLength];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120824" - }, - { - "id": "120813", - "name": "짝수는 싫어요", - "fileName": "짝수는-싫어요&120813&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n let nums = [];\n for (let i = 0; i <= n; i++) {\n if (i % 2 === 1) nums = [...nums, i];\n }\n return nums;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120813" - }, - { - "id": "120831", - "name": "짝수의 합", - "fileName": "짝수의-합&120831&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n let answer = 0;\n for (let i = 0; i <= n; i++) {\n if (i % 2 === 0) answer += i;\n }\n return answer;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120831" - }, - { - "id": "120847", - "name": "최댓값 만들기(1)", - "fileName": "최댓값-만들기(1)&120847&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers) {\n const [first, second, ...rest] = numbers.sort((a, b) => b - a);\n return first * second;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120847" - }, - { - "id": "120862", - "name": "최댓값 만들기 (2)", - "fileName": "최댓값-만들기-(2)&120862&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers) {\n const sorted = numbers.sort((a, b) => a - b);\n return Math.max(sorted[0] * sorted[1], sorted[sorted.length - 1] * sorted[sorted.length - 2]);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120862" - }, - { - "id": "120812", - "name": "최빈값 구하기", - "fileName": "최빈값-구하기&120812&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(array) {\n const counts = array.reduce((a, c) => (a[c] ? { ...a, [c]: a[c] + 1 } : { ...a, [c]: 1 }), {});\n const max = Math.max(...Object.values(counts));\n const modes = Object.keys(counts).filter(key => counts[key] === max);\n return modes.length === 1 ? +modes[0] : -1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120812" - }, - { - "id": "120884", - "name": "치킨 쿠폰", - "fileName": "치킨-쿠폰&120884&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(chicken) {\n const order = coupons => {\n if (coupons < 10) return 0;\n const service = Math.floor(coupons / 10);\n return service + order(service + (coupons % 10));\n };\n return order(chicken);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120884" - }, - { - "id": "120861", - "name": "캐릭터의 좌표", - "fileName": "캐릭터의-좌표&120861&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(keyinput, board) {\n const moves = {\n up: [0, 1],\n down: [0, -1],\n left: [-1, 0],\n right: [1, 0],\n };\n const [rangeX, rangeY] = [Math.floor(board[0] / 2), Math.floor(board[1] / 2)];\n\n return keyinput\n .map(key => moves[key])\n .reduce(\n ([x, y], [mX, mY]) => (Math.abs(x + mX) > rangeX || Math.abs(y + mY) > rangeY ? [x, y] : [x + mX, y + mY]),\n [0, 0]\n );\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120861" - }, - { - "id": "120853", - "name": "컨트롤 제트", - "fileName": "컨트롤-제트&120853&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n const arr = s.split(' ');\n while (arr.includes('Z')) arr.splice(arr.indexOf('Z') - 1, 2);\n return arr.map(n => +n).reduce((a, c) => a + c, 0);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120853" - }, - { - "id": "120880", - "name": "특이한 정렬", - "fileName": "특이한-정렬&120880&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numlist, n) {\n return numlist.sort((a, b) => {\n const [aDiff, bDiff] = [Math.abs(a - n), Math.abs(b - n)];\n if (aDiff === bDiff) return b - a;\n return aDiff - bDiff;\n });\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120880" - }, - { - "id": "120826", - "name": "특정 문자 제거하기", - "fileName": "특정-문자-제거하기&120826&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(my_string, letter) {\n return my_string.replaceAll(letter, '');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120826" - }, - { - "id": "120848", - "name": "팩토리얼", - "fileName": "팩토리얼&120848&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n let factorial = [1, 1];\n for (let i = 2; n > factorial[i - 1]; i++) factorial[i] = factorial[i - 1] * i;\n\n return factorial[factorial.length - 1] === n ? factorial.length - 1 : factorial.length - 2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120848" - }, - { - "id": "120898", - "name": "편지", - "fileName": "편지&120898&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(message) {\n return message.length * 2;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120898" - }, - { - "id": "120875", - "name": "평행", - "fileName": "평행&120875&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(dots) {\n const getInclination = ([[x1, y1], [x2, y2]]) => (x2 !== x1 ? (y2 - y1) / (x2 - x1) : Infinity);\n const isParallel = (line1, line2) => getInclination(line1) === getInclination(line2);\n\n return dots.some(dot => {\n const line1 = [dots[0], dot];\n const line2 = dots.filter(dot => !line1.includes(dot));\n return isParallel(line1, line2);\n })\n ? 1\n : 0;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120875" - }, - { - "id": "120814", - "name": "피자 나눠 먹기 (1)", - "fileName": "피자-나눠-먹기-(1)&120814&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n return Math.floor((n - 1) / 7) + 1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120814" - }, - { - "id": "120815", - "name": "피자 나눠 먹기 (2)", - "fileName": "피자-나눠-먹기-(2)&120815&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n const getLCM = (a, b) => {\n let lcm = 1;\n while ((lcm % a !== 0 || lcm % b !== 0) && lcm < a * b) lcm += 1;\n return lcm;\n };\n\n return getLCM(n, 6) / 6;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120815" - }, - { - "id": "120816", - "name": "피자 나눠 먹기 (3)", - "fileName": "피자-나눠-먹기-(3)&120816&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(slice, n) {\n return Math.floor((n - 1) / slice) + 1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120816" - }, - { - "id": "120896", - "name": "한 번만 등장한 문자", - "fileName": "한-번만-등장한-문자&120896&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n const count = [...s].reduce((a, c) => (a[c] ? { ...a, [c]: a[c] + 1 } : { ...a, [c]: 1 }), {});\n return Object.keys(count)\n .filter(key => count[key] === 1)\n .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))\n .join('');\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120896" - }, - { - "id": "120846", - "name": "합성수 찾기", - "fileName": "합성수-찾기&120846&.js", - "level": 0, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n const isPrime = num => {\n for (let i = 2; i <= Math.sqrt(num); i++) {\n if (num % i === 0) return true;\n }\n return false;\n };\n\n let count = 0;\n\n for (let i = 1; i <= n; i++) {\n if (isPrime(i)) count += 1;\n }\n \n return count;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/120846" - }, - { - "id": "12901", - "name": "2016년", - "fileName": "2016년&12901&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(a, b) {\n let count = 0;\n const day = [\"SUN\", \"MON\", \"TUE\", \"WED\", \"THU\", \"FRI\", \"SAT\"];\n const month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n for (let i = 1; i < a; i++) count += month[i];\n count += b;\n return day[(count + 4) % 7]; // 금요일 부터 1일 이므로\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12901" - }, - { - "id": "68935", - "name": "3진법 뒤집기", - "fileName": "3진법-뒤집기&68935&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n) {\n return parseInt(n.toString(3).split(\"\").reverse().join(\"\"), 3);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/68935" - }, - { - "id": "42748", - "name": "K번째수", - "fileName": "K번째수&42748&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(array, commands) {\n return commands.map((cmd) => {\n const arrCmd = array.slice(cmd[0] - 1, cmd[1]).sort((a, b) => a - b);\n return arrCmd[cmd[2] - 1];\n });\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42748" - }, - { - "id": "17682", - "name": "[1차] 다트 게임", - "fileName": "[1차]-다트-게임&17682&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(dartResult) {\n const regex = /\\d{1,2}[SDT]{1}[*|#]?/g;\n let result = [];\n for (const dart of dartResult.match(regex)) {\n const game = [...dart.split(/([SDT]{1})/)];\n const score = game[0];\n let bonus = 1;\n let option = 1;\n if (game[1] === \"S\") bonus = 1;\n if (game[1] === \"D\") bonus = 2;\n if (game[1] === \"T\") bonus = 3;\n\n if (game[2] === \"*\") {\n if (result.length !== 0) result[result.length - 1] *= 2;\n option = 2;\n }\n if (game[2] === \"#\") option = -1;\n\n result.push(score ** bonus * option);\n }\n\n return result.reduce((a, b) => a + b);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17682" - }, - { - "id": "17681", - "name": "[1차] 비밀지도", - "fileName": "[1차]-비밀지도&17681&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n, arr1, arr2) {\n const answer = [];\n for (let i = 0; i < n; i++) {\n let row = (arr1[i] | arr2[i]).toString(2); //Bitwise\n row = \"0\".repeat(n - row.length) + row;\n row = row.replace(/[10]/g, (a) => (+a ? \"#\" : \" \"));\n answer.push(row);\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17681" - }, - { - "id": "12954", - "name": "x만큼 간격이 있는 n개의 숫자", - "fileName": "x만큼-간격이-있는-n개의-숫자&12954&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(x, n) {\n return Array.from(Array(n), (_, index) => x * (index + 1));\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12954" - }, - { - "id": "12903", - "name": "가운데 글자 가져오기", - "fileName": "가운데-글자-가져오기&12903&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s) {\n return s.length % 2 !== 0\n ? s[Math.floor(s.length / 2)]\n : s.slice(s.length / 2 - 1, s.length / 2 + 1);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12903" - }, - { - "id": "12906", - "name": "같은 숫자는 싫어", - "fileName": "같은-숫자는-싫어&12906&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(arr) {\n return arr.filter((element, index) => element !== arr[index + 1]);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12906" - }, - { - "id": "12910", - "name": "나누어 떨어지는 숫자 배열", - "fileName": "나누어-떨어지는-숫자-배열&12910&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(arr, divisor) {\n const answer = arr.filter((element) => element % divisor === 0);\n answer.length === 0 ? answer.push(-1) : answer.sort((a, b) => a - b);\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12910" - }, - { - "id": "87389", - "name": "나머지가 1이 되는 수 찾기", - "fileName": "나머지가-1이-되는-수-찾기&87389&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n) {\n\n let answer = 0;\n for (let divisor = n - 1; divisor >= 2; divisor--) {\n if (n % divisor === 1) answer = divisor;\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/87389" - }, - { - "id": "70128", - "name": "내적", - "fileName": "내적&70128&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(a, b) {\n return a.reduce((x, y, i) => x + y * b[i], 0);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/70128" - }, - { - "id": "68644", - "name": "두 개 뽑아서 더하기", - "fileName": "두-개-뽑아서-더하기&68644&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(numbers) {\n const answer = [];\n for (let i = 0; i < numbers.length; i++) {\n for (let j = i + 1; j < numbers.length; j++) {\n answer.push(numbers[i] + numbers[j]);\n }\n }\n return [...new Set(answer)].sort((a, b) => a - b);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/68644" - }, - { - "id": "12912", - "name": "두 정수 사이의 합", - "fileName": "두-정수-사이의-합&12912&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(a, b) {\n let answer = 0;\n for (let i = Math.min(a, b); i <= Math.max(a, b); i++) {\n answer += i;\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12912" - }, - { - "id": "77484", - "name": "로또의 최고 순위와 최저 순위", - "fileName": "로또의-최고-순위와-최저-순위&77484&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(lottos, win_nums) {\n const zeroCount = lottos.filter((e) => e === 0).length;\n const matchCount = win_nums.filter((e) => lottos.includes(e)).length;\n const matchToRank = [6, 6, 5, 4, 3, 2, 1];\n const lowRank = matchToRank[matchCount];\n const highRank = zeroCount === 6 ? 1 : matchToRank[matchCount + zeroCount];\n\n return [highRank, lowRank];\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/77484" - }, - { - "id": "42840", - "name": "모의고사", - "fileName": "모의고사&42840&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(answers) {\n const answer = [];\n const firstPattern = [1, 2, 3, 4, 5];\n const firstPLength = firstPattern.length;\n const secondPattern = [2, 1, 2, 3, 2, 4, 2, 5];\n const secondPLength = secondPattern.length;\n const thirdPattern = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];\n const thirdLength = thirdPattern.length;\n let correctCount = [0, 0, 0];\n\n for (let i = 0, len = answers.length; i < len; i++) {\n if (answers[i] === firstPattern[i % firstPLength]) correctCount[0] += 1;\n if (answers[i] === secondPattern[i % secondPLength]) correctCount[1] += 1;\n if (answers[i] === thirdPattern[i % thirdLength]) correctCount[2] += 1;\n }\n\n const maxScore = Math.max(...correctCount);\n for (let i = 0; i < 3; i++) {\n if (correctCount[i] === maxScore) answer.push(i + 1);\n }\n\n return answer;\n}\n\n// 완벽한 정답이 아닙니다.\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42840" - }, - { - "id": "12916", - "name": "문자열 내 p와 y의 개수", - "fileName": "문자열-내-p와-y의-개수&12916&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s) {\n const countP = [...s.matchAll(/p/gi)].length;\n const countY = [...s.matchAll(/y/gi)].length;\n return countP === countY;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12916" - }, - { - "id": "12915", - "name": "문자열 내 마음대로 정렬하기", - "fileName": "문자열-내-마음대로-정렬하기&12915&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(strings, n) {\n return strings.sort((a, b) => {\n if (a[n] < b[n]) return -1;\n if (a[n] > b[n]) return 1;\n if (a[n] === b[n]) return a < b ? -1 : 1;\n return 0;\n });\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12915" - }, - { - "id": "12917", - "name": "문자열 내림차순으로 배치하기", - "fileName": "문자열-내림차순으로-배치하기&12917&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s) {\n return s\n .split(\"\")\n .sort((a, b) => {\n if (a < b) return 1;\n if (a > b) return -1;\n return 0;\n })\n .join(\"\");\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12917" - }, - { - "id": "12918", - "name": "문자열 다루기 기본", - "fileName": "문자열-다루기-기본&12918&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s) {\n return s.search(/\\D/g) < 0 && (s.length === 4 || s.length === 6);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12918" - }, - { - "id": "12925", - "name": "문자열을 정수로 바꾸기", - "fileName": "문자열을-정수로-바꾸기&12925&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s) {\n return parseInt(s);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12925" - }, - { - "id": "82612", - "name": "부족한 금액 계산하기", - "fileName": "부족한-금액-계산하기&82612&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(price, money, count) {\n let totalCost = 0;\n for (let i = 1; i <= count; i++) totalCost += price * i;\n return totalCost <= money ? 0 : totalCost - money;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/82612" - }, - { - "id": "12919", - "name": "서울에서 김서방 찾기", - "fileName": "서울에서-김서방-찾기&12919&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(seoul) {\n return `김서방은 ${seoul.indexOf(\"Kim\")}에 있다`;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12919" - }, - { - "id": "118666", - "name": "성격 유형 검사하기", - "fileName": "성격-유형-검사하기&118666&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - ssi02014\nfunction solution(survey, choices) {\n const points = [3, 2, 1, 0, 1, 2, 3];\n const pointBoard = {\n R: 0,\n T: 0,\n C: 0,\n F: 0,\n J: 0,\n M: 0,\n A: 0,\n N: 0,\n };\n let result = \"\";\n\n // 카테고리 별 점수 추가\n for (let i = 0; i < survey.length; i++) {\n const categories = survey[i];\n\n if (choices[i] < 4) {\n pointBoard[categories[0]] += points[choices[i] - 1];\n } else if (choices[i] > 4) {\n pointBoard[categories[1]] += points[choices[i] - 1];\n }\n }\n\n const pointBoardEntries = Object.entries(pointBoard);\n\n // 지표에 맞게 결과 값 도출\n for (let i = 0; i < pointBoardEntries.length; i += 2) {\n const [curCategory, curValue] = pointBoardEntries[i];\n const [nextCategory, nextValue] = pointBoardEntries[i + 1];\n\n if (curValue < nextValue) {\n result += nextCategory;\n } else {\n result += curCategory;\n }\n }\n\n return result;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/118666" - }, - { - "id": "12977", - "name": "소수 만들기", - "fileName": "소수-만들기&12977&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(nums) {\n let answer = 0;\n const length = nums.length;\n for (let i = 0; i < length; i++) {\n for (let j = i + 1; j < length; j++) {\n for (let k = j + 1; k < length; k++) {\n const sum = nums[i] + nums[j] + nums[k];\n if (isPrime(sum)) answer += 1;\n }\n }\n }\n\n return answer;\n}\n\nfunction isPrime(num) {\n for (let i = 2; i <= Math.sqrt(num); i++) {\n if (num % i === 0) return false;\n }\n return num >= 2;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12977" - }, - { - "id": "42839", - "name": "소수 찾기", - "fileName": "소수-찾기&42839&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(numbers) {\n let answer = 0;\n const numArr = numbers.split(\"\");\n const permutationAll = [];\n for (let r = 1; r <= numbers.length; r++) {\n const permutationR = Permutation(numArr, r).map((arr) =>\n parseInt(arr.join(\"\"))\n );\n for (let i = 0; i < permutationR.length; i++)\n permutationAll.push(permutationR[i]);\n }\n const permutationSet = [...new Set(permutationAll)];\n for (const number of permutationSet) {\n if (isPrime(number)) answer += 1;\n }\n return answer;\n}\n\nfunction Permutation(arr, r) {\n const result = [];\n if (r === 1) return arr.map((num) => [num]);\n arr.forEach((fixed, index, org) => {\n const rest = [...org.slice(0, index), ...org.slice(index + 1)];\n const permutation = Permutation(rest, r - 1);\n const attached = permutation.map((numbers) => [fixed, ...numbers]);\n result.push(...attached);\n });\n return result;\n}\n\nfunction isPrime(num) {\n for (let i = 2; i <= Math.sqrt(num); i++) {\n if (num % i === 0) return false;\n }\n return num >= 2;\n}\n\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42839" - }, - { - "id": "12922", - "name": "수박수박수박수박수박수?", - "fileName": "수박수박수박수박수박수?&12922&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n) {\n let answer = '';\n for (let i = 0; i < n; i++) {\n answer += i % 2 === 0 ? '수' : '박';\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12922" - }, - { - "id": "81301", - "name": "숫자 문자열과 영단어", - "fileName": "숫자-문자열과-영단어&81301&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s) {\n const stringToNum = [\n \"zero\",\n \"one\",\n \"two\",\n \"three\",\n \"four\",\n \"five\",\n \"six\",\n \"seven\",\n \"eight\",\n \"nine\",\n ];\n for (let i = 0; i < 10; i++) {\n s = s.split(stringToNum[i]).join(i);\n }\n return parseInt(s);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/81301" - }, - { - "id": "131128", - "name": "숫자 짝꿍", - "fileName": "숫자-짝꿍&131128&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - ssi02014\n\n/**\n * X, Y의 길이가 굉장히 길어서 공통 숫자를 뽑아낼 때 객체를 이용해 연산 횟수 최적화\n * X, Y를 배열로 변환 후에 배열 메서드를 사용해도 되지만, for of문보다 효율성 떨어짐 \n * (테스트 케이스 11 ~ 15 100ms~200ms 차이)\n */\nfunction solution(X, Y) {\n const commons = [];\n const obj = {};\n\n for (const el of X) {\n obj[el] = (obj[el] || 0) + 1;\n }\n\n for (const el of Y) {\n if (obj[el]) {\n commons.push(el);\n obj[el]--;\n }\n }\n\n commons.sort((a, b) => b - a);\n\n if (!commons.length) return \"-1\";\n else if (commons[0] === \"0\") return \"0\";\n return commons.join(\"\");\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/131128" - }, - { - "id": "12926", - "name": "시저 암호", - "fileName": "시저-암호&12926&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s, n) {\n return s\n .split(\"\")\n .map((element) => {\n if (element === \" \") return \" \";\n const code = element.charCodeAt(0);\n if ((code + n > 90 && code <= 90) || code + n > 122) {\n return String.fromCharCode(code + n - 26);\n } else {\n return String.fromCharCode(code + n);\n }\n })\n .join(\"\");\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12926" - }, - { - "id": "92334", - "name": "신고 결과 받기", - "fileName": "신고-결과-받기&92334&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220830) - codeisneverodd\nfunction solution(id_list, report, k) {\n const reportResult = report.reduce((a, c) => {\n const [user, reported] = c.split(' ');\n a[reported] = a[reported] ? a[reported].add(user) : new Set().add(user);\n return a;\n }, {});\n\n const mailed = Object.values(reportResult)\n .filter(set => set.size >= k)\n .flatMap(set => [...set]);\n return id_list.map(id => mailed.filter(user => user === id).length);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/92334" - }, - { - "id": "72410", - "name": "신규 아이디 추천", - "fileName": "신규-아이디-추천&72410&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220830) - codeisneverodd\nfunction solution(new_id) {\n const newId = new_id\n .toLowerCase()\n .replace(/[^\\w_.-]/g, '')\n .replace(/[.]{2,}/g, '.')\n .replace(/^[.]+/, '')\n .replace(/[.]+$/, '')\n .replace(/^$/, 'a')\n .substring(0, 15)\n .replace(/[.]+$/, '');\n\n return newId.padEnd(3, newId[newId.length - 1]);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/72410" - }, - { - "id": "42889", - "name": "실패율", - "fileName": "실패율&42889&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(N, stages) {\n let stageNFailRate = [];\n for (let stage = 1; stage <= N; stage++) {\n const playerReached = stages.filter((player) => player >= stage).length;\n const playerChallenging = stages.filter(\n (player) => player === stage\n ).length;\n stageNFailRate.push([stage, playerChallenging / playerReached]);\n }\n stageNFailRate.sort((a, b) => b[1] - a[1]);\n return stageNFailRate.map((stage) => stage[0]);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42889" - }, - { - "id": "77884", - "name": "약수의 개수와 덧셈", - "fileName": "약수의-개수와-덧셈&77884&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(left, right) {\n let answer = 0;\n for (let num = left; num <= right; num++) {\n answer = Number.isInteger(Math.sqrt(num)) ? answer - num : answer + num;\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/77884" - }, - { - "id": "12928", - "name": "약수의 합", - "fileName": "약수의-합&12928&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n) {\n let answer = 0;\n for (let divisor = 1; divisor <= n; divisor++) {\n if (n % divisor === 0) answer += divisor;\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12928" - }, - { - "id": "86051", - "name": "없는 숫자 더하기", - "fileName": "없는-숫자-더하기&86051&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(numbers) {\n return 45 - numbers.reduce((a, b) => a + b);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/86051" - }, - { - "id": "12982", - "name": "예산", - "fileName": "예산&12982&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(d, budget) {\n let answer = 0;\n d.sort((a, b) => a - b);\n for (const department of d) {\n if (budget < department) break;\n answer += 1;\n budget -= department;\n }\n return answer;\n}\n\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12982" - }, - { - "id": "42576", - "name": "완주하지 못한 선수", - "fileName": "완주하지-못한-선수&42576&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(participant, completion) {\n participant = participant.sort();\n completion = completion.sort();\n for (let i = 0; i < completion.length; i++) {\n if (participant[i] !== completion[i]) return participant[i];\n }\n return participant[participant.length - 1];\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42576" - }, - { - "id": "76501", - "name": "음양 더하기", - "fileName": "음양-더하기&76501&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(absolutes, signs) {\n return absolutes.reduce(\n (acc, curr, i) => acc + curr * (signs[i] ? 1 : -1),\n 0\n );\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/76501" - }, - { - "id": "12930", - "name": "이상한 문자 만들기", - "fileName": "이상한-문자-만들기&12930&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s) {\n return s\n .split(\" \")\n .map((word) =>\n word\n .split(\"\")\n .map((char, index) =>\n index % 2 === 0\n ? word[index].toUpperCase()\n : word[index].toLowerCase()\n )\n .join(\"\")\n )\n .join(\" \");\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12930" - }, - { - "id": "12931", - "name": "자릿수 더하기", - "fileName": "자릿수-더하기&12931&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n) {\n return n\n .toString()\n .split(\"\")\n .map((x) => parseInt(x))\n .reduce((acc, curr) => acc + curr, 0);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12931" - }, - { - "id": "12932", - "name": "자연수 뒤집어 배열로 만들기", - "fileName": "자연수-뒤집어-배열로-만들기&12932&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n) {\n return n\n .toString()\n .split(\"\")\n .reverse()\n .map((x) => parseInt(x));\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12932" - }, - { - "id": "12933", - "name": "정수 내림차순으로 배치하기", - "fileName": "정수-내림차순으로-배치하기&12933&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n) {\n return parseInt(\n n\n .toString()\n .split(\"\")\n .sort((a, b) => b - a)\n .join(\"\")\n );\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12933" - }, - { - "id": "12934", - "name": "정수 제곱근 판별", - "fileName": "정수-제곱근-판별&12934&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n) {\n return Number.isInteger(Math.sqrt(n)) ? (Math.sqrt(n) + 1) ** 2 : -1;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12934" - }, - { - "id": "12935", - "name": "제일 작은 수 제거하기", - "fileName": "제일-작은-수-제거하기&12935&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(arr) {\n const index = arr.indexOf(Math.min(...arr));\n arr.splice(index, 1);\n return arr.length === 0 ? [-1] : arr;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12935" - }, - { - "id": "12969", - "name": "직사각형 별찍기", - "fileName": "직사각형-별찍기&12969&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - chaerin-dev\nprocess.stdin.setEncoding(\"utf8\");\nprocess.stdin.on(\"data\", (data) => {\n const n = data.split(\" \");\n const a = Number(n[0]),\n b = Number(n[1]);\n ", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12969" - }, - { - "id": "12937", - "name": "짝수와 홀수", - "fileName": "짝수와-홀수&12937&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(num) {\n return num % 2 === 0 ? \"Even\" : \"Odd\";\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12937" - }, - { - "id": "42862", - "name": "체육복", - "fileName": "체육복&42862&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n, lost, reserve) {\n let answer = 0;\n let studentClothes = new Array(n + 2).fill(1);\n for (const student of reserve) studentClothes[student] += 1;\n for (const student of lost) studentClothes[student] -= 1;\n for (let i = 1; i < n + 1; i++) {\n if (studentClothes[i] === 0) {\n if (studentClothes[i - 1] === 2 || studentClothes[i + 1] === 2) {\n if (studentClothes[i - 1] === 2) {\n studentClothes[i - 1] -= 1;\n studentClothes[i] += 1;\n } else {\n studentClothes[i + 1] -= 1;\n studentClothes[i] += 1;\n }\n }\n }\n }\n for (const student of studentClothes) {\n answer += student > 0 ? 1 : 0;\n }\n answer -= 2;\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42862" - }, - { - "id": "12940", - "name": "최대공약수와 최소공배수", - "fileName": "최대공약수와-최소공배수&12940&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(n, m) {\n const gcd = greatestCommonDivisor(n, m);\n return [gcd, (n * m) / gcd];\n}\n\nconst greatestCommonDivisor = (a, b) => {\n if (b === 0) return a;\n else return greatestCommonDivisor(b, a % b);\n};\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12940" - }, - { - "id": "86491", - "name": "최소직사각형", - "fileName": "최소직사각형&86491&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220830) - codeisneverodd\nfunction solution(sizes) {\n const maxWidth = Math.max(...sizes.map(card => Math.min(...card)));\n const maxHeight = Math.max(...sizes.map(card => Math.max(...card)));\n return maxWidth * maxHeight;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/86491" - }, - { - "id": "12943", - "name": "콜라츠 추측", - "fileName": "콜라츠-추측&12943&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(num) {\n let answer = 0;\n while (answer <= 500) {\n if (num === 1) return answer;\n num = num % 2 === 0 ? num / 2 : num * 3 + 1;\n answer += 1;\n }\n return -1;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12943" - }, - { - "id": "64061", - "name": "크레인 인형뽑기 게임", - "fileName": "크레인-인형뽑기-게임&64061&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(board, moves) {\n let answer = 0;\n const length = board.length\n let basket = []\n moves.forEach(move => {\n for (let i = 0; i < length; i++) {\n const item = board[i][move - 1]\n if (item !== 0) {\n if (basket[basket.length - 1] !== item) {\n basket.push(item)\n } else {\n basket.pop()\n answer += 2\n }\n board[i][move - 1] = 0\n break\n }\n }\n })\n\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/64061" - }, - { - "id": "67256", - "name": "키패드 누르기", - "fileName": "키패드-누르기&67256&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220830) - codeisneverodd\nfunction solution(numbers, hand) {\n let [l, r] = [10, 12];\n const moveL = n => {\n l = n;\n return 'L';\n };\n\n const moveR = n => {\n r = n;\n return 'R';\n };\n return numbers\n .map(n => {\n if (n === 0) n = 11;\n const to = n => {\n const numLocation = numToLocation(n);\n const lDistance = distanceBtwLocation(numToLocation(l), numLocation);\n const rDistance = distanceBtwLocation(numToLocation(r), numLocation);\n if (lDistance < rDistance) return moveL(n);\n if (rDistance > lDistance) return moveR(n);\n return hand === 'left' ? moveL(n) : moveR(n);\n };\n return num % 3 === 1 ? leftTo(num) : num % 3 === 0 ? rightTo(num) : to(num);\n })\n .join('');\n}\n\nfunction numToLocation(num) {\n return [Math.floor((num - 1) / 3), (num - 1) % 3];\n}\n\nfunction distanceBtwLocation(a, b) {\n return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/67256" - }, - { - "id": "12944", - "name": "평균 구하기", - "fileName": "평균-구하기&12944&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(arr) {\n return arr.reduce((acc, curr) => acc + curr) / arr.length;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12944" - }, - { - "id": "1845", - "name": "폰켓몬", - "fileName": "폰켓몬&1845&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(nums) {\n const numLen = nums.length;\n const setLen = [...new Set(nums)].length;\n return numLen / 2 >= setLen ? setLen : numLen / 2;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/1845" - }, - { - "id": "12947", - "name": "하샤드 수", - "fileName": "하샤드-수&12947&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(x) {\n const sum = x\n .toString()\n .split(\"\")\n .map((x) => parseInt(x))\n .reduce((acc, curr) => acc + curr);\n return x % sum === 0;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12947" - }, - { - "id": "12948", - "name": "핸드폰 번호 가리기", - "fileName": "핸드폰-번호-가리기&12948&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(phone_number) {\n return \"*\".repeat(phone_number.length - 4) + phone_number.slice(-4);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12948" - }, - { - "id": "12950", - "name": "행렬의 덧셈", - "fileName": "행렬의-덧셈&12950&.js", - "level": 1, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(arr1, arr2) {\n const answer = [];\n arr1.forEach((row, rowIndex) => {\n answer.push(row.map((col, colIndex) => col + arr2[rowIndex][colIndex]));\n });\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12950" - }, - { - "id": "12899", - "name": "124 나라의 숫자", - "fileName": "124-나라의-숫자&12899&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n var answer = '';\n const oneTwoFour = ['4', '1', '2']\n while (n > 0) {\n const remainder = n % 3\n answer = oneTwoFour[remainder] + answer;\n n = Math.floor((n - 1) / 3) //나누어떨어지지 않을 때에도 -1해도 상관없음\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12899" - }, - { - "id": "12900", - "name": "2 x n 타일링", - "fileName": "2-x-n-타일링&12900&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - jaewon1676\nfunction solution(n) {\n let dp = [0, 1, 2] // n이 1, 2일때는 바로 답을 출력,\n if (n>2){ // n이 3 이상이면 필요한 만큼의 수 까지만 수를 만들어준다.\n for (let i=3; i<=n; i++){\n dp.push((dp[i-1] + dp[i-2]) % 1000000007);\n }\n }\n return dp[n]\n}\n/* \nn이 1일땐 1, 2일땐 2, 3일땐 3, 4일땐 5 . . 의 식이 보인다.\nn = (n - 1) + (n - 2)의 식으로 구할 수 있고,\n제한 사항을 주의해서 풀어보자. */", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12900" - }, - { - "id": "77885", - "name": "2개 이하로 다른 비트", - "fileName": "2개-이하로-다른-비트&77885&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - le2sky\nfunction solution(numbers) {\n const answer = [];\n numbers.forEach((num) => {\n if (num % 2 == 0) answer.push(num + 1);\n else {\n let binary = [\"0\", ...num.toString(2)];\n let last = binary.lastIndexOf(\"0\");\n binary[last] = \"1\";\n binary[last + 1] = \"0\";\n answer.push(parseInt(binary.join(\"\"), 2));\n }\n });\n return answer;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/77885" - }, - { - "id": "12902", - "name": "3 x n 타일링", - "fileName": "3-x-n-타일링&12902&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n if (n % 2 !== 0) return 0;\n\n const getCount = n => {\n const k = n / 2;\n const count = [3, 11, ...Array(k - 2)];\n const divider = 1000000007;\n for (let i = 2; i < k; i++) {\n count[i] = (4 * count[i - 1] - count[i - 2] + divider) % divider;\n }\n return count[count.length - 1];\n };\n\n return getCount(n);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12902" - }, - { - "id": "42747", - "name": "H Index", - "fileName": "H-Index&42747&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(citations) {\n var answer = 0;\n citations.sort((a, b) => b - a)\n let h = 0\n while (h + 1 <= citations[h]) h++\n answer = h\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42747" - }, - { - "id": "12951", - "name": "JadenCase 문자열 만들기", - "fileName": "JadenCase-문자열-만들기&12951&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n var answer = ''\n answer = s.split(' ').map(word => word.charAt(0).toUpperCase() + word.substring(1).toLowerCase()).join(' ')\n //word[0]은 빈 문자열을 만나면 undefined를, word.charAt(0)은 빈 문자열을 만나면 빈 문자열을 반환한다.\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12951" - }, - { - "id": "12952", - "name": "N Queen", - "fileName": "N-Queen&12952&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n /*\n 1. 0번째 행에 0번째 queen을 놓는다.\n 2. 그 다음 행의 퀸은 이전 퀸들의 범위와 겹치지 않는 곳에 놓는다. 퀸은 한 행에 반드시 하나 두어야한다.\n 3. 마지막 열까지 도달하면 성공으로 간주하고 answer에 1을 더한다.\n 4. 0번째 queen의 위치를 바꿔가며 모두 시도한다.\n 4. 단, 체스판은 일차원 배열로 선언하고 index = 행, 값 = 열 로 생각한다.\n */\n let answer = 0;\n const canBePlacedOn = (chess, currentRow) => {\n //해당 행에 둔 queen이 유효한지\n for (let prevRow = 0; prevRow < currentRow; prevRow++) {\n const onDiagonal = currentRow - prevRow === Math.abs(chess[currentRow] - chess[prevRow])\n const onStraight = chess[prevRow] === chess[currentRow]\n if (onDiagonal || onStraight) return false\n }\n return true\n }\n const placeQueen = (chess, currentRow) => {\n //queen을 배치하다가 끝 행에 도착하면 1을 리턴, 도착하지 못하면 0을 리턴하여, 재귀적으로 모든 경우를 합하여 리턴\n let count = 0\n if (currentRow === chess.length) return 1\n for (let currentQueen = 0; currentQueen < n; currentQueen++) {\n //queen을 우선 배치한 후 가능한지 살펴본다.\n chess[currentRow] = currentQueen\n if (canBePlacedOn(chess, currentRow)) count += placeQueen(chess, currentRow + 1)\n }\n return count\n }\n for (let firstQueen = 0; firstQueen < n; firstQueen++) {\n const chess = new Array(n).fill(-1)\n chess[0] = firstQueen\n answer += placeQueen(chess, 1)\n }\n return answer;\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12952" - }, - { - "id": "12953", - "name": "N개의 최소공배수", - "fileName": "N개의-최소공배수&12953&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(arr) {\n var answer = 0;\n answer = arr.reduce((a, b) => leastCommonMultiple(a, b), 1)\n return answer;\n}\n\nfunction leastCommonMultiple(a, b) {\n return a * b / greatestCommonDivisor(a, b)\n}\n\nfunction greatestCommonDivisor(a, b) {\n while (b > 0) {\n let r = a % b;\n a = b;\n b = r;\n }\n return a;\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12953" - }, - { - "id": "17677", - "name": "[1차] 뉴스 클러스터링", - "fileName": "[1차]-뉴스-클러스터링&17677&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(str1, str2) {\n var answer = 0;\n let compare1 = verifiedSlices(str1), compare2 = verifiedSlices(str2)\n const union = new Set([...compare1, ...compare2])\n let multiIntersectionLen = 0, multiUnionLen = 0\n for (const slice of union) {\n const compare1Count = compare1.filter(x => x === slice).length,\n compare2Count = compare2.filter(x => x === slice).length\n multiIntersectionLen += Math.min(compare1Count, compare2Count)\n multiUnionLen += Math.max(compare1Count, compare2Count)\n }\n answer = multiUnionLen === 0 ? 65536 : Math.floor(multiIntersectionLen / multiUnionLen * 65536)\n return answer;\n}\n\nfunction verifiedSlices(str) {\n const onlyAlphabet = /[a-zA-Z]{2}/\n let result = []\n for (let i = 0; i < str.length - 1; i++) {\n const slice = str.slice(i, i + 2)\n if (onlyAlphabet.test(slice)) result.push(slice.toLowerCase())\n }\n return result\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17677" - }, - { - "id": "17680", - "name": "[1차] 캐시", - "fileName": "[1차]-캐시&17680&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(cacheSize, cities) {\n var answer = 0;\n let cache = []\n if (cacheSize === 0) return 5 * cities.length\n for (const city of cities) {\n const cityLC = city.toLowerCase()\n if (cache.includes(cityLC)) {\n cache.splice(cache.indexOf(cityLC), 1)\n cache.unshift(cityLC)\n answer += 1\n } else {\n if (cache.length >= cacheSize) cache.pop()\n cache.unshift(cityLC)\n answer += 5\n }\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17680" - }, - { - "id": "17679", - "name": "[1차] 프렌즈4블록", - "fileName": "[1차]-프렌즈4블록&17679&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(m, n, board) {\n board = board.map(r => r.split(''));\n const getSquare = ([r, c]) => [\n [r, c],\n [r, c + 1],\n [r + 1, c],\n [r + 1, c + 1],\n ];\n\n const isSquare = ([r, c]) => {\n if (board[r][c] === '@') return false;\n return [...new Set(getSquare([r, c]).map(([r, c]) => board[r][c]))].length === 1;\n };\n\n const remove = () => {\n const removeArr = [];\n for (let r = 0; r < m - 1; r++) {\n for (let c = 0; c < n - 1; c++) {\n if (isSquare([r, c])) getSquare([r, c]).forEach(v => removeArr.push(v));\n }\n }\n removeArr.forEach(([r, c]) => {\n board[r][c] = '@';\n });\n return removeArr.length !== 0;\n };\n\n const pull = () => {\n for (let c = 0; c < n; c++) {\n const remainColumn = Array.from({ length: m }, (_, r) => board[r][c]).filter(v => v !== '@');\n const resultColumn = [...Array(m - remainColumn.length).fill('@'), ...remainColumn];\n resultColumn.forEach((v, r) => {\n board[r][c] = v;\n });\n }\n return board;\n };\n\n while (remove()) {\n pull();\n }\n\n return board.flat().filter(v => v === '@').length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17679" - }, - { - "id": "17687", - "name": "[3차] n진수 게임", - "fileName": "[3차]-n진수-게임&17687&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n, t, m, p) {\n let queue = [], result = [], currentNumDecimal = -1, turn = 0\n while (result.length < t) {\n if (queue.length === 0) {\n currentNumDecimal++\n currentNumDecimal.toString(n).split('').forEach(x => queue.push(x))\n }\n const currentChar = queue.shift()\n if (turn % m === p - 1) result.push(currentChar)\n turn++\n }\n return result.join('').toUpperCase()\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17687" - }, - { - "id": "17683", - "name": "[3차] 방금그곡", - "fileName": "[3차]-방금그곡&17683&.js", - "level": 2, - "code": "// https://github.com/codeisneverodd/programmers-coding-test\n// 완벽한 정답이 아닙니다.\n// 1 - minjongbaek\nfunction convertString(m) { // 문자열 m에 #이 붙은 음이 있다면 #을 제거하고 소문자로 변경한 후 반환하는 함수\n return m\n .replace(/C#/g, 'c')\n .replace(/D#/g, 'd')\n .replace(/F#/g, 'f')\n .replace(/G#/g, 'g')\n .replace(/A#/g, 'a');\n}\n\nfunction solution(m, musicinfos) {\n\n // 네오가 기억하고 있는 멜로디가 라디오에서 재생됐는지 확인해야합니다.\n // 재생시간이 길면 악보의 멜로디가 반복되어 재생되고, 짧다면 중간에 끊어지게 됩니다.\n // #이 붙은 음은 2자리를 차지하기 때문에 #이 붙은 음을 어떻게 처리할지가 중요합니다.\n\n const listenSound = convertString(m); // #이 붙은 음을 다른 문자로 변환합니다.\n \n const map = new Map(); // 조건에 일치하는 음악 정보를 저장할 map 변수를 선언합니다.\n for (const info of musicinfos) {\n const [start, finish, title, _score] = info.split(',');\n // 음악 재생이 끝난 시각과 재생된 시각의 차를 구하여 재생시간을 구합니다.\n const duration = ((Number(finish.slice(0, 2)) * 60) + (Number(finish.slice(3, 5)))) - ((Number(start.slice(0, 2)) * 60) + (Number(start.slice(3, 5))));\n \n const score = convertString(_score); // 악보의 멜로디에서 #이 붙은 음을 다른 문자로 변환합니다.\n\n // 재생된 멜로디를 구합니다.\n // 각 음이 1분에 1개씩 재생되므로, repeat() 메서드를 사용하여 재생시간을 악보의 길이로 나눈 몫 만큼 반복합니다.\n // slice() 메서드로 재생시간을 넘어가는 멜로디는 제외합니다.\n const playScore = score.repeat(Math.ceil(duration / score.length)).slice(0, duration);\n if (playScore.includes(listenSound)) { // 들은 멜로디가 재생된 멜로디에 포함되어 있다면 map에 저장한다.\n map.set(title, {score, playScore});\n }\n }\n \n // 조건에 일치하는 음악이 여러개인 경우 재생된 시간이 제일 길고 먼저 입력된 음악 제목을 반환합니다.\n // map 객체는 삽입에 대한 순서를 기억하므로 재생된 시간이 제일 긴 음악부터 내림차순으로 정렬합니다.\n const filter = [...map.keys()].sort((a,b) => map.get(b).playScore.length - map.get(a).playScore.length);\n return filter.length >= 1 ? filter[0] : '(None)'; // 결과가 없다면 '(None)'을 반환하고, 그렇지 않다면 첫 번째 요소를 반환합니다.\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17683" - }, - { - "id": "17684", - "name": "[3차] 압축", - "fileName": "[3차]-압축&17684&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(msg) {\n const outputs = [];\n const dict = ['@', ...Array.from(Array(26), (_, i) => String.fromCharCode(65 + i))];\n let [start, end] = [0, 1];\n\n const doesDictHave = (start, end) => dict.includes(msg.substring(start, end));\n\n const getInput = (start, end) => {\n if (end + 1 > msg.length || !doesDictHave(start, end + 1)) return [start, end];\n return getInput(start, end + 1);\n };\n\n const addToDict = (start, end) => {\n if (doesDictHave(start, end)) return;\n dict.push(msg.substring(start, end));\n };\n\n const addToOutputs = (start, end) => {\n if (!doesDictHave(start, end)) return;\n outputs.push(dict.indexOf(msg.substring(start, end)));\n };\n\n while (start < msg.length) {\n [start, end] = getInput(start, end);\n addToDict(start, end + 1);\n addToOutputs(start, end);\n start = end;\n }\n return outputs;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17684" - }, - { - "id": "17686", - "name": "[3차] 파일명 정렬", - "fileName": "[3차]-파일명-정렬&17686&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(files) {\n var answer = [];\n const numberRegex = /[0-9]+/\n answer = files.sort((a, b) => {\n const [matchA, matchB] = [a.match(numberRegex), b.match(numberRegex)]\n const [headA, headB] = [a.slice(0, matchA.index).toLowerCase(), b.slice(0, matchB.index).toLowerCase()]\n const [numberA, numberB] = [parseInt(matchA[0]), parseInt(matchB[0])]\n return headA < headB ? -1 : headA > headB ? 1 : numberA < numberB ? -1 : numberA > numberB ? 1 : 0\n })\n return answer;\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/17686" - }, - { - "id": "92335", - "name": "k진수에서 소수 개수 구하기", - "fileName": "k진수에서-소수-개수-구하기&92335&.js", - "level": 2, - "code": "// https://github.com/codeisneverodd/programmers-coding-test\n// 완벽한 정답이 아닙니다.\n// 1 - minjongbaek\nfunction isPrime(number) { // 소수를 판별하는 함수\n if (number < 2) return false;\n for (let i = 2; i * i <= number; i += 1) {\n if (number % i === 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction solution(n, k) {\n // 문제를 얼핏 보면 4가지의 경우를 모두 생각해야할 것 같지만,\n // 결국은 앞이나 뒤에 0이 하나라도 있거나 아예 없는 경우에 소수인지 확인하면 됩니다.\n // 따라서 k진수로 변환 후 0을 기준으로 나누고 각 요소가 소수인지 판별하면 됩니다.\n\n // (n).toString(k) // n을 k진수로 변환합니다.\n // .split('0') // 0을 기준으로 나눕니다.\n // .filter((number) => isPrime(+number)).length // 소수가 아닌 요소를 걸러낸 후에 개수를 셉니다.\n return (n).toString(k).split('0').filter((number) => isPrime(+number)).length;\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/92335" - }, - { - "id": "87390", - "name": "n^2 배열 자르기", - "fileName": "n^2-배열-자르기&87390&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - jaewon1676\nfunction solution (n, left, right) {\n const answer = [];\n \n for (let i=left; i <= right; i++) { // left부터 right까지를 구한다.\n let row = parseInt(i/n);\t// 행(row)을 구한다.\n let column = i%n;\t// 열(column)을 구한다.\n answer.push(Math.max(row, column) + 1) // 행과 열중 큰 값을 푸시한다.\n }\n return answer\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/87390" - }, - { - "id": "42746", - "name": "가장 큰 수", - "fileName": "가장-큰-수&42746&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers) {\n var answer = '';\n numbers.sort(sortFunc)\n answer = numbers.join('')\n if (answer[0] === '0') return '0'\n return answer;\n}\n\nconst sortFunc = (a, b) => {\n const compareA = parseInt(a.toString() + b.toString())\n const compareB = parseInt(b.toString() + a.toString())\n return compareB - compareA\n}\n\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42746" - }, - { - "id": "12905", - "name": "가장 큰 정사각형 찾기", - "fileName": "가장-큰-정사각형-찾기&12905&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(board) {\n for (let row = 0; row < board.length; row++) {//해당 칸이 0이 아니고 위, 왼쪽 대각선, 왼쪽이 정사각형이면, 정사각형 연장가능\n for (let col = 0; col < board[0].length; col++) {\n if (board[row][col] >= 1 && (!(board[row - 1] === undefined || board[row][col - 1] === undefined)))\n board[row][col] = Math.min(board[row - 1][col], board[row - 1][col - 1], board[row][col - 1]) + 1;\n }\n }\n return Math.max(...board.map((row) => Math.max(...row))) ** 2; //수정된 board 내의 최댓값이 가능한 정사각형의 최대\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12905" - }, - { - "id": "81302", - "name": "거리두기 확인하기", - "fileName": "거리두기-확인하기&81302&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(places) {\n var answer = [];\n answer = places.map(place => {\n return place.some((row, rowIndex) =>\n row.split('').some((mark, colIndex, rowArr) => {\n if (mark === 'X') return false\n const countPeopleAround = [\n rowArr[colIndex - 1] || '',\n rowArr[colIndex + 1] || '',\n (place[rowIndex - 1] || '')[colIndex],\n (place[rowIndex + 1] || '')[colIndex],\n ].filter(mark => mark === 'P').length\n return (mark === 'P' && countPeopleAround > 0) || (mark === 'O' && countPeopleAround > 1)\n })\n ) ? 0 : 1\n })\n return answer;\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/81302" - }, - { - "id": "1844", - "name": "게임 맵 최단거리", - "fileName": "게임-맵-최단거리&1844&.js", - "level": 2, - "code": "// https://github.com/codeisneverodd/programmers-coding-test\n// 1 - prove-ability\nfunction solution(maps) {\n // BFS 활용\n const row = maps.length - 1, col = maps[0].length - 1;\n \n // 큐 - 시작 위치 y, x, 이동 거리\n const queue = [[0, 0, 1]];\n \n while(queue.length) {\n // 큐 추출\n let [y, x, count] = queue.shift();\n // 상대 팀 진영이라면\n if(y === row && x === col) return count;\n // 동서남북 확인\n for(let i = 0; i < 4; i++) {\n const [dy, dx] = DIRECTION[i];\n // 다음 길 위치\n const nextY = dy + y, nextX = dx + x;\n // 맵 밖으로 나간다면\n if(isOut(nextY, nextX, row, col)) continue;\n // 도착한 곳이 벽이라면\n if(maps[nextY][nextX] === 0) continue;\n // 이미 지난 곳 벽으로 만들어서 다음에 접근 방지\n maps[nextY][nextX] = 0;\n // 다음에 확인해야하는 곳 큐에 추가\n // 갈수 있는 곳이 두 곳이라면 두 곳 추가됨 \n queue.push([nextY, nextX, count + 1]);\n // 처음에 count 를 let 으로 선언하고 ++count 로 작성했을 떄 에러 발생 - 이유는 모르겠음..\n }\n }\n \n return -1;\n}\n\n// 상 우 하 좌\nconst DIRECTION = [[1, 0], [0, 1], [-1, 0], [0, -1]];\n\n// 사용이 가능한 길인지 확인하는 함수\nconst isOut = (nextY, nextX, row, col) => nextY < 0 || nextX < 0 || nextY > row || nextX > col;", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/1844" - }, - { - "id": "60058", - "name": "괄호 변환", - "fileName": "괄호-변환&60058&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(p) {\n if (p.length === 0) return p\n let bracketCount = 0\n let isURight = true\n for (let i = 0; i < p.length; i++) {\n bracketCount = p[i] === '(' ? bracketCount + 1 : bracketCount - 1\n if (bracketCount < 0) isURight = false\n if (bracketCount === 0) {\n const [u, v] = [p.slice(0, i + 1), p.slice(i + 1)]\n if (isURight) {\n return u + solution(v)\n } else {\n let emptyString = '(' + solution(v) + ')'\n const slicedReversedString = u\n .slice(1, u.length - 1)\n .split('')\n .map(bracket => bracket === '(' ? ')' : '(')\n .join('')\n return emptyString + slicedReversedString\n }\n }\n }\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/60058" - }, - { - "id": "76502", - "name": "괄호 회전하기", - "fileName": "괄호-회전하기&76502&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n let answer = 0;\n let sArr = s.split('')\n if (isRight(sArr.join(''))) answer += 1\n for (let i = 0; i < sArr.length - 1; i++) {\n sArr.push(sArr.shift())\n if (isRight(sArr.join(''))) answer += 1\n }\n return answer;\n}\n\nfunction isRight(str) {\n const bracketOpen = ['[', '{', '('], bracketClose = [']', '}', ')']\n let status = [{open: false, openOrder: []}, {open: false, openOrder: []}, {open: false, openOrder: []}]\n for (let sIndex = 0; sIndex < str.length; sIndex++) {\n for (let bIndex = 0; bIndex < 3; bIndex++) {\n if (str[sIndex] === bracketOpen[bIndex]) {\n status[bIndex].open = true\n status[bIndex].openOrder.push(sIndex)\n }\n if (str[sIndex] === bracketClose[bIndex]) {\n if (status[bIndex].openOrder.length > 0) {\n if (status.filter(check => check.open && check.openOrder[check.openOrder.length - 1] > status[bIndex].openOrder[status[bIndex].openOrder.length - 1]).length > 0)\n return false //먼저 닫혀야 하는 괄호보다 먼저 닫힘\n status[bIndex].openOrder.pop()\n status[bIndex].open = false\n } else {\n return false //열리기 전에 닫힘\n }\n }\n }\n }\n for (let i = 0; i < 3; i++) if (status[i].open) return false //닫히지 않은 괄호가 있음\n return true\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/76502" - }, - { - "id": "87377", - "name": "교점에 별 만들기", - "fileName": "교점에-별-만들기&87377&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(line) {\n const getCrossPoint = ([A, B, E], [C, D, F]) => {\n if (A * D - B * C === 0) return [Infinity, Infinity];\n return [(B * F - E * D) / (A * D - B * C), (E * C - A * F) / (A * D - B * C)];\n }; //문제 설명 최하단 참조\n\n const crossPoints = line.flatMap((lineA, i) =>\n line\n .slice(i + 1)\n .map(lineB => getCrossPoint(lineA, lineB))\n .filter(([x, y]) => Number.isInteger(x) && Number.isInteger(y))\n );\n\n const generateCanvas = crossPoints => {\n const xPoints = [...crossPoints.map(([x, y]) => x)];\n const yPoints = [...crossPoints.map(([x, y]) => y)];\n const [minX, maxX] = [Math.min(...xPoints), Math.max(...xPoints)];\n const [minY, maxY] = [Math.min(...yPoints), Math.max(...yPoints)];\n const xLength = Math.abs(maxX - minX) + 1;\n const yLength = Math.abs(maxY - minY) + 1;\n\n return {\n canvas: Array.from({ length: yLength }, () => Array(xLength).fill('.')),\n draw([x, y], value) {\n this.canvas[Math.abs(y - maxY)][Math.abs(x - minX)] = value;\n },\n print() {\n return this.canvas.map(row => row.join(''));\n },\n };\n };\n\n const canvas = generateCanvas(crossPoints);\n\n crossPoints.forEach(point => {\n canvas.draw(point, '*');\n });\n\n return canvas.print();\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/87377" - }, - { - "id": "42885", - "name": "구명보트", - "fileName": "구명보트&42885&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - jaewon1676\nfunction solution(people, limit) {\n let cnt = 0;\n \n people.sort((a, b) => {return a - b}) // 몸무게 오름차순\n \n while(people.length != 0){ // 무인도에 갖힌 사람이 없어질때까지 반복 \n if (people[0] + people[people.length-1] <= limit){ // 무게가 되면 둘 다 빼주기\n people.pop()\n people.shift()\n } else {\n people.pop() // 무거운사람을 뺴주자\n }\n cnt++;\n }\n return cnt;\n} // 4주차 2번 문제와 유사함\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42885" - }, - { - "id": "42586", - "name": "기능개발", - "fileName": "기능개발&42586&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd - 시간복잡도 감소\nfunction solution(progresses, speeds) {\n var answer = [];\n const remainDays = progresses.map((prog, index) => Math.ceil((100 - prog) / speeds[index]))\n console.log(remainDays)\n let maxDay = remainDays[0]\n answer.push(0)\n for (let i = 0; i < remainDays.length; i++) {\n if (remainDays[i] <= maxDay) {\n answer[answer.length - 1] += 1\n } else {\n answer.push(1)\n maxDay = remainDays[i]\n }\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42586" - }, - { - "id": "42583", - "name": "다리를 지나는 트럭", - "fileName": "다리를-지나는-트럭&42583&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(bridge_length, weight, truck_weights) {\n let [tick, onBridge, weightOnBridge] = [0, [{weight: 0, timeToOut: 0}], 0]\n while (onBridge.length > 0 || truck_weights.length > 0) {\n if (onBridge[0].timeToOut === tick) weightOnBridge -= onBridge.shift().weight\n if (weightOnBridge + truck_weights[0] <= weight) {\n weightOnBridge += truck_weights[0]\n onBridge.push({weight: truck_weights.shift(), timeToOut: tick + bridge_length})\n } else {\n if (onBridge[0]) tick = onBridge[0].timeToOut - 1 // 시간을 줄이는 포인트\n }\n tick++\n }\n return tick\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42583" - }, - { - "id": "12911", - "name": "다음 큰 숫자", - "fileName": "다음-큰-숫자&12911&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n let answer = n;\n const nCountOne = n.toString(2).match(/1/g).length\n while (true) {\n answer++\n if (nCountOne === (answer).toString(2).match(/1/g).length) break\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12911" - }, - { - "id": "118667", - "name": "두 큐 합 같게 만들기", - "fileName": "두-큐-합-같게-만들기&118667&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(queue1, queue2) {\n const getSum = arr => arr.reduce((a, c) => a + c, 0);\n\n if (getSum([...queue1, ...queue2]) % 2 !== 0) return -1;\n\n const queue = [...queue1, ...queue2, ...queue1, ...queue2];\n const maxCount = queue.length;\n const average = getSum(queue) / 4;\n let [currentSum, count, start, end] = [getSum(queue1), 0, 0, queue1.length];\n\n const pop = () => {\n currentSum -= queue[start];\n start += 1;\n count += 1;\n };\n const insert = () => {\n currentSum += queue[end];\n end += 1;\n count += 1;\n };\n\n while (count <= maxCount) {\n if (currentSum < average) insert();\n if (currentSum > average) pop();\n if (currentSum === average) return count;\n }\n return -1;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/118667" - }, - { - "id": "12913", - "name": "땅따먹기", - "fileName": "땅따먹기&12913&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - jaewon1676\nfunction solution(land) {\n var answer = 0;\n \n for (i = 1; i < land.length; i++){\n land[i][0] += (Math.max(land[i-1][1], land[i-1][2], land[i-1][3]));\n land[i][1] += (Math.max(land[i-1][0], land[i-1][2], land[i-1][3]));\n land[i][2] += (Math.max(land[i-1][0], land[i-1][1], land[i-1][3]));\n land[i][3] += (Math.max(land[i-1][0], land[i-1][1], land[i-1][2]))\n }\n answer = land[land.length - 1]\n return Math.max(...answer)\n}\n/* 풀이 과정\n1. land의 행만큼 반복문을 돌린다.\n2. i행(두번째 행)부터 land.length - 1행(마지막 행)까지 본인 열을 제외한 나머지 열의 최댓값을 본인의 열에 더하여 누적한다.\n3. 마지막까지 다 구하면 마지막 행에서 최대값을 반환한다.*/\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12913" - }, - { - "id": "12914", - "name": "멀리 뛰기", - "fileName": "멀리-뛰기&12914&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n if (n < 2) return 1;\n const count = [0, 1, 2, ...Array(n - 2).fill(0)];\n count.forEach((_, i) => {\n if (i > 2) count[i] = (count[i - 2] + count[i - 1]) % 1234567;\n });\n return count[n];\n}\n//재귀를 사용하면 콜스택 오버플로우가 발생합니다.\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12914" - }, - { - "id": "62048", - "name": "멀쩡한 사각형", - "fileName": "멀쩡한-사각형&62048&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(w, h) {\n var answer = 1;\n const gcd = greatestCommonDivisor(w, h)\n answer = w * h - (h + w - gcd)\n return answer;\n}\n\nlet greatestCommonDivisor = (a, b) => {\n while (b > 0) {\n let r = a % b;\n a = b;\n b = r;\n }\n return a;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/62048" - }, - { - "id": "72411", - "name": "메뉴 리뉴얼", - "fileName": "메뉴-리뉴얼&72411&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(orders, course) {\n var answer = [];\n for (const selectNum of course) {\n let combinations = []\n for (const order of orders) {\n getCombinations(Array.from(order), selectNum)\n .map(combination => combination.sort().join(''))// 'WX'는 'XW'와 같아야한다.\n .forEach(combString => combinations.push(combString))\n }\n const combCounts = combinations.reduce((counts, combination) => {\n counts[combination] = (counts[combination] || 0) + 1;\n return counts;\n }, {});\n let maxCount = 0, maxComb = []\n for (const comb in combCounts) if (combCounts[comb] >= maxCount) maxCount = combCounts[comb]\n for (const comb in combCounts) if (combCounts[comb] === maxCount && maxCount >= 2) maxComb.push(comb)\n answer.push(...maxComb)\n }\n answer = answer.sort()\n return answer;\n}\n\nconst getCombinations = (array, selectNum) => {\n const result = [];\n if (selectNum === 1) return array.map((element) => [element]);\n array.forEach((fixed, index, origin) => {\n const restCombinations = getCombinations(origin.slice(index + 1), selectNum - 1);\n const attached = restCombinations.map((restCombination) => [fixed, ...restCombination]);\n result.push(...attached);\n });\n return result;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/72411" - }, - { - "id": "84512", - "name": "모음사전", - "fileName": "모음사전&84512&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(word) {\n const alphabetRank = { A: 0, E: 1, I: 2, O: 3, U: 4 };\n const price = calculatePrice([1], 5);\n return word\n .split(\"\")\n .map((alphabet, index) => 1 + price[index] * alphabetRank[alphabet])\n .reduce((acc, curr) => acc + curr, 0);\n}\nconst calculatePrice = (result = [1], targetLength) => {\n if (result.length === targetLength) return result;\n return calculatePrice([result[0] * 5 + 1, ...result], targetLength);\n};\n/*\n각 자리 문자를 바로 다음 문자로 바꾸는 데에 얼마의 비용이 들까?\n4번째 자리 - 1\n3번째 자리 - 1*5 + 1 = 6\n2번째 자리 - 6*5 + 1 = 31\n1번째 자리 - 31*5 + 1 = 156\n0번째 자리 - 156*5 + 1 = 781\n\n검증(1부터 시작하므로 1 + 비용)\nI => (1 + 781 * 2) = 1563\nEIO => (1 + 781 * 1) + (1 + 156 * 2) + (1 + 31 * 3) = 1189\nAAAE => 1 + 1 + 1 + (1 + 6 * 1) = 10\nAAAAE => 1 + 1 + 1 + 1 + (1 + 1*1) = 6\n추천 레퍼런스: https://seongho96.tistory.com/50\n*/\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/84512" - }, - { - "id": "60057", - "name": "문자열 압축", - "fileName": "문자열-압축&60057&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n var answer = 0;\n let lengthArr = []\n for (let i = 1; i <= s.length; i++) lengthArr.push(compressedString(s, i).length)\n answer = Math.min(...lengthArr)\n return answer;\n}\n\nfunction compressedString(str, unitNum) {\n let count = 1\n let result = ['']\n for (let repeat = 0; repeat <= str.length / unitNum; repeat++) {\n const slicedGroup = str.slice(unitNum * repeat, unitNum * repeat + unitNum)\n if (result[result.length - 1] === slicedGroup) {\n count++\n } else {\n if (count > 1) result[result.length - 1] = count + result[result.length - 1]\n result.push(slicedGroup)\n count = 1\n }\n }\n return result.join('')\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/60057" - }, - { - "id": "49994", - "name": "방문 길이", - "fileName": "방문-길이&49994&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(dirs) {\n const move = ([x, y], dir) => {\n let next = [x, y];\n if (dir === 'U') next = [x, y + 1];\n if (dir === 'D') next = [x, y - 1];\n if (dir === 'R') next = [x + 1, y];\n if (dir === 'L') next = [x - 1, y];\n if (Math.abs(next[0]) > 5 || Math.abs(next[1]) > 5) return [x, y];\n return next;\n };\n\n const isSameRoute = ([s1, e1], [s2, e2]) => {\n const isSamePoint = ([x1, y1], [x2, y2]) => x1 === x2 && y1 === y2;\n return (isSamePoint(s1, s2) && isSamePoint(e1, e2)) || (isSamePoint(s1, e2) && isSamePoint(s2, e1));\n };\n\n const trace = {\n visited: [],\n visit(start, end) {\n if (start[0] === end[0] && start[1] === end[1]) return;\n if (!this.visited.find(route => isSameRoute(route, [start, end]))) this.visited.push([start, end]);\n },\n };\n\n let current = [0, 0];\n\n dirs.split('').forEach(dir => {\n const next = move(current, dir);\n trace.visit(current, next);\n current = next;\n });\n\n return trace.visited.length;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/49994" - }, - { - "id": "12978", - "name": "배달", - "fileName": "배달&12978&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n\n// 1 - pereng11\n// 다익스트라 + 최소힙 O( N * logN ) \n // [목적지, 거리] 노드를 값으로 가지는, 거리에 대한 최소힙 \nclass MinHeap{\n constructor ()\n {\n this.heap = [ null ];\n }\n // 맨 끝에 노드를 삽입 후 위로 올라가면서 정렬\n push ( val )\n {\n this.heap.push(val);\n let childIdx = this.heap.length-1;\n let parentIdx = Math.floor(childIdx / 2);\n while(parentIdx > 0 && this.heap[parentIdx][1] > this.heap[childIdx][1]){\n this.swap( childIdx, parentIdx );\n childIdx = parentIdx;\n parentIdx = Math.floor(childIdx / 2);\n }\n }\n pop ()\n {\n if ( this.heap.length === 1 )\n {\n return undefined;\n }\n // 최소값은 빼두었다가 리턴하고, 가장 끝 값을 맨 위로 가져와 아래로 내려가면서 정렬\n const minNode = this.heap[ 1 ];\n this.heap[ 1 ] = this.heap[ this.heap.length - 1 ];\n this.heap.pop();\n let parentIdx = 1;\n let leftChildIdx = 2;\n let rightChildIdx = 3;\n while ( parentIdx < this.heap.length )\n {\n // 자식이 없는 경우 \n if ( !this.heap[ leftChildIdx ] )\n {\n break;\n } // 왼쪽 자식만 있는 경우\n else if ( !this.heap[ rightChildIdx ] )\n {\n if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] )\n {\n this.swap( parentIdx, leftChildIdx );\n }\n break;\n // 둘 중 하나가 부모보다 작을 때, 더 작은 쪽으로 정렬\n } else if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] || this.heap[ parentIdx ][ 1 ] > this.heap[ rightChildIdx ][ 1 ] )\n {\n const minChildIdx = this.heap[ leftChildIdx ][ 1 ] < this.heap[ rightChildIdx ][ 1 ] ? leftChildIdx : rightChildIdx;\n this.swap( parentIdx, minChildIdx );\n parentIdx = minChildIdx;\n leftChildIdx = parentIdx * 2\n rightChildIdx = parentIdx * 2 + 1;\n } else\n {\n // 끝까지 내려가지 않았더라도 부모가 가장 작으면 정렬 중지\n break;\n }\n }\n return minNode;\n }\n swap ( idx1, idx2 )\n {\n [ this.heap[ idx1 ], this.heap[ idx2 ] ] = [ this.heap[ idx2 ], this.heap[ idx1 ] ];\n }\n length ()\n {\n return this.heap.length;\n }\n}\n \nfunction solution ( N, road, K )\n{\n const roadsTable = {}; //전체 도로 정보\n \n // 도로 정보 초기화 roadTable[시작점] = [목적지, 거리] 배열\n for ( let i = 1; i <= N; i++ )\n {\n roadsTable[ i ] = [];\n }\n road.forEach( road =>\n {\n let [ sp, ep, dist ] = road;\n roadsTable[ sp ].push( [ ep, dist ] );\n roadsTable[ ep ].push( [ sp, dist ] );\n } );\n\n function djikstra ( sp )\n {\n const visited = new Array( N + 1 ).fill( false ); //방문 확인 배열\n const dist = new Array( N + 1 ).fill( Infinity ); //목표지점까지 거리\n const heap = new MinHeap();\n\n //시작점 삽입\n heap.push( [sp, 0] );\n\n // 가장 가까운 목적지부터 순서대로 방문\n while ( heap.length() > 1 )\n {\n //힙에 저장된 목적지 중 가장 가까운 거리의 목적지를 꺼냄 [목적지, 거리]\n const [ ep, val ] = heap.pop();\n //아직 방문하지 않은 곳만 처리\n if ( !visited[ ep ] )\n {\n //방문처리, 거리 저장\n visited[ ep ] = true;\n dist[ ep ] = val;\n //방문 지점을 거쳐서 가는 다른 목적지 구하기\n const nexts = roadsTable[ ep ];\n if ( nexts )\n {\n nexts.forEach( n =>\n {\n let [ nextEp, nextVal ] = n;\n if ( !visited[ nextEp ] ) //아직 방문하지 않은 곳일 경우, '지금까지의 거리 + 현재 위치에서의 거리'로 힙에 삽입\n {\n heap.push( [ nextEp, val + nextVal ] );\n }\n })\n }\n }\n }\n // 거리가 K이하인 지점의 개수 반환\n const result = dist.filter( d => d <= K ).length;\n return result;\n }\n \n const answer = djikstra( 1 );\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12978" - }, - { - "id": "86052", - "name": "빛의 경로 사이클", - "fileName": "빛의-경로-사이클&86052&.js", - "level": 2, - "code": "// https://github.com/codeisneverodd/programmers-coding-test\n// 완벽한 정답이 아닙니다.\n// 1 - minjongbaek\n\n// 빛의 이동을 위한 DX, DY 변수를 선언합니다.\nconst DX = [-1, 1, 0, 0];\nconst DY = [0, 0, -1, 1];\n\nfunction solution(grid) {\n\n // DFS에 4방향을 고려하여 문제를 풉니다.\n // 핵심은 이미 방문한 칸이고 방향이 동일하다면 하나의 사이클이 형성된 것으로 생각해야합니다.\n\n const answer = [];\n\n // visited 변수를 선언 후 방문 여부를 확인할 3차원 배열을 할당합니다. [x좌표, y좌표, [하, 상, 좌, 우]]\n const visited = Array.from({ length: grid.length }, () => []).map((v) => {\n for (let i = 0; i < grid[0].length; i += 1) {\n v.push(new Array(4).fill(false));\n }\n return v\n });\n\n for (let x = 0; x < grid.length; x += 1) {\n for (let y = 0; y < grid[0].length; y += 1) {\n for (let d = 0; d < 4; d += 1) {\n // x, y 좌표에 하, 상, 좌, 우 방향으로 방문한 적이 없다면 dfs를 수행합니다.\n if (!visited[x][y][d]) {\n const stack = [];\n stack.push([x, y, d]);\n\n let cnt = 0;\n while (stack.length !== 0) {\n const [currentX, currentY, currentD] = stack.pop();\n if (!visited[currentX][currentY][currentD]) {\n visited[currentX][currentY][currentD] = true;\n cnt += 1;\n\n const [nextX, nextY] = getNextXY(currentX, currentY, currentD, grid.length, grid[0].length); // 다음으로 이동할 좌표를 구합니다.\n const nextD = getNextD(grid[nextX][nextY], currentD) // x, y 칸에 적혀있는 문자열대로 방향을 다음 방향을 구합니다.\n \n stack.push([nextX, nextY, nextD])\n }\n\n }\n answer.push(cnt);\n }\n }\n }\n }\n return answer.sort((a, b) => a - b);\n}\n\n// 다음 행선지를 구하는 함수\nfunction getNextXY(x, y, d, xLength, yLength) {\n x += DX[d];\n y += DY[d];\n\n // x나 y의 값이 유효하지 않은 경우 값을 재할당합니다.\n if (x < 0) x = xLength - 1;\n if (x >= xLength) x = 0;\n if (y < 0) y = yLength - 1;\n if (y >= yLength) y = 0;\n\n return [x, y];\n}\n\n// 현재 방향과 칸에 표시된 문자를 기준으로 다음 행선지의 방향을 구하는 함수\nfunction getNextD(command, d) {\n if (command === 'L') {\n d = [2, 3, 1, 0][d]\n } else if (command === 'R') {\n d = [3, 2, 0, 1][d]\n }\n return d\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/86052" - }, - { - "id": "68645", - "name": "삼각 달팽이", - "fileName": "삼각-달팽이&68645&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n const snail = Array.from(Array(n), (_, index) => Array(index + 1));\n let currentNum = 0;\n let [currentRow, currentCol] = [-1, 0];\n let shouldMove = n;\n while (shouldMove > 0) {\n for (let i = 0; i < shouldMove; i++)\n snail[++currentRow][currentCol] = ++currentNum;\n for (let i = 0; i < shouldMove - 1; i++)\n snail[currentRow][++currentCol] = ++currentNum;\n for (let i = 0; i < shouldMove - 2; i++)\n snail[--currentRow][--currentCol] = ++currentNum;\n shouldMove -= 3;\n }\n return snail.flatMap((num) => num);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/68645" - }, - { - "id": "42839", - "name": "소수 찾기", - "fileName": "소수-찾기&42839&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(numbers) {\n var answer = 0;\n const numArr = numbers.split('')\n const permutationAll = []\n for (let r = 1; r <= numbers.length; r++) {\n const permutationR\n = Permutation(numArr, r).map((permuArr) =>\n parseInt(permuArr.join(''))\n )\n for (let i = 0; i < permutationR.length; i++) permutationAll.push(permutationR[i])\n }\n const permutationSet = [...new Set(permutationAll)]\n for (const number of permutationSet) answer += isPrime(number) ? 1 : 0\n return answer;\n}\n\nfunction Permutation(arr, r) {\n const result = []\n if (r === 1) return arr.map((num) => [num])\n arr.forEach((fixed, index, org) => {\n const rest = [...org.slice(0, index), ...org.slice(index + 1)]\n const permutation = Permutation(rest, r - 1)\n const attached = permutation.map((numbers) => [fixed, ...numbers])\n result.push(...attached)\n })\n return result\n}\n\nfunction isPrime(num) {\n for (let i = 2; i <= Math.sqrt(num); i++) if (num % i === 0) return false\n return num >= 2\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42839" - }, - { - "id": "67257", - "name": "수식 최대화", - "fileName": "수식-최대화&67257&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(expression) {\n var answer = 0;\n const mathExp = ['*', '+', '-']\n let priorityArr = Permutation(mathExp, 3)\n const calculated = []\n for (const priority of priorityArr) {\n const expressionArr = expression.split(/(\\D)/)\n for (const exp of priority) {\n while (expressionArr.includes(exp)) {\n const index = expressionArr.indexOf(exp)\n expressionArr.splice(index - 1, 3, eval(expressionArr.slice(index - 1, index + 2).join('')))\n }\n }\n calculated.push(Math.abs(expressionArr[0]))\n }\n answer = Math.max(...calculated)\n return answer\n}\n\nfunction Permutation(arr, r) {\n const result = []\n if (r === 1) return arr.map((num) => [num])\n arr.forEach((fixed, index, org) => {\n const rest = [...org.slice(0, index), ...org.slice(index + 1)]\n const permutation = Permutation(rest, r - 1)\n const attached = permutation.map((numbers) => [fixed, ...numbers])\n result.push(...attached)\n })\n return result\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/67257" - }, - { - "id": "72412", - "name": "순위 검색", - "fileName": "순위-검색&72412&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(infos, queries) {\n const infoData = {};\n\n const fetchInfoData = (keyArr, score, start) => {\n const key = keyArr.join('');\n\n infoData[key] ? infoData[key].push(score) : (infoData[key] = [score]);\n\n for (let i = start; i < keyArr.length; i++) {\n fetchInfoData(\n keyArr.map((v, index) => (index === i ? '-' : v)),\n score,\n i + 1\n );\n }\n };\n\n const getPassCount = (key, passScore) => {\n const scores = infoData[key];\n\n if (!scores) return 0;\n\n let [left, right] = [0, scores.length];\n\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n scores[mid] >= passScore ? (right = mid) : (left = mid + 1);\n }\n\n return scores.length - left;\n };\n\n infos\n .map(info => [info.split(' ').slice(0, 4), info.split(' ')[4]])\n .forEach(([keyArr, score]) => fetchInfoData(keyArr, +score, 0));\n\n Object.keys(infoData).forEach(key => {\n infoData[key].sort((a, b) => a - b);\n });\n\n return queries\n .map(query => query.replace(/ and /g, '').split(' '))\n .map(([key, passScore]) => getPassCount(key, +passScore));\n}\n// 주의 할 점\n// 1. 중첩 구조에 있는 객체를 수정할 때 새로운 객체를 만들어 재할당하면 효율성에 걸림\n// 2. 고차함수 중첩하면 새로운 객체를 만드는 행위가 너무 많음으로 효율성에 걸림.\n// 3. filter 대신 정렬 후 이진 탐색을 활용해야 효율성에 걸리지 않음.\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/72412" - }, - { - "id": "12923", - "name": "숫자 블록", - "fileName": "숫자-블록&12923&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - iHoHyeon\nfunction solution(begin, end) {\n return new Array(end - begin + 1).fill(null).map((v, idx) => calc(begin + idx));\n // begin ~ end 각 위치에 대해서 calc 함수의 return 값으로 채운다.\n}\n \nconst calc = (number) => {\n if (number === 1) return 0;\n // 1번째 위치는 무조건 0블록이 위치\n\n for (let i = 2; i <= Math.sqrt(number); i++) {\n if (number % i === 0 && number / i <= 10_000_000) return number / i;\n // 10_000_000번 블록까지만 놓았으므로 숫자를 초과하는 경우는 제외\n }\n\n return 1;\n};\n\n/*\n 1번 블록부터 10_000_000번 블록까지 전부 규칙에 따라서 놓는 경우는\n 시간 / 공간 복잡도가 급상승\n\n -> 따라서 각 위치에 어떤 숫자의 블록이 놓일지를 계산해주자\n \n -> n번째 위치에는 1, n을 제외한 n의 가장 큰 약수의 블록이 놓이게 된다.\n\n -> 가장 큰 약수는 n / (n의 가장 작은 약수)임을 이용해서 계산해주면 된다.\n\n + 가장 큰 약수가 1인 경우는 소수인 경우이고 숫자 1 블록이 놓인다.\n*/\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12923" - }, - { - "id": "12924", - "name": "숫자의 표현", - "fileName": "숫자의-표현&12924&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) { //수학적 풀이는 별도로 하지 않았습니다.\n var answer = 0;\n for (let i = 1; i <= n; i++) {\n let sum = 0\n for (let j = i; j <= n; j++) {\n sum += j\n if (sum >= n) {\n if (sum === n) answer++\n break\n }\n }\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12924" - }, - { - "id": "49993", - "name": "스킬트리", - "fileName": "스킬트리&49993&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(skill, skill_trees) {\n var answer = 0;\n for (const tree of skill_trees) {\n let check = Array.from(tree).filter(x => skill.includes(x)).map(x => skill.indexOf(x))\n if (checkOrder(check)) answer += 1\n }\n return answer;\n}\n\nfunction checkOrder(checkArr) {\n for (let i = 0; i < checkArr.length; i++) if (checkArr[i] !== i) return false\n return true\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/49993" - }, - { - "id": "92342", - "name": "양궁대회", - "fileName": "양궁대회&92342&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\n// 문제 풀이 전략\n// 1. 라이언이 쏠 수 있는 모든 경우를 비교한다.\n// 2. 10점부터 0점 순으로 어피치와 라이언을 비교해 가면서, 라이언이 해당 점수를 이길지, 비길지, 질지를 결정하며 가능한 경우를 만들어 간다.\n// 3. 이기는 경우는 화살을 어피치 + 1 개, 비기는 경우는 어피치와 동일한 개수를 소모하고, 지는 경우는 화살을 쏘지 않는다.\n// 4. 단, 0점에 도달하기 전에 화살을 모두 소진하면 더이상 쏠 화살이 없으므로 나머지 점수는 쏘지 않은 것으로 한다. 마찬가지로 0점에 도달하였는데 화살이 남아있더라면, 남은 화살을 모두 0점에 쏜다.\n// 5. 따라서 [지금까지 화살을 쏜 상황, 현재 검사중인 점수, 남은 화살 수]를 파라미터로 갖는 재귀함수를 구현하면 모든 경우를 검사할 수 있다.\n// 6. 모든 경우가 구해졌다면, 어피치와 라이언의 점수차가 가장 큰 경우들만 남긴다\n// 7. 가장 큰 경우들이 여러개라면 각 경우들을 중 마지막으로 쏜 화살의 점수 배점이 낮은 경우를 우선적으로 정렬한다.\n// RETURN. 정렬이 완료되면 가장 우선순위가 높은 경우를 반환한다.\nfunction solution(possibleArrows, apeachComb) {\n const compareTable = apeachComb.map(apeachArrow => ({\n apeachArrow,\n ryanArrow: 0,\n }));\n const possibleRyanTable = getPossibleRyanTable(compareTable, 0, possibleArrows);\n const maxScoreDiff = Math.max(...possibleRyanTable.flatMap(({ scoreDiff }) => scoreDiff));\n const maxRyanTables = possibleRyanTable.filter(({ scoreDiff }) => scoreDiff === maxScoreDiff);\n if (maxScoreDiff <= 0) return [-1];\n const getIndexOfLastArrow = arrowTable =>\n arrowTable.length -\n arrowTable\n .slice()\n .reverse()\n .findIndex(x => x !== 0);\n return maxRyanTables.sort((a, b) => getIndexOfLastArrow(b.ryanTable) - getIndexOfLastArrow(a.ryanTable))[0].ryanTable;\n}\nfunction getPossibleRyanTable(compareTable, currentIndex, numberOfArrowLeft) {\n const { apeachArrow } = compareTable[currentIndex];\n const lastIndex = compareTable.length - 1;\n const possibleRyanArrows = [\n 0,\n numberOfArrowLeft > apeachArrow && apeachArrow + 1,\n numberOfArrowLeft >= apeachArrow && apeachArrow,\n ];\n\n if (currentIndex === lastIndex || numberOfArrowLeft === 0) {\n if (numberOfArrowLeft > 0) {\n compareTable[compareTable.length - 1] = {\n apeachArrow,\n ryanArrow: numberOfArrowLeft,\n };\n }\n const appeachScore = compareTable.reduce(\n (acc, { apeachArrow, ryanArrow }, index) =>\n apeachArrow >= ryanArrow && apeachArrow !== 0 ? acc + 10 - index : acc,\n 0\n );\n const ryanScore = compareTable.reduce(\n (acc, { apeachArrow, ryanArrow }, index) => (ryanArrow > apeachArrow ? acc + 10 - index : acc),\n 0\n );\n return [\n {\n scoreDiff: ryanScore - appeachScore,\n ryanTable: compareTable.flatMap(({ ryanArrow }) => ryanArrow),\n },\n ];\n }\n return [\n ...possibleRyanArrows.flatMap(ryanUsedArrow => {\n const nextCompareTable = [...compareTable];\n nextCompareTable.splice(currentIndex, 1, {\n apeachArrow,\n ryanArrow: ryanUsedArrow,\n });\n return getPossibleRyanTable(nextCompareTable, currentIndex + 1, numberOfArrowLeft - ryanUsedArrow);\n }),\n ];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/92342" - }, - { - "id": "12981", - "name": "영어 끝말잇기", - "fileName": "영어-끝말잇기&12981&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n, words) {\n var answer = [];\n let turn = 1\n for (let i = 1; i < words.length; i++) {\n let pass = (words[i][0] === words[i - 1][words[i - 1].length - 1]) && !(words.slice(0, i).includes(words[i]))\n if (i % n === 0) turn++\n if (!pass) return [i % n + 1, turn]\n }\n return [0, 0];\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12981" - }, - { - "id": "12985", - "name": "예상 대진표", - "fileName": "예상-대진표&12985&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\n\nfunction solution(n, a, b) {\n let currentRound = 1;\n const myNextNumber = (num) => Math.floor((num + 1) / 2)//내가 이긴경우 다음으로 가지게 될 번호\n while (a !== b) { // a의 다음 번호가 b의 다음번호와 같아지면 끝난다.\n if (myNextNumber(a) === myNextNumber(b)) break\n a = myNextNumber(a)\n b = myNextNumber(b)\n currentRound++\n }\n return currentRound\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12985" - }, - { - "id": "42888", - "name": "오픈채팅방", - "fileName": "오픈채팅방&42888&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(record) {\n var answer = [];\n const users = {}\n record.map(history => {\n const [action, id, name] = history.split(' ')\n if (action !== 'Leave') users[id] = name\n })\n record.map(history => {\n const [action, id, name] = history.split(' ')\n if (action === 'Enter') answer.push(`${users[id]}님이 들어왔습니다.`)\n if (action === 'Leave') answer.push(`${users[id]}님이 나갔습니다.`)\n })\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42888" - }, - { - "id": "12909", - "name": "올바른 괄호", - "fileName": "올바른-괄호&12909&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1(🎩 refactor 220425) - codeisneverodd\nfunction solution(s) {\n let opened = 0;\n for (const bracket of s) {\n if (bracket === \"(\") opened += 1;\n if (bracket === \")\") opened -= 1;\n if (opened < 0) return false;\n }\n return opened === 0;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12909" - }, - { - "id": "42578", - "name": "위장", - "fileName": "위장&42578&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(clothes) {\n\tvar answer = 1;\n\tconst spyWear = {};\n\tfor (const clothNPart of clothes)\n\t\tspyWear[clothNPart[1]] = (spyWear[clothNPart[1]] || 0) + 1;\n\tfor (const part in spyWear) answer *= spyWear[part] + 1;\n\treturn answer - 1;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42578" - }, - { - "id": "70129", - "name": "이진 변환 반복하기", - "fileName": "이진-변환-반복하기&70129&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n const removeZero = s => {\n const removed = s\n .split('')\n .filter(n => n !== '0')\n .join('');\n return { removed, count: s.length - removed.length };\n };\n\n const convertToBinary = (s, turnCount, removedCount) => {\n if (s === '1') return [turnCount, removedCount];\n const { removed, count } = removeZero(s);\n return convertToBinary(removed.length.toString(2), turnCount + 1, removedCount + count);\n };\n\n return convertToBinary(s, 0, 0);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/70129" - }, - { - "id": "86971", - "name": "전력망을 둘로 나누기", - "fileName": "전력망을-둘로-나누기&86971&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(n, wires) {\n const hasOneOfWire = (tree, [a, b]) => tree.includes(a) || tree.includes(b);\n\n const convertWiresToTree = wires => [...new Set(wires.flat())];\n\n const generateTree = (wires, tree) => {\n if (!wires.find(wire => hasOneOfWire(tree, wire))) return tree;\n\n const nextWires = wires.filter(wire => !hasOneOfWire(tree, wire));\n const nextTree = [...tree, ...convertWiresToTree(wires.filter(wire => hasOneOfWire(tree, wire)))];\n\n return [...new Set(generateTree(nextWires, nextTree))];\n };\n\n let minDiff = Infinity;\n const length = convertWiresToTree(wires).length;\n\n wires.forEach((_, i) => {\n const [initWire, ...remainWires] = wires.filter((_, j) => j !== i);\n const lengthA = generateTree(remainWires, convertWiresToTree([initWire])).length;\n const diff = Math.abs(lengthA - (length - lengthA));\n minDiff = Math.min(diff, minDiff);\n });\n\n return minDiff;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/86971" - }, - { - "id": "12980", - "name": "점프와 순간 이동", - "fileName": "점프와-순간-이동&12980&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n var ans = 0;\n while (n > 0) {\n if (n % 2 !== 0) {\n n = (n - 1) / 2\n ans++\n } else {\n n = n / 2\n }\n }\n return ans;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12980" - }, - { - "id": "42860", - "name": "조이스틱", - "fileName": "조이스틱&42860&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(name) {\n var answer = 0;\n const length = name.length;\n let upDownCount = 0\n let leftRightCountList = [length - 1]//한 방향으로 쭉 갔을 때\n for (let i = 0; i < length; i++) upDownCount += minUpOrDownCount(name[i])\n for (let startOfA = 0; startOfA < name.length; startOfA++) {\n let endOfA = startOfA + 1;\n while (endOfA < length && name[endOfA] === 'A') endOfA++;\n const [moveToStartOfA, moveToEndOfA] = [startOfA, length - endOfA]\n leftRightCountList.push(moveToStartOfA * 2 + moveToEndOfA)// 0 -> A.., 0 <- A.., ..A <- -1\n leftRightCountList.push(moveToEndOfA * 2 + moveToStartOfA)//시작부터 뒤로 가는 경우 ..A <- -1, ..A -> -1, 0 -> A..\n }\n answer = upDownCount + Math.min(...leftRightCountList)\n return answer;\n}\n\nfunction minUpOrDownCount(destination) {\n const Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n const index = Alphabet.indexOf(destination)\n return Math.min(index, Alphabet.length - index)\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42860" - }, - { - "id": "92341", - "name": "주차 요금 계산", - "fileName": "주차-요금-계산&92341&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - ljw0096\n\nfunction solution(fees, records) {\n const answer = []\n\n const parkingTable = getParkingTable(records)\n const sortedKeys = Object.keys(parkingTable).sort()\n\n for (const targetCar of sortedKeys) {\n if (parkingTable[targetCar].length % 2 === 1) {\n parkingTable[targetCar].push(['23:59', 'OUT'])\n }\n const totalTime = getTotalTime(parkingTable, targetCar)\n const fee = calculateFee(totalTime, fees)\n answer.push(fee)\n }\n\n return answer\n}\n\nfunction getParkingTable(records) {\n const parkingTable = {}\n\n records.forEach((val) => {\n const info = val.split(' ')\n if (Object.keys(parkingTable).includes(info[1])) {\n parkingTable[info[1]].push([info[0], info[2]])\n } else {\n parkingTable[info[1]] = [[info[0], info[2]]]\n }\n })\n\n return parkingTable\n}\n\nfunction getTotalTime(parkingTable, targetCar) {\n let totalTime = 0\n for (let i = 0; i < parkingTable[targetCar].length - 1; i += 2) {\n totalTime += calculateTotalTime(\n parkingTable[targetCar][i][0],\n parkingTable[targetCar][i + 1][0]\n )\n }\n return totalTime\n}\n\nfunction calculateTotalTime(time1, time2) {\n const [hour1, minute1] = time1.split(':').map((val) => parseInt(val))\n const [hour2, minute2] = time2.split(':').map((val) => parseInt(val))\n\n return hour2 * 60 + minute2 - (hour1 * 60 + minute1)\n}\n\nfunction calculateFee(totalTime, feeInfo) {\n let fee = 0\n if (feeInfo[0] >= totalTime) {\n fee = feeInfo[1]\n } else {\n fee =\n feeInfo[1] + Math.ceil((totalTime - feeInfo[0]) / feeInfo[2]) * feeInfo[3]\n }\n return fee\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/92341" - }, - { - "id": "12936", - "name": "줄 서는 방법", - "fileName": "줄-서는-방법&12936&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(n, k) {\n const getFactorial = n => {\n const result = [1, 1, 2, ...Array(n - 2)];\n result.forEach((_, i) => {\n if (i > 2) result[i] = result[i - 1] * i;\n });\n return result;\n };\n\n const getDivision = (dividend, divisor) => {\n const quotient = Math.floor(dividend / divisor);\n const remainder = dividend % divisor;\n return [quotient, remainder];\n };\n\n const stepCount = getFactorial(n).reverse();\n\n const generateSteps = (k, step) => {\n const [q, r] = getDivision(k, stepCount[step]);\n if (r === 0) return [q];\n return [q, ...generateSteps(r, step + 1)];\n };\n\n const answer = [];\n\n const steps = generateSteps(k - 1, 0);\n\n const notUsedNums = Array.from({ length: n }, (_, i) => i + 1);\n\n steps.slice(1).forEach(q => {\n answer.push(notUsedNums[q]);\n notUsedNums.splice(q, 1);\n });\n\n return [...answer, ...notUsedNums];\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12936" - }, - { - "id": "12973", - "name": "짝지어 제거하기", - "fileName": "짝지어-제거하기&12973&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n var answer = -1;\n let notPairStack = []\n for (let i = 0; i < s.length; i++) notPairStack[notPairStack.length - 1] === s[i] ? notPairStack.pop() : notPairStack.push(s[i])\n answer = notPairStack.length === 0 ? 1 : 0\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12973" - }, - { - "id": "12939", - "name": "최댓값과 최솟값", - "fileName": "최댓값과-최솟값&12939&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n var answer = '';\n const arr = s.split(' ')\n answer = Math.min(...arr) + ' ' + Math.max(...arr)\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12939" - }, - { - "id": "12941", - "name": "최솟값 만들기", - "fileName": "최솟값-만들기&12941&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(A, B) {\n var answer = 0;\n A = A.sort((a, b) => a - b)\n B = B.sort((a, b) => b - a)\n for (let i = 0; i < A.length; i++) answer += A[i] * B[i]\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12941" - }, - { - "id": "42842", - "name": "카펫", - "fileName": "카펫&42842&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(brown, yellow) {\n var answer = [];\n const size = brown + yellow\n answer = widthHeightPair(size).filter(pair => (pair[0] + pair[1]) * 2 - 4 === brown)[0]\n return answer;\n}\n\nfunction widthHeightPair(size) {\n let result = []\n for (let i = 1; i <= Math.sqrt(size); i++) if (size % i === 0) result.push([size / i, i])\n return result\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42842" - }, - { - "id": "68936", - "name": "쿼드압축 후 개수 세기", - "fileName": "쿼드압축-후-개수-세기&68936&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - codeisneverodd\nfunction solution(arr) {\n const quad = matrix => {\n const length = matrix.length;\n const half = length / 2;\n const pass = matrix => matrix.every(row => row.every(v => v === matrix[0][0]));\n\n if (pass(matrix)) return [matrix[0][0]];\n if (length <= 2) return matrix;\n\n const startPoints = [\n [0, 0],\n [0, half],\n [half, 0],\n [half, half],\n ];\n\n return startPoints.map(([r, c]) => quad(matrix.slice(r, r + half).map(row => row.slice(c, c + half))));\n };\n return quad(arr)\n .flat(Infinity)\n .reduce((a, c) => (c === 0 ? [a[0] + 1, a[1]] : [a[0], a[1] + 1]), [0, 0]);\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/68936" - }, - { - "id": "42883", - "name": "큰 수 만들기", - "fileName": "큰-수-만들기&42883&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(number, k) {\n var answer = '';\n let answerStack = [0]\n let deleteCount = -1\n for (let i = 0; i < number.length; i++) {\n while (deleteCount < k && number[i] > answerStack[answerStack.length - 1]) {\n answerStack.pop()\n deleteCount++\n }\n if (answerStack.length < number.length - k) answerStack.push(number[i])\n }\n answer = answerStack.join('')\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42883" - }, - { - "id": "43165", - "name": "타겟 넘버", - "fileName": "타겟-넘버&43165&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1(🎩 refactor 220830) - codeisneverodd\nfunction solution(numbers, target) {\n const dfs = (index, sum) => {\n if (index === numbers.length) return sum === target ? 1 : 0;\n return dfs(index + 1, sum + numbers[index]) + dfs(index + 1, sum - numbers[index]);\n };\n return dfs(0, 0);\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/43165" - }, - { - "id": "64065", - "name": "튜플", - "fileName": "튜플&64065&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(s) {\n var answer = [];\n let sets = s\n .slice(2, -2)\n .split('},{')\n .map(set => set.split(',').map(x => parseInt(x)))\n .sort((a, b) => a.length - b.length)\n for (const set of sets) answer.push(...set.filter(x => !answer.includes(x)))\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/64065" - }, - { - "id": "42587", - "name": "프린터", - "fileName": "프린터&42587&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(priorities, location) {\n var answer = 0;\n let documents = priorities.map((priority, index) => ({location: index, priority: priority}))\n let locationPrinted = false\n while (!locationPrinted) {\n const shifted = documents.shift()\n let printAvailable = true\n if (documents.some((document) => shifted.priority < document.priority)) printAvailable = false\n if (printAvailable) {\n answer += 1\n if (shifted.location === location) locationPrinted = true\n } else {\n documents.push(shifted)\n }\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42587" - }, - { - "id": "87946", - "name": "피로도", - "fileName": "피로도&87946&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - pereng11\n//완전 탐색, greedy O(N^2)\nfunction solution(currentFatigue, dungeons) {\n return getMaxCount(currentFatigue, 0, dungeons);\n}\n\nfunction getMaxCount(currentFatigue, visitedCount, dungeons) {\n const possibleDungeons = dungeons.filter(([minNeededFatigue, _]) => minNeededFatigue <= currentFatigue);\n if (possibleDungeons.length === 0) return visitedCount;\n\n const maxCount = possibleDungeons.reduce((prevCount, curr, currentIndex) => {\n const [_, usedFatigue] = curr;\n const nextDungeons = possibleDungeons.filter((_, index) => index !== currentIndex);\n const currentCount = getMaxCount(\n currentFatigue - usedFatigue,\n visitedCount + 1,\n nextDungeons\n );\n return Math.max(currentCount, prevCount);\n }, 0);\n\n return maxCount;\n}\n\n\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/87946" - }, - { - "id": "12945", - "name": "피보나치 수", - "fileName": "피보나치-수&12945&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n var answer = 0;\n answer = fibonacci1234567(n)\n return answer;\n}\n\nfunction fibonacci1234567(n) { //재귀적으로 하면 시간초과\n let fiboArr = new Array(n + 1).fill(0)\n fiboArr[0] = 0\n fiboArr[1] = 1\n for (let i = 2; i <= n; i++) fiboArr[i] = (fiboArr[i - 1] + fiboArr[i - 2]) % 1234567 //1234567로 나눈 나머지로 하지 않으면 정수범위 초과\n return fiboArr[n]\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12945" - }, - { - "id": "12946", - "name": "하노이의 탑", - "fileName": "하노이의-탑&12946&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n return move(1, 3, 2, n);\n}\nconst move = (departure, destination, waypoint, numberOfPlate) => {\n if (numberOfPlate === 1) return [[departure, destination]];\n return [\n ...move(departure, waypoint, destination, numberOfPlate - 1),\n ...move(departure, destination, waypoint, 1),\n ...move(waypoint, destination, departure, numberOfPlate - 1),\n ];\n};\n//재귀를 생각해보기에 좋은 문제입니다.\n//추천 레퍼런스 https://shoark7.github.io/programming/algorithm/tower-of-hanoi\n/*\nn개가 있다면\n1. 1->2로 n-1개를 옮김\n2. 1->3으로 가장 큰 1개를 옮김\n3. 2->1로 n-2개를 옮김\n4. 2->3으로 2번에 있는 것 중 가장 큰 1개를 옮김\n의 반복\n\n결국 무엇이든 a -> b 로 n 를 옮기는 동작의 반복이므로 이를 재귀로 표현하면 됨.\na->b 로 n 을 옮기는 것은 a->c로 n-1개를 옮겨놓고, a->b로 하나를 옮긴 후, c->b로 n-1개를 옮기는 것의 반복 \n함수에서 a는 depature(출발지), b는 destination(도착지), c는 waypoint(경유지)로 작성되어있음.\n*/\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12946" - }, - { - "id": "77485", - "name": "행렬 테두리 회전하기", - "fileName": "행렬-테두리-회전하기&77485&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(rows, columns, queries) {\n var answer = [];\n let matrix = new Array(rows)\n for (let i = 0; i < rows; i++) matrix[i] = new Array(columns)\n for (let i = 0; i < rows; i++) for (let j = 0; j < columns; j++) matrix[i][j] = i * columns + j + 1\n for (const query of queries) {\n let order = []\n const [row1, col1, row2, col2] = [query[0] - 1, query[1] - 1, query[2] - 1, query[3] - 1]\n //fill order (row1->row2, col1->col2, row2->row2, col2->col1)\n for (let i = row1; i <= row2; i++) order.push(matrix[i][col1])\n for (let i = col1 + 1; i <= col2; i++) order.push(matrix[row2][i])\n for (let i = row2 - 1; i >= row1; i--) order.push(matrix[i][col2])\n for (let i = col2 - 1; i > col1; i--) order.push(matrix[row1][i])\n //rotate clockwise\n order.push(order.shift())\n answer.push(Math.min(...order))\n //change value in matrix\n for (let i = row1; i <= row2; i++) matrix[i][col1] = order.shift()\n for (let i = col1 + 1; i <= col2; i++) matrix[row2][i] = order.shift()\n for (let i = row2 - 1; i >= row1; i--) matrix[i][col2] = order.shift()\n for (let i = col2 - 1; i > col1; i--) matrix[row1][i] = order.shift()\n }\n return answer;\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/77485" - }, - { - "id": "12949", - "name": "행렬의 곱셈", - "fileName": "행렬의-곱셈&12949&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(arr1, arr2) {\n const [row, col] = [arr1.length, arr2[0].length]\n let answer = new Array(row);\n for (let i = 0; i < row; i++) answer[i] = new Array(col)\n //arr1의 열의 개수 = arr2의 행의 개수, arr1의 i번째 행과 arr2의 j번째 열의 원소들을 곱한 것들의 합이 answer[i][j] 값\n for (let i = 0; i < row; i++) {\n for (let j = 0; j < col; j++) {\n answer[i][j] = arr1[i].reduce((sum, arr1Value, rowIndex) => sum + arr1Value * arr2[rowIndex][j], 0)\n }\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12949" - }, - { - "id": "42890", - "name": "후보키", - "fileName": "후보키&42890&.js", - "level": 2, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(relation) {\n //1. 가능한 조합을 1개~Attribute개수 만큼 찾는다.\n //2. 해당 개수의 조합이 키가 될 수 있는지 검사하고, 가능하면 후보키에 추가한다.\n //3. 단 추가하려고 할 때, 후보키에 있는 값이 자신의 부분 집합이 될 수 있으면 추가하지 않는다.\n const keys = []\n const totalAttrCount = relation[0].length\n const indexList = Array.from(Array(totalAttrCount), (x, index) => index) // [0,1,2,3 ... totalAttrCount-1]\n\n //Fn for 2. 해당 조합으로 각 row의 attribute를 모았을 때 중복이 있는지를 반환하는 함수\n const isUnique = (relation, attrIndexComb) => {\n let result = Array.from(Array(relation.length), x => '')\n for (const attrIndex of attrIndexComb) {\n relation.forEach((row, rowIndex) => result[rowIndex] += row[attrIndex]) //Set를 이용해 중복 검사를 하기 위해 result에 string으로 넣음.\n }\n return result.length === [...new Set(result)].length\n }\n\n //Fn for 3. keys에 현재 구한 검사할 조합의 부분집합이 존재하는지 반환, 단 keys에 들어있는 각 조합의 크기는 현재 검사할 조합의 크기보다 작다.\n const isMinimal = (attrComb) => {\n for (const key of keys) if (key.every(attr => attrComb.includes(attr))) return false\n return true\n }\n\n //가능한 모든 조합을 검사\n for (let attrCount = 1; attrCount <= totalAttrCount; attrCount++) {\n const combinations = getCombinations(indexList, attrCount)\n for (const attrComb of combinations) {\n if (isMinimal(attrComb) && isUnique(relation, attrComb)) keys.push(attrComb)\n }\n }\n\n return keys.length\n}\n\n//Fn for 1. 조합을 반환하는 함수\nconst getCombinations = (array, selectNumber) => {\n const result = [];\n if (selectNumber === 1) {\n return array.map((element) => [element]);\n }\n array.forEach((fixed, index, origin) => {\n const restCombinations = getCombinations(origin.slice(index + 1), selectNumber - 1);\n const attached = restCombinations.map((restCombination) => [fixed, ...restCombination]);\n result.push(...attached);\n });\n return result;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42890" - }, - { - "id": "12900", - "name": "2 x n 타일링", - "fileName": "2-x-n-타일링&12900&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - jaewon1676\nfunction solution(n) {\n let dp = [0, 1, 2] // n이 1, 2일때는 바로 답을 출력,\n if (n>2){ // n이 3 이상이면 필요한 만큼의 수 까지만 수를 만들어준다.\n for (let i=3; i<=n; i++){\n dp.push((dp[i-1] + dp[i-2]) % 1000000007);\n }\n }\n return dp[n]\n}\n/* \nn이 1일땐 1, 2일땐 2, 3일땐 3, 4일땐 5 . . 의 식이 보인다.\nn = (n - 1) + (n - 2)의 식으로 구할 수 있고,\n제한 사항을 주의해서 풀어보자. */", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12900" - }, - { - "id": "12952", - "name": "N Queen", - "fileName": "N-Queen&12952&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n) {\n /*\n 1. 0번째 행에 0번째 queen을 놓는다.\n 2. 그 다음 행의 퀸은 이전 퀸들의 범위와 겹치지 않는 곳에 놓는다. 퀸은 한 행에 반드시 하나 두어야한다.\n 3. 마지막 열까지 도달하면 성공으로 간주하고 answer에 1을 더한다.\n 4. 0번째 queen의 위치를 바꿔가며 모두 시도한다.\n 4. 단, 체스판은 일차원 배열로 선언하고 index = 행, 값 = 열 로 생각한다.\n */\n let answer = 0;\n const canBePlacedOn = (chess, currentRow) => {\n //해당 행에 둔 queen이 유효한지\n for (let prevRow = 0; prevRow < currentRow; prevRow++) {\n const onDiagonal = currentRow - prevRow === Math.abs(chess[currentRow] - chess[prevRow])\n const onStraight = chess[prevRow] === chess[currentRow]\n if (onDiagonal || onStraight) return false\n }\n return true\n }\n const placeQueen = (chess, currentRow) => {\n //queen을 배치하다가 끝 행에 도착하면 1을 리턴, 도착하지 못하면 0을 리턴하여, 재귀적으로 모든 경우를 합하여 리턴\n let count = 0\n if (currentRow === chess.length) return 1\n for (let currentQueen = 0; currentQueen < n; currentQueen++) {\n //queen을 우선 배치한 후 가능한지 살펴본다.\n chess[currentRow] = currentQueen\n if (canBePlacedOn(chess, currentRow)) count += placeQueen(chess, currentRow + 1)\n }\n return count\n }\n for (let firstQueen = 0; firstQueen < n; firstQueen++) {\n const chess = new Array(n).fill(-1)\n chess[0] = firstQueen\n answer += placeQueen(chess, 1)\n }\n return answer;\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12952" - }, - { - "id": "49189", - "name": "가장 먼 노드", - "fileName": "가장-먼-노드&49189&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n, edge) {\n const graph = Array.from(Array(n + 1), () => [])\n for (const [src, dest] of edge) {\n graph[src].push(dest)\n graph[dest].push(src)\n }\n const distance = Array(n + 1).fill(0)\n distance[1] = 1\n const toBeSearched = [1]\n while (toBeSearched.length > 0) {\n const src = toBeSearched.shift()\n for (const dest of graph[src]) {\n if (distance[dest] === 0) {\n distance[dest] = distance[src] + 1\n toBeSearched.push(dest)\n }\n }\n }\n return distance.filter(x => x === Math.max(...distance)).length\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/49189" - }, - { - "id": "43162", - "name": "네트워크", - "fileName": "네트워크&43162&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n, computers) {\n let answer = 0\n const visited = new Array(n).fill(false)\n const newNetwork = (startComputer) => {\n //새로운 네트워크를 만들 시작 컴퓨터를 파라미터로 받는다.\n const toBeVisited = [startComputer]\n while (toBeVisited.length > 0) {\n //시작 컴퓨터로부터 방문 가능한 컴퓨터를 모두 방문하며 해당 컴퓨터의 visited를 true로 바꾼다\n const currentComputer = toBeVisited.pop()\n visited[currentComputer] = true\n for (let nextComputer = 0; nextComputer < n; nextComputer++) {\n if (!visited[nextComputer] && computers[currentComputer][nextComputer]) {\n toBeVisited.push(nextComputer)\n }\n }\n }\n }\n\n for (let startComputer = 0; startComputer < n; startComputer++) {\n if (!visited[startComputer]) {\n newNetwork(startComputer)\n //새로운 네트워크를 생성할 때마다 정답을 1 증가시킨다.\n answer++\n }\n }\n return answer\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/43162" - }, - { - "id": "42884", - "name": "단속카메라", - "fileName": "단속카메라&42884&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - jaewon1676\nfunction solution(routes) {\n let cctv = 1; // cctv의 개수는 최소 1개\n routes.sort((a, b) => a[0] - b[0]); // 고속도로 진입 시점을 기준으로 오름차순 정렬\n // [ [ -20, -15 ], [ -18, -13 ], [ -14, -5 ], [ -5, -3 ] ]\n let out = routes[0][1]; // -15\n // 나간 시점(out)은 첫 차량의 나간시점으로 초기화\n \n for(let i = 1; i < routes.length; i++) {\n // 나간 시점(out)보다 현재 차량의 진입이 느리다면 카메라 추가 설치\n if(out < routes[i][0]) {\n cctv++;\n out = routes[i][1]; // out 시점 업데이트\n }\n \n // 나간 시점(out)이 현재 차량의 진출시점보다 큰 경우 \n if(out > routes[i][1]) {\n out = routes[i][1]; // out 시점 업데이트 \n }\n }\n \n return cctv;\n}\n// 그리디\n\n// 우리는 카메라를 최소로 설치 해야합니다. 그러기 위해서는 고속도로 진입 시점을 기준으로 오름차순 정렬을(빨리 진입한 순) 합니다.\n// 이렇게 되면 배열에 있는 모든 고속도로 진입 시점은 배열의 첫번째 고속도로 진입 시점보다 더 뒤에 있습니다. 그러므로 우리는 \n// 나간시점만 검사 해주면 됩니다.\n\n// 먼저 첫번째 routes의 고속도로를 빠져나간 시점을 out 변수에 담아줍니다.\n// 이 out 변수를 두번째 routes의 고속도로를 빠져나간 시점과 비교하여 out 변수보다 route[i][1]가 크면 ( 나간 시간이 느리면)\n// cctv를 하나 늘려줍니다. , out 변수를 갱신 하며 세번째, 네번째도 계속 비교해줍니다.", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42884" - }, - { - "id": "42579", - "name": "베스트앨범", - "fileName": "베스트앨범&42579&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(genres, plays) {\n var answer = [];\n const songs = []\n const genreSumHash = {}\n const genreSumArr = []\n\n //고유번호, 장르, 플레이수를 담은 songs\n genres.forEach((genre, id) => {\n songs.push({id: id, genre: genre, play: plays[id]})\n genreSumHash[genre] = genreSumHash[genre] === undefined ? plays[id] : genreSumHash[genre] + plays[id]\n })\n\n //장르별 플레이수 합으로 정렬하기 위해 생성한 배열 genreSumArr\n for (const genre in genreSumHash) genreSumArr.push([genre, genreSumHash[genre]])\n genreSumArr.sort((a, b) => b[1] - a[1])\n\n //각 장르안에서 각 노래의 play수가 높은 순으로 정렬하고 앞에서부터 2개까지 정답에 고유번호를 push\n for (const genre of genreSumArr) {\n const sorted = songs.filter(song => song.genre === genre[0]).sort((a, b) => b.play - a.play)\n for (let i = 0; i < 2 && i < sorted.length; i++) answer.push(sorted[i].id)\n }\n return answer;\n}\n\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42579" - }, - { - "id": "43164", - "name": "여행경로", - "fileName": "여행경로&43164&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(tickets) {\n const routes = [] //최종 가능 루트들을 담을 배열\n const makeRoutes = (currentDepart, remainTickets, currentRoute) => {\n //현재 출발지, 남은 티켓들, 현재 까지 만든 루트를 기반으로 경로를 만들어 가는 재귀 함수\n if (remainTickets.length > 0) {\n remainTickets.forEach(([depart, nextDepart], index) => {\n if (depart === currentDepart)\n //현재 출발지와 같은 출발지를 가진 티켓이 있다면, 해당 티켓을 사용하고 해당 티켓의 도착지를 다음 출발지로 지정\n makeRoutes(\n nextDepart,\n [...remainTickets.slice(0, index), ...remainTickets.slice(index + 1)],\n [...currentRoute, currentDepart])\n })\n } else {\n //티켓을 모두 사용하면 최종 가능 루트에 포함\n routes.push([...currentRoute, currentDepart])\n }\n }\n makeRoutes(\"ICN\", tickets, [])\n return routes.sort()[0]\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/43164" - }, - { - "id": "42628", - "name": "이중우선순위큐", - "fileName": "이중우선순위큐&42628&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - jaewon1676\nfunction solution(operations) {\n var answer = [];\n for (let i = 0; i < operations.length; i++) {\n // 숫자 삽입\n if (operations[i][0] == 'I') {\n let m = operations[i].substring(2, operations[i].length);\n answer.push(m);\n }\n // if 최댓값 삭제\n else if (operations[i][0] == 'D' && operations[i][2] == '1' && operations.length > 0) {\n answer.pop();\n }\n // if 최솟값 삭제\n else if (operations[i][0] == 'D' && operations[i][2] == '-' && operations[i][3] == '1' && operations.length > 0) {\n answer.shift();\n }\n\n answer.sort((a, b) => {\n return a - b;\n });\n }\n if (answer.length == 0) return [0, 0];\n else {\n return [parseInt(answer.pop()), parseInt(answer.shift())];\n }\n}\n/* 풀이 과정\n1. 연산 처리를 구별하기 위해 배열의 0번째 자리, 2번째 자리에 있는 등을 비교하여 조건에 따른 명령을 실행한다.\n2. answer 배열을 정렬 해준다\n3. 큐가 비어있으면 ( length == 0 ) 0을 반환. , 그렇지 않으면 [최댓값, 최솟값]을 반환한다.\n*/\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/42628" - }, - { - "id": "43238", - "name": "입국심사", - "fileName": "입국심사&43238&.js", - "level": 3, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\nfunction solution(n, times) {\n //최소로 걸릴 수 있는 시간 left, 최대로 걸릴 수 있는 시간 right\n let [left, right] = [1, Math.max(...times) * n];\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const sum = times.reduce((acc, time) => acc + Math.floor(mid / time), 0);\n //sum은 mid 시간 동안 처리 할 수 있는 사람의 수\n if (sum < n) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n // left 가 right를 넘어갔다는 것은 left가 n보다 크거나 같아져서 n명을 수용할 수 최소값이 되있다는 것이다.\n return left;\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/43238" - }, - { - "name": "가사 검색.js", - "fileName": "가사-검색.js", - "level": 4, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - ryong9rrr\nclass Node {\n constructor(value = '') {\n this.value = value\n this.children = new Map()\n this.count = 0\n }\n}\n\nclass Trie {\n constructor() {\n this.root = new Node()\n }\n\n insert(string) {\n let currentNode = this.root\n for (const char of string) {\n if (!currentNode.children.has(char)) {\n currentNode.children.set(char, new Node(currentNode.value + char))\n }\n currentNode = currentNode.children.get(char)\n currentNode.count++\n }\n }\n\n startsWithCount(prefix) {\n let currentNode = this.root\n for (const char of prefix) {\n if (!currentNode.children.has(char)) {\n return 0\n }\n currentNode = currentNode.children.get(char)\n }\n return currentNode.count\n }\n}\n\nfunction reverseString(string) {\n return [...string].reverse().join('')\n}\n\nfunction solution(words, queries) {\n const table = {}\n const reverseTable = {}\n const counter = {}\n\n words.forEach((word) => {\n const key = word.length\n if (!table[key]) table[key] = new Trie()\n if (!reverseTable[key]) reverseTable[key] = new Trie()\n table[key].insert(word)\n reverseTable[key].insert(reverseString(word))\n if (counter[key] === undefined) counter[key] = 0\n counter[key]++\n })\n\n return queries.map((query) => {\n const key = query.length\n if (!table[key]) {\n return 0\n }\n const tQuery = query.replace(/\\?/g, '')\n if (!tQuery) {\n return counter[key]\n }\n if (query[query.length - 1] === '?') {\n return table[key].startsWithCount(tQuery)\n }\n return reverseTable[key].startsWithCount(reverseString(tQuery))\n })\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/undefined" - }, - { - "id": "12983", - "name": "단어 퍼즐", - "fileName": "단어-퍼즐&12983&.js", - "level": 4, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - codeisneverodd\n//코드 참고자료: https://velog.io/@longroadhome/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LV.4-%EB%8B%A8%EC%96%B4-%ED%8D%BC%EC%A6%90\nfunction solution(strs, t) {\n const tLength = t.length; //자주 쓰는 값 미리 계산\n //Infinity 로 선언을 해야 조합이 불가능한 영역의 값을 무한으로 두고, 그 영역에 하나를 더해도 불가능하다는 것을 Infinity로 표현할 수 있게 된다.\n const minCountToIndex = new Array(tLength).fill(Infinity);\n for (let currentIndex = 0; currentIndex < tLength; currentIndex++) {\n //내가 검사할 부분은 t의 0~currentIndex 영역\n const currentSlice = t.slice(0, currentIndex + 1);\n for (const str of strs) {\n //현재 영역이 strs에 있는 조각들 중 하나로 끝난다면\n if (currentSlice.endsWith(str)) {\n //frontLength 는 str 조각을 제외한 앞 쪽의 남은 조각의 길이\n const frontLength = currentIndex - str.length + 1;\n if (frontLength === 0) {\n //앞쪽에 남은 것이 없다면, 현재 검사중인 영역 = strs에 있는 조각\n minCountToIndex[currentIndex] = 1;\n } else {\n //앞쪽에 남은 것이 있다면, 현재 검사중이 영역까지 필요한 조각 수는, 지금까지 구한 최소 값과 지금 구한 값 중 최소값\n minCountToIndex[currentIndex] = Math.min(minCountToIndex[currentIndex], minCountToIndex[frontLength - 1] + 1);\n }\n }\n }\n }\n //마지막 영역이 Infinity 이면 만들기 불가능한 단어, 아니라면 마지막 영역의 값을 리턴\n return minCountToIndex[tLength - 1] === Infinity ? -1 : minCountToIndex[tLength - 1];\n}\n\n//리드미 테스트용 코멘트\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12983" - }, - { - "name": "무지의 먹방 라이브.js", - "fileName": "무지의-먹방-라이브.js", - "level": 4, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//더 좋은 풀이가 존재할 수 있습니다.\n// 1 - ryong9rrr\nfunction solution(food_times, k) {\n const total = food_times.reduce((a, b) => a + b)\n if (total <= k) {\n return -1\n }\n\n // stack으로 풀기\n const stack = food_times.map((time, i) => [time, i + 1]).sort(([timeA], [timeB]) => timeB - timeA)\n\n let prev = 0\n while (stack.length > 0 && k >= 0) {\n const [time] = stack[stack.length - 1]\n const acc = (time - prev) * stack.length\n if (k < acc) {\n break\n }\n stack.pop()\n k -= acc\n prev = time\n }\n\n const result = stack\n .reverse()\n .map(([_, order]) => order)\n .sort((orderA, orderB) => orderA - orderB)\n return result[k % result.length]\n}", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/undefined" - }, - { - "id": "12929", - "name": "올바른 괄호의 갯수", - "fileName": "올바른-괄호의-갯수&12929&.js", - "level": 4, - "code": "//https://github.com/codeisneverodd/programmers-coding-test\n//완벽한 정답이 아닙니다.\n// 1 - cg10036\nfunction solution(n) {\n const fact = n => n ? BigInt(n) * fact(n - 1) : 1n;\n return fact(n * 2) / (fact(n) * fact(n + 1));\n}\n", - "link": "https://school.programmers.co.kr/learn/courses/30/lessons/12929" - } -] diff --git a/data/problems.json b/data/problems.json new file mode 100644 index 0000000..8c337f4 --- /dev/null +++ b/data/problems.json @@ -0,0 +1 @@ +[{"title":"택배 배달과 수거하기","id":"150369","solvedCount":0},{"title":"이모티콘 할인행사","id":"150368","solvedCount":0},{"title":"표 병합","id":"150366","solvedCount":0},{"title":"미로 탈출 명령어","id":"150365","solvedCount":0},{"title":"표현 가능한 이진트리","id":"150367","solvedCount":0},{"title":"개인정보 수집 유효기간","id":"150370","solvedCount":0},{"title":"1,2,3 떨어트리기","id":"150364","solvedCount":0},{"title":"행렬과 연산","id":"118670","solvedCount":0},{"title":"코딩 테스트 공부","id":"118668","solvedCount":0},{"title":"등산코스 정하기","id":"118669","solvedCount":0},{"title":"성격 유형 검사하기","id":"118666","solvedCount":3},{"title":"두 큐 합 같게 만들기","id":"118667","solvedCount":1},{"title":"신고 결과 받기","id":"92334","solvedCount":4},{"title":"k진수에서 소수 개수 구하기","id":"92335","solvedCount":1},{"title":"주차 요금 계산","id":"92341","solvedCount":1},{"title":"양궁대회","id":"92342","solvedCount":1},{"title":"양과 늑대","id":"92343","solvedCount":0},{"title":"파괴되지 않은 건물","id":"92344","solvedCount":0},{"title":"사라지는 발판","id":"92345","solvedCount":0},{"title":"로또의 최고 순위와 최저 순위","id":"77484","solvedCount":5},{"title":"행렬 테두리 회전하기","id":"77485","solvedCount":1},{"title":"다단계 칫솔 판매","id":"77486","solvedCount":0},{"title":"헤비 유저가 소유한 장소","id":"77487","solvedCount":0},{"title":"신규 아이디 추천","id":"72410","solvedCount":3},{"title":"메뉴 리뉴얼","id":"72411","solvedCount":1},{"title":"순위 검색","id":"72412","solvedCount":1},{"title":"합승 택시 요금","id":"72413","solvedCount":0},{"title":"광고 삽입","id":"72414","solvedCount":0},{"title":"카드 짝 맞추기","id":"72415","solvedCount":0},{"title":"매출 하락 최소화","id":"72416","solvedCount":0},{"title":"문자열 압축","id":"60057","solvedCount":2},{"title":"괄호 변환","id":"60058","solvedCount":1},{"title":"자물쇠와 열쇠","id":"60059","solvedCount":1},{"title":"가사 검색","id":"60060","solvedCount":1},{"title":"기둥과 보 설치","id":"60061","solvedCount":0},{"title":"외벽 점검","id":"60062","solvedCount":0},{"title":"블록 이동하기","id":"60063","solvedCount":0},{"title":"오픈채팅방","id":"42888","solvedCount":3},{"title":"실패율","id":"42889","solvedCount":2},{"title":"후보키","id":"42890","solvedCount":1},{"title":"무지의 먹방 라이브","id":"42891","solvedCount":1},{"title":"길 찾기 게임","id":"42892","solvedCount":0},{"title":"매칭 점수","id":"42893","solvedCount":0},{"title":"블록 게임","id":"42894","solvedCount":0},{"title":"[1차] 추석 트래픽","id":"17676","solvedCount":0},{"title":"[1차] 뉴스 클러스터링","id":"17677","solvedCount":2},{"title":"[1차] 셔틀버스","id":"17678","solvedCount":0},{"title":"[1차] 프렌즈4블록","id":"17679","solvedCount":1},{"title":"[1차] 캐시","id":"17680","solvedCount":2},{"title":"[1차] 비밀지도","id":"17681","solvedCount":2},{"title":"[1차] 다트 게임","id":"17682","solvedCount":2},{"title":"[3차] 방금그곡","id":"17683","solvedCount":1},{"title":"[3차] 압축","id":"17684","solvedCount":2},{"title":"[3차] 자동완성","id":"17685","solvedCount":0},{"title":"[3차] 파일명 정렬","id":"17686","solvedCount":1},{"title":"[3차] n진수 게임","id":"17687","solvedCount":1},{"title":"숫자 문자열과 영단어","id":"81301","solvedCount":4},{"title":"거리두기 확인하기","id":"81302","solvedCount":1},{"title":"표 편집","id":"81303","solvedCount":0},{"title":"미로 탈출","id":"81304","solvedCount":0},{"title":"시험장 나누기","id":"81305","solvedCount":0},{"title":"키패드 누르기","id":"67256","solvedCount":2},{"title":"수식 최대화","id":"67257","solvedCount":1},{"title":"보석 쇼핑","id":"67258","solvedCount":0},{"title":"경주로 건설","id":"67259","solvedCount":0},{"title":"동굴 탐험","id":"67260","solvedCount":0},{"title":"크레인 인형뽑기 게임","id":"64061","solvedCount":3},{"title":"튜플","id":"64065","solvedCount":2},{"title":"불량 사용자","id":"64064","solvedCount":0},{"title":"호텔 방 배정","id":"64063","solvedCount":0},{"title":"징검다리 건너기","id":"64062","solvedCount":0},{"title":"카카오프렌즈 컬러링북","id":"1829","solvedCount":0},{"title":"브라이언의 고민","id":"1830","solvedCount":0},{"title":"4단 고음","id":"1831","solvedCount":0},{"title":"보행자 천국","id":"1832","solvedCount":0},{"title":"캠핑","id":"1833","solvedCount":0},{"title":"신비로운 유적 탐험","id":"1834","solvedCount":0},{"title":"단체사진 찍기","id":"1835","solvedCount":0},{"title":"리틀 프렌즈 사천성","id":"1836","solvedCount":0},{"title":"GPS","id":"1837","solvedCount":0},{"title":"몸짱 트레이너 라이언의 고민","id":"1838","solvedCount":0},{"title":"튜브의 소개팅","id":"1839","solvedCount":0},{"title":"스마트한 프로도","id":"1840","solvedCount":0},{"title":"IU와 콘의 보드게임","id":"1841","solvedCount":0},{"title":"네오의 귀걸이","id":"1842","solvedCount":0},{"title":"없는 숫자 더하기","id":"86051","solvedCount":4},{"title":"빛의 경로 사이클","id":"86052","solvedCount":1},{"title":"금과 은 운반하기","id":"86053","solvedCount":0},{"title":"안티세포","id":"86054","solvedCount":0},{"title":"나머지가 1이 되는 수 찾기","id":"87389","solvedCount":3},{"title":"n^2 배열 자르기","id":"87390","solvedCount":1},{"title":"공 이동 시뮬레이션","id":"87391","solvedCount":0},{"title":"쿼리의 모음의 개수","id":"87394","solvedCount":0},{"title":"음양 더하기","id":"76501","solvedCount":5},{"title":"약수의 개수와 덧셈","id":"77884","solvedCount":3},{"title":"괄호 회전하기","id":"76502","solvedCount":1},{"title":"2개 이하로 다른 비트","id":"77885","solvedCount":1},{"title":"모두 0으로 만들기","id":"76503","solvedCount":0},{"title":"110 옮기기","id":"77886","solvedCount":0},{"title":"RPG와 쿼리","id":"76504","solvedCount":0},{"title":"중력 작용","id":"77887","solvedCount":0},{"title":"내적","id":"70128","solvedCount":5},{"title":"3진법 뒤집기","id":"68935","solvedCount":3},{"title":"두 개 뽑아서 더하기","id":"68644","solvedCount":2},{"title":"삼각 달팽이","id":"68645","solvedCount":2},{"title":"이진 변환 반복하기","id":"70129","solvedCount":2},{"title":"쿼드압축 후 개수 세기","id":"68936","solvedCount":1},{"title":"풍선 터트리기","id":"68646","solvedCount":0},{"title":"스타 수열","id":"70130","solvedCount":0},{"title":"트리 트리오 중간값","id":"68937","solvedCount":0},{"title":"짝수 행 세기","id":"68647","solvedCount":0},{"title":"문자열의 아름다움","id":"68938","solvedCount":0},{"title":"가짜 해밀토니안","id":"70132","solvedCount":0},{"title":"멀쩡한 사각형","id":"62048","solvedCount":3},{"title":"우유와 요거트가 담긴 장바구니","id":"62284","solvedCount":0},{"title":"지형 이동","id":"62050","solvedCount":0},{"title":"소수 만들기","id":"12977","solvedCount":3},{"title":"예산","id":"12982","solvedCount":3},{"title":"배달","id":"12978","solvedCount":2},{"title":"영어 끝말잇기","id":"12981","solvedCount":1},{"title":"점프와 순간 이동","id":"12980","solvedCount":2},{"title":"스킬트리","id":"49993","solvedCount":1},{"title":"방문 길이","id":"49994","solvedCount":1},{"title":"기지국 설치","id":"12979","solvedCount":0},{"title":"숫자 게임","id":"12987","solvedCount":0},{"title":"스티커 모으기(2)","id":"12971","solvedCount":0},{"title":"지형 편집","id":"12984","solvedCount":0},{"title":"쿠키 구입","id":"49995","solvedCount":0},{"title":"뒤에 있는 큰 수 찾기","id":"154539","solvedCount":0},{"title":"당구 연습","id":"169198","solvedCount":0},{"title":"시소 짝꿍","id":"152996","solvedCount":0},{"title":"디펜스 게임","id":"142085","solvedCount":0},{"title":"연속 펄스 부분 수열의 합","id":"161988","solvedCount":0},{"title":"가장 가까운 같은 글자","id":"142086","solvedCount":0},{"title":"숫자 카드 나누기","id":"135807","solvedCount":0},{"title":"유사 칸토어 비트열","id":"148652","solvedCount":0},{"title":"숫자 타자 대회","id":"136797","solvedCount":0},{"title":"카드 뭉치","id":"159994","solvedCount":0},{"title":"마법의 엘리베이터","id":"148653","solvedCount":0},{"title":"콜라 문제","id":"132267","solvedCount":0},{"title":"햄버거 만들기","id":"133502","solvedCount":0},{"title":"호텔 대실","id":"155651","solvedCount":0},{"title":"무인도 여행","id":"154540","solvedCount":0},{"title":"숫자 변환하기","id":"154538","solvedCount":0},{"title":"등대","id":"133500","solvedCount":0},{"title":"점 찍기","id":"140107","solvedCount":0},{"title":"쌍둥이 빌딩 숲","id":"140105","solvedCount":0},{"title":"미로 탈출","id":"159993","solvedCount":0},{"title":"테이블 해시 함수","id":"147354","solvedCount":0},{"title":"롤케이크 자르기","id":"132265","solvedCount":0},{"title":"크기가 작은 부분 문자열","id":"147355","solvedCount":0},{"title":"부대복귀","id":"132266","solvedCount":0},{"title":"둘만의 암호","id":"155652","solvedCount":0},{"title":"혼자서 하는 틱택토","id":"160585","solvedCount":0},{"title":"문자열 나누기","id":"140108","solvedCount":0},{"title":"대충 만든 자판","id":"160586","solvedCount":0},{"title":"기사단원의 무기","id":"136798","solvedCount":0},{"title":"푸드 파이트 대회","id":"134240","solvedCount":0},{"title":"옹알이 (2)","id":"133499","solvedCount":0},{"title":"과일 장수","id":"135808","solvedCount":0},{"title":"명예의 전당 (1)","id":"138477","solvedCount":0},{"title":"덧칠하기","id":"161989","solvedCount":0},{"title":"귤 고르기","id":"138476","solvedCount":0},{"title":"리코쳇 로봇","id":"169199","solvedCount":0},{"title":"인사고과","id":"152995","solvedCount":0},{"title":"우박수열 정적분","id":"134239","solvedCount":0},{"title":"억억단을 외우자","id":"138475","solvedCount":0},{"title":"바탕화면 정리","id":"161990","solvedCount":0},{"title":"고고학 최고의 발견","id":"131702","solvedCount":0},{"title":"삼총사","id":"131705","solvedCount":0},{"title":"2차원 동전 뒤집기","id":"131703","solvedCount":0},{"title":"택배상자","id":"131704","solvedCount":0},{"title":"할인 행사","id":"131127","solvedCount":0},{"title":"연속 부분 수열 합의 개수","id":"131701","solvedCount":0},{"title":"혼자 놀기의 달인","id":"131130","solvedCount":0},{"title":"숫자 짝꿍","id":"131128","solvedCount":1},{"title":"카운트 다운","id":"131129","solvedCount":0},{"title":"124 나라의 숫자","id":"12899","solvedCount":3},{"title":"2 x n 타일링","id":"12900","solvedCount":1},{"title":"2016년","id":"12901","solvedCount":4},{"title":"3 x n 타일링","id":"12902","solvedCount":1},{"title":"가운데 글자 가져오기","id":"12903","solvedCount":5},{"title":"가장 긴 팰린드롬","id":"12904","solvedCount":0},{"title":"가장 큰 정사각형 찾기","id":"12905","solvedCount":1},{"title":"거스름돈","id":"12907","solvedCount":0},{"title":"직사각형의 넓이","id":"12974","solvedCount":0},{"title":"나누어 떨어지는 숫자 배열","id":"12910","solvedCount":3},{"title":"다음 큰 숫자","id":"12911","solvedCount":3},{"title":"두 정수 사이의 합","id":"12912","solvedCount":4},{"title":"땅따먹기","id":"12913","solvedCount":2},{"title":"멀리 뛰기","id":"12914","solvedCount":1},{"title":"문자열 내 마음대로 정렬하기","id":"12915","solvedCount":3},{"title":"문자열 내 p와 y의 개수","id":"12916","solvedCount":4},{"title":"문자열 내림차순으로 배치하기","id":"12917","solvedCount":4},{"title":"문자열 다루기 기본","id":"12918","solvedCount":5},{"title":"서울에서 김서방 찾기","id":"12919","solvedCount":4},{"title":"선입 선출 스케줄링","id":"12920","solvedCount":0},{"title":"소수 찾기","id":"12921","solvedCount":0},{"title":"수박수박수박수박수박수?","id":"12922","solvedCount":5},{"title":"숫자 블록","id":"12923","solvedCount":1},{"title":"숫자의 표현","id":"12924","solvedCount":3},{"title":"문자열을 정수로 바꾸기","id":"12925","solvedCount":4},{"title":"시저 암호","id":"12926","solvedCount":4},{"title":"야근 지수","id":"12927","solvedCount":0},{"title":"약수의 합","id":"12928","solvedCount":5},{"title":"올바른 괄호의 갯수","id":"12929","solvedCount":1},{"title":"이상한 문자 만들기","id":"12930","solvedCount":4},{"title":"자릿수 더하기","id":"12931","solvedCount":3},{"title":"자연수 뒤집어 배열로 만들기","id":"12932","solvedCount":5},{"title":"정수 내림차순으로 배치하기","id":"12933","solvedCount":3},{"title":"정수 제곱근 판별","id":"12934","solvedCount":5},{"title":"제일 작은 수 제거하기","id":"12935","solvedCount":4},{"title":"줄 서는 방법","id":"12936","solvedCount":1},{"title":"짝수와 홀수","id":"12937","solvedCount":5},{"title":"최고의 집합","id":"12938","solvedCount":0},{"title":"최댓값과 최솟값","id":"12939","solvedCount":4},{"title":"최대공약수와 최소공배수","id":"12940","solvedCount":3},{"title":"최솟값 만들기","id":"12941","solvedCount":3},{"title":"최적의 행렬 곱셈","id":"12942","solvedCount":0},{"title":"콜라츠 추측","id":"12943","solvedCount":5},{"title":"평균 구하기","id":"12944","solvedCount":4},{"title":"피보나치 수","id":"12945","solvedCount":2},{"title":"하노이의 탑","id":"12946","solvedCount":1},{"title":"하샤드 수","id":"12947","solvedCount":4},{"title":"핸드폰 번호 가리기","id":"12948","solvedCount":3},{"title":"행렬의 곱셈","id":"12949","solvedCount":2},{"title":"행렬의 덧셈","id":"12950","solvedCount":3},{"title":"JadenCase 문자열 만들기","id":"12951","solvedCount":4},{"title":"N-Queen","id":"12952","solvedCount":1},{"title":"N개의 최소공배수","id":"12953","solvedCount":1},{"title":"x만큼 간격이 있는 n개의 숫자","id":"12954","solvedCount":4},{"title":"직사각형 별찍기","id":"12969","solvedCount":3},{"title":"완주하지 못한 선수","id":"42576","solvedCount":4},{"title":"폰켓몬","id":"1845","solvedCount":5},{"title":"전화번호 목록","id":"42577","solvedCount":0},{"title":"위장","id":"42578","solvedCount":4},{"title":"베스트앨범","id":"42579","solvedCount":1},{"title":"같은 숫자는 싫어","id":"12906","solvedCount":3},{"title":"올바른 괄호","id":"12909","solvedCount":1},{"title":"기능개발","id":"42586","solvedCount":6},{"title":"프린터","id":"42587","solvedCount":3},{"title":"다리를 지나는 트럭","id":"42583","solvedCount":2},{"title":"주식가격","id":"42584","solvedCount":0},{"title":"더 맵게","id":"42626","solvedCount":0},{"title":"디스크 컨트롤러","id":"42627","solvedCount":0},{"title":"이중우선순위큐","id":"42628","solvedCount":1},{"title":"K번째수","id":"42748","solvedCount":5},{"title":"가장 큰 수","id":"42746","solvedCount":3},{"title":"H-Index","id":"42747","solvedCount":2},{"title":"최소직사각형","id":"86491","solvedCount":2},{"title":"모의고사","id":"42840","solvedCount":5},{"title":"소수 찾기","id":"42839","solvedCount":4},{"title":"카펫","id":"42842","solvedCount":2},{"title":"피로도","id":"87946","solvedCount":1},{"title":"전력망을 둘로 나누기","id":"86971","solvedCount":1},{"title":"모음사전","id":"84512","solvedCount":1},{"title":"체육복","id":"42862","solvedCount":4},{"title":"조이스틱","id":"42860","solvedCount":1},{"title":"큰 수 만들기","id":"42883","solvedCount":2},{"title":"구명보트","id":"42885","solvedCount":3},{"title":"섬 연결하기","id":"42861","solvedCount":0},{"title":"단속카메라","id":"42884","solvedCount":1},{"title":"N으로 표현","id":"42895","solvedCount":0},{"title":"정수 삼각형","id":"43105","solvedCount":0},{"title":"등굣길","id":"42898","solvedCount":0},{"title":"사칙연산","id":"1843","solvedCount":0},{"title":"도둑질","id":"42897","solvedCount":0},{"title":"타겟 넘버","id":"43165","solvedCount":2},{"title":"네트워크","id":"43162","solvedCount":1},{"title":"게임 맵 최단거리","id":"1844","solvedCount":1},{"title":"단어 변환","id":"43163","solvedCount":0},{"title":"아이템 줍기","id":"87694","solvedCount":0},{"title":"여행경로","id":"43164","solvedCount":1},{"title":"퍼즐 조각 채우기","id":"84021","solvedCount":0},{"title":"입국심사","id":"43238","solvedCount":1},{"title":"징검다리","id":"43236","solvedCount":0},{"title":"가장 먼 노드","id":"49189","solvedCount":1},{"title":"순위","id":"49191","solvedCount":0},{"title":"방의 개수","id":"49190","solvedCount":0},{"title":"조건에 부합하는 중고거래 댓글 조회하기","id":"164673","solvedCount":0},{"title":"인기있는 아이스크림","id":"133024","solvedCount":0},{"title":"3월에 태어난 여성 회원 목록 출력하기","id":"131120","solvedCount":0},{"title":"서울에 위치한 식당 목록 출력하기","id":"131118","solvedCount":0},{"title":"평균 일일 대여 요금 구하기","id":"151136","solvedCount":0},{"title":"강원도에 위치한 생산공장 목록 출력하기","id":"131112","solvedCount":0},{"title":"12세 이하인 여자 환자 목록 출력하기","id":"132201","solvedCount":0},{"title":"조건에 맞는 도서 리스트 출력하기","id":"144853","solvedCount":0},{"title":"흉부외과 또는 일반외과 의사 목록 출력하기","id":"132203","solvedCount":0},{"title":"과일로 만든 아이스크림 고르기","id":"133025","solvedCount":0},{"title":"모든 레코드 조회하기","id":"59034","solvedCount":0},{"title":"재구매가 일어난 상품과 회원 리스트 구하기","id":"131536","solvedCount":0},{"title":"오프라인/온라인 판매 데이터 통합하기","id":"131537","solvedCount":0},{"title":"역순 정렬하기","id":"59035","solvedCount":0},{"title":"아픈 동물 찾기","id":"59036","solvedCount":0},{"title":"어린 동물 찾기","id":"59037","solvedCount":0},{"title":"동물의 아이디와 이름","id":"59403","solvedCount":0},{"title":"여러 기준으로 정렬하기","id":"59404","solvedCount":0},{"title":"상위 n개 레코드","id":"59405","solvedCount":0},{"title":"조건에 맞는 회원수 구하기","id":"131535","solvedCount":0},{"title":"가격이 제일 비싼 식품의 정보 출력하기","id":"131115","solvedCount":0},{"title":"가장 비싼 상품 구하기","id":"131697","solvedCount":0},{"title":"최댓값 구하기","id":"59415","solvedCount":0},{"title":"최솟값 구하기","id":"59038","solvedCount":0},{"title":"동물 수 구하기","id":"59406","solvedCount":0},{"title":"중복 제거하기","id":"59408","solvedCount":0},{"title":"대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기","id":"151139","solvedCount":0},{"title":"저자 별 카테고리 별 매출액 집계하기","id":"144856","solvedCount":0},{"title":"조건에 맞는 사용자와 총 거래금액 조회하기","id":"164668","solvedCount":0},{"title":"자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기","id":"151137","solvedCount":0},{"title":"식품분류별 가장 비싼 식품의 정보 조회하기","id":"131116","solvedCount":0},{"title":"즐겨찾기가 가장 많은 식당 정보 출력하기","id":"131123","solvedCount":0},{"title":"성분으로 구분한 아이스크림 총 주문량","id":"133026","solvedCount":0},{"title":"진료과별 총 예약 횟수 출력하기","id":"132202","solvedCount":0},{"title":"카테고리 별 도서 판매량 집계하기","id":"144855","solvedCount":0},{"title":"자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기","id":"157340","solvedCount":0},{"title":"고양이와 개는 몇 마리 있을까","id":"59040","solvedCount":0},{"title":"동명 동물 수 찾기","id":"59041","solvedCount":0},{"title":"년, 월, 성별 별 상품 구매 회원 수 구하기","id":"131532","solvedCount":0},{"title":"입양 시각 구하기(1)","id":"59412","solvedCount":0},{"title":"입양 시각 구하기(2)","id":"59413","solvedCount":0},{"title":"가격대 별 상품 개수 구하기","id":"131530","solvedCount":0},{"title":"경기도에 위치한 식품창고 목록 출력하기","id":"131114","solvedCount":0},{"title":"이름이 없는 동물의 아이디","id":"59039","solvedCount":0},{"title":"이름이 있는 동물의 아이디","id":"59407","solvedCount":0},{"title":"NULL 처리하기","id":"59410","solvedCount":0},{"title":"나이 정보가 없는 회원 수 구하기","id":"131528","solvedCount":0},{"title":"주문량이 많은 아이스크림들 조회하기","id":"133027","solvedCount":0},{"title":"그룹별 조건에 맞는 식당 목록 출력하기","id":"131124","solvedCount":0},{"title":"조건에 맞는 도서와 저자 리스트 출력하기","id":"144854","solvedCount":0},{"title":"5월 식품들의 총매출 조회하기","id":"131117","solvedCount":0},{"title":"특정 기간동안 대여 가능한 자동차들의 대여비용 구하기","id":"157339","solvedCount":0},{"title":"없어진 기록 찾기","id":"59042","solvedCount":0},{"title":"있었는데요 없었습니다","id":"59043","solvedCount":0},{"title":"오랜 기간 보호한 동물(1)","id":"59044","solvedCount":0},{"title":"보호소에서 중성화한 동물","id":"59045","solvedCount":0},{"title":"상품 별 오프라인 매출 구하기","id":"131533","solvedCount":0},{"title":"상품을 구매한 회원 비율 구하기","id":"131534","solvedCount":0},{"title":"자동차 대여 기록 별 대여 금액 구하기","id":"151141","solvedCount":0},{"title":"조건별로 분류하여 주문상태 출력하기","id":"131113","solvedCount":0},{"title":"자동차 대여 기록에서 장기/단기 대여 구분하기","id":"151138","solvedCount":0},{"title":"대여 기록이 존재하는 자동차 리스트 구하기","id":"157341","solvedCount":0},{"title":"특정 옵션이 포함된 자동차 리스트 구하기","id":"157343","solvedCount":0},{"title":"취소되지 않은 진료 예약 조회하기","id":"132204","solvedCount":0},{"title":"조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기","id":"164671","solvedCount":0},{"title":"조건에 맞는 사용자 정보 조회하기","id":"164670","solvedCount":0},{"title":"조건에 부합하는 중고거래 상태 조회하기","id":"164672","solvedCount":0},{"title":"자동차 평균 대여 기간 구하기","id":"157342","solvedCount":0},{"title":"루시와 엘라 찾기","id":"59046","solvedCount":0},{"title":"이름에 el이 들어가는 동물 찾기","id":"59047","solvedCount":0},{"title":"중성화 여부 파악하기","id":"59409","solvedCount":0},{"title":"오랜 기간 보호한 동물(2)","id":"59411","solvedCount":0},{"title":"DATETIME에서 DATE로 형 변환","id":"59414","solvedCount":0},{"title":"카테고리 별 상품 개수 구하기","id":"131529","solvedCount":0},{"title":"짝지어 제거하기","id":"12973","solvedCount":2},{"title":"예상 대진표","id":"12985","solvedCount":2},{"title":"단어 퍼즐","id":"12983","solvedCount":1},{"title":"교점에 별 만들기","id":"87377","solvedCount":1},{"title":"부족한 금액 계산하기","id":"82612","solvedCount":5},{"title":"옹알이 (1)","id":"120956","solvedCount":1},{"title":"안전지대","id":"120866","solvedCount":1},{"title":"삼각형의 완성조건 (2)","id":"120868","solvedCount":1},{"title":"외계어 사전","id":"120869","solvedCount":1},{"title":"평행","id":"120875","solvedCount":1},{"title":"겹치는 선분의 길이","id":"120876","solvedCount":1},{"title":"유한소수 판별하기","id":"120878","solvedCount":1},{"title":"특이한 정렬","id":"120880","solvedCount":1},{"title":"등수 매기기","id":"120882","solvedCount":1},{"title":"로그인 성공?","id":"120883","solvedCount":1},{"title":"치킨 쿠폰","id":"120884","solvedCount":1},{"title":"이진수 더하기","id":"120885","solvedCount":1},{"title":"A로 B 만들기","id":"120886","solvedCount":1},{"title":"k의 개수","id":"120887","solvedCount":1},{"title":"중복된 문자 제거","id":"120888","solvedCount":1},{"title":"369게임","id":"120891","solvedCount":1},{"title":"삼각형의 완성조건 (1)","id":"120889","solvedCount":1},{"title":"가까운 수","id":"120890","solvedCount":1},{"title":"암호 해독","id":"120892","solvedCount":1},{"title":"대문자와 소문자","id":"120893","solvedCount":1},{"title":"영어가 싫어요","id":"120894","solvedCount":1},{"title":"약수 구하기","id":"120897","solvedCount":1},{"title":"인덱스 바꾸기","id":"120895","solvedCount":1},{"title":"한 번만 등장한 문자","id":"120896","solvedCount":1},{"title":"편지","id":"120898","solvedCount":1},{"title":"가장 큰 수 찾기","id":"120899","solvedCount":1},{"title":"7의 개수","id":"120912","solvedCount":1},{"title":"문자열 계산하기","id":"120902","solvedCount":1},{"title":"배열의 유사도","id":"120903","solvedCount":1},{"title":"숫자 찾기","id":"120904","solvedCount":1},{"title":"n의 배수 고르기","id":"120905","solvedCount":1},{"title":"자릿수 더하기","id":"120906","solvedCount":1},{"title":"OX퀴즈","id":"120907","solvedCount":1},{"title":"문자열안에 문자열","id":"120908","solvedCount":1},{"title":"제곱수 판별하기","id":"120909","solvedCount":1},{"title":"세균 증식","id":"120910","solvedCount":1},{"title":"문자열 정렬하기 (2)","id":"120911","solvedCount":1},{"title":"잘라서 배열로 저장하기","id":"120913","solvedCount":1},{"title":"두 수의 나눗셈","id":"120806","solvedCount":1},{"title":"피자 나눠 먹기 (3)","id":"120816","solvedCount":1},{"title":"분수의 덧셈","id":"120808","solvedCount":1},{"title":"소인수분해","id":"120852","solvedCount":1},{"title":"중복된 숫자 개수","id":"120583","solvedCount":1},{"title":"최댓값 만들기 (2)","id":"120862","solvedCount":1},{"title":"숨어있는 숫자의 덧셈 (2)","id":"120864","solvedCount":1},{"title":"두 수의 차","id":"120803","solvedCount":1},{"title":"두 수의 곱","id":"120804","solvedCount":1},{"title":"문자열 밀기","id":"120921","solvedCount":1},{"title":"몫 구하기","id":"120805","solvedCount":1},{"title":"숫자 비교하기","id":"120807","solvedCount":1},{"title":"배열 두 배 만들기","id":"120809","solvedCount":1},{"title":"종이 자르기","id":"120922","solvedCount":1},{"title":"연속된 수의 합","id":"120923","solvedCount":1},{"title":"다음에 올 숫자","id":"120924","solvedCount":1},{"title":"각도기","id":"120829","solvedCount":1},{"title":"나머지 구하기","id":"120810","solvedCount":1},{"title":"중앙값 구하기","id":"120811","solvedCount":1},{"title":"배열 자르기","id":"120833","solvedCount":1},{"title":"구슬을 나누는 경우의 수","id":"120840","solvedCount":1},{"title":"배열 회전시키기","id":"120844","solvedCount":1},{"title":"최빈값 구하기","id":"120812","solvedCount":1},{"title":"피자 나눠 먹기 (2)","id":"120815","solvedCount":1},{"title":"짝수는 싫어요","id":"120813","solvedCount":1},{"title":"피자 나눠 먹기 (1)","id":"120814","solvedCount":1},{"title":"점의 위치 구하기","id":"120841","solvedCount":1},{"title":"배열의 평균값","id":"120817","solvedCount":1},{"title":"옷가게 할인 받기","id":"120818","solvedCount":1},{"title":"짝수 홀수 개수","id":"120824","solvedCount":1},{"title":"아이스 아메리카노","id":"120819","solvedCount":1},{"title":"나이 출력","id":"120820","solvedCount":1},{"title":"배열 뒤집기","id":"120821","solvedCount":1},{"title":"문자열 뒤집기","id":"120822","solvedCount":1},{"title":"직각삼각형 출력하기","id":"120823","solvedCount":1},{"title":"문자 반복 출력하기","id":"120825","solvedCount":1},{"title":"짝수의 합","id":"120831","solvedCount":1},{"title":"특정 문자 제거하기","id":"120826","solvedCount":1},{"title":"2차원으로 만들기","id":"120842","solvedCount":1},{"title":"양꼬치","id":"120830","solvedCount":1},{"title":"외계행성의 나이","id":"120834","solvedCount":1},{"title":"개미 군단","id":"120837","solvedCount":1},{"title":"진료순서 정하기","id":"120835","solvedCount":1},{"title":"순서쌍의 개수","id":"120836","solvedCount":1},{"title":"모스부호 (1)","id":"120838","solvedCount":1},{"title":"가위 바위 보","id":"120839","solvedCount":1},{"title":"공 던지기","id":"120843","solvedCount":1},{"title":"주사위의 개수","id":"120845","solvedCount":1},{"title":"문자열 정렬하기 (1)","id":"120850","solvedCount":1},{"title":"합성수 찾기","id":"120846","solvedCount":1},{"title":"최댓값 만들기(1)","id":"120847","solvedCount":1},{"title":"팩토리얼","id":"120848","solvedCount":1},{"title":"배열 원소의 길이","id":"120854","solvedCount":1},{"title":"모음 제거","id":"120849","solvedCount":1},{"title":"숨어있는 숫자의 덧셈 (1)","id":"120851","solvedCount":1},{"title":"컨트롤 제트","id":"120853","solvedCount":1},{"title":"머쓱이보다 키 큰 사람","id":"120585","solvedCount":1},{"title":"다항식 더하기","id":"120863","solvedCount":1},{"title":"캐릭터의 좌표","id":"120861","solvedCount":1},{"title":"저주의 숫자 3","id":"120871","solvedCount":1},{"title":"직사각형 넓이 구하기","id":"120860","solvedCount":1},{"title":"두 수의 합","id":"120802","solvedCount":1}] \ No newline at end of file diff --git a/data/solutions.json b/data/solutions.json new file mode 100644 index 0000000..958d947 --- /dev/null +++ b/data/solutions.json @@ -0,0 +1 @@ +[{"id":"xSm8od1xFwgFefxNzkVqa","author":"codeisneverodd","code":"function solution(num_list, n) {\n let result = [];\n for (let i = 0; i < num_list.length / n; i++) {\n result = [...result, num_list.slice(i * n, i * n + n)];\n }\n return result;\n}","probId":"120842","createdAt":1679394094353,"lang":"JavaScript"},{"id":"K-zJIO4QrSl-S9XOoRs9z","author":"codeisneverodd","code":"function solution(order) {\n return [...('' + order)].filter(num => num === '3' || num === '6' || num === '9').length;\n}","probId":"120891","createdAt":1679394094353,"lang":"JavaScript"},{"id":"z9tZ9PckhK1H-6ocTeWO2","author":"codeisneverodd","code":"function solution(array) {\n return [...array.join('')].filter(a => a === '7').length;\n}","probId":"120912","createdAt":1679394094353,"lang":"JavaScript"},{"id":"NNf6s-HTVaGKm78AOPaVw","author":"codeisneverodd","code":"function solution(before, after) {\n const sort = str => [...str].sort((a, b) => (a < b ? -1 : a !== b ? 1 : 0)).join('');\n return sort(before) === sort(after) ? 1 : 0;\n}","probId":"120886","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7oXUiFUSQ9uqtT5hYSLIf","author":"codeisneverodd","code":"function solution(quiz) {\n return quiz.map(q => {\n const [formula, answer] = q.split('=');\n return eval(formula) === +answer ? 'O' : 'X';\n });\n}","probId":"120907","createdAt":1679394094353,"lang":"JavaScript"},{"id":"BYmirH4q1XECD8bMEo29U","author":"codeisneverodd","code":"function solution(i, j, k) {\n let count = 0;\n for (let num = i; num <= j; num++) {\n count += [...('' + num)].filter(n => +n === k).length;\n }\n return count;\n}","probId":"120887","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Fd_1vZ2pAt6rpah2QbEsi","author":"codeisneverodd","code":"function solution(n, numlist) {\n return numlist.filter(num => num % n === 0);\n}","probId":"120905","createdAt":1679394094353,"lang":"JavaScript"},{"id":"tGL_-zp4MOVhXsFcJcMun","author":"codeisneverodd","code":"function solution(array, n) {\n const minDiff = Math.min(...array.map(a => Math.abs(a - n)));\n return array.sort((a, b) => a - b).find(a => Math.abs(a - n) === minDiff);\n}","probId":"120890","createdAt":1679394094353,"lang":"JavaScript"},{"id":"nKQO66zONo7540fHrto5P","author":"codeisneverodd","code":"function solution(rsp) {\n const win = { 0: 5, 2: 0, 5: 2 };\n return [...rsp].map(num => win[num]).join('');\n}","probId":"120839","createdAt":1679394094353,"lang":"JavaScript"},{"id":"m6fBW1kYmz63rvE_9J-j7","author":"codeisneverodd","code":"function solution(array) {\n const max = Math.max(...array);\n return [max, array.indexOf(max)];\n}","probId":"120899","createdAt":1679394094353,"lang":"JavaScript"},{"id":"CqKrSPtMSN3R0qbXB3uaj","author":"codeisneverodd","code":"function solution(angle) {\n if (angle === 180) return 4;\n if (angle > 90) return 3;\n if (angle === 90) return 2;\n return 1;\n}","probId":"120829","createdAt":1679394094353,"lang":"JavaScript"},{"id":"O7PoiGypXs92Zf0CtGSFq","author":"codeisneverodd","code":"function solution(hp) {\n const first = Math.floor(hp / 5);\n const second = Math.floor((hp - first * 5) / 3);\n const third = hp - first * 5 - second * 3;\n return first + second + third;\n}","probId":"120837","createdAt":1679394094353,"lang":"JavaScript"},{"id":"eQLxLoyizYAtnKZ2NvI7K","author":"codeisneverodd","code":"function solution(lines) {\n const visited = lines.reduce((a, [x, y]) => {\n for (let i = Math.min(x, y) + 1; i <= Math.max(x, y); i++) a[i] = a[i] ? a[i] + 1 : 1;\n return a;\n }, {});\n\n return Object.values(visited).filter(v => v > 1).length;\n}","probId":"120876","createdAt":1679394094353,"lang":"JavaScript"},{"id":"rKj4MpytQxyf3pHUEsJdP","author":"codeisneverodd","code":"function solution(numbers, k) {\n const goNext = current => (current + 2) % numbers.length;\n let current = 0;\n for (let i = 0; i < k - 1; i++) current = goNext(current);\n return numbers[current];\n}","probId":"120843","createdAt":1679394094353,"lang":"JavaScript"},{"id":"HCLioSAvzxRnHX8mjtUWU","author":"codeisneverodd","code":"function solution(balls, share) {\n const [n, m] = [balls, share];\n const fact = [BigInt(1), BigInt(1)];\n\n for (let i = 2; i <= n; i++) fact[i] = fact[i - 1] * BigInt(i);\n\n return Number(fact[n] / (fact[n - m] * fact[m]));\n}","probId":"120840","createdAt":1679394094353,"lang":"JavaScript"},{"id":"FPUJpgh0XMsggme9iIl50","author":"codeisneverodd","code":"function solution(num1, num2) {\n return num1 % num2;\n}","probId":"120810","createdAt":1679394094353,"lang":"JavaScript"},{"id":"mk4qvXkinyqMf5XPVCHdj","author":"codeisneverodd","code":"function solution(age) {\n return 2022 - age + 1;\n}","probId":"120820","createdAt":1679394094353,"lang":"JavaScript"},{"id":"18S-4SEbVwFndDpxz2ciT","author":"codeisneverodd","code":"function solution(common) {\n const isAP = arr => arr[2] - arr[1] === arr[1] - arr[0];\n return isAP(common)\n ? common[common.length - 1] + common[1] - common[0]\n : common[common.length - 1] * (common[1] / common[0]);\n}","probId":"120924","createdAt":1679394094353,"lang":"JavaScript"},{"id":"kVuyEQ3KiqW-p8BTxdFgS","author":"codeisneverodd","code":"function solution(polynomial) {\n const countX = x => {\n const count = x.replaceAll('x', '');\n return count === '' ? 1 : +count;\n };\n\n const count = polynomial\n .split(' + ')\n .reduce((a, c) => (c.includes('x') ? { ...a, x: a.x + countX(c) } : { ...a, num: a.num + +c }), {\n x: 0,\n num: 0,\n });\n\n const x = count.x > 0 ? `${count.x > 1 ? count.x : ''}x` : '';\n const num = count.num > 0 ? '' + count.num : '';\n const plus = x !== '' && num !== '' ? ' + ' : '';\n\n return x + plus + num;\n}","probId":"120863","createdAt":1679394094353,"lang":"JavaScript"},{"id":"XsKuARaEONvRaODN2AM0x","author":"codeisneverodd","code":"function solution(my_string) {\n return [...my_string].map(char => (char === char.toUpperCase() ? char.toLowerCase() : char.toUpperCase())).join('');\n}","probId":"120893","createdAt":1679394094353,"lang":"JavaScript"},{"id":"qQWDAJ0NE_d14Se_xpJlf","author":"codeisneverodd","code":"function solution(num1, num2) {\n return num1 * num2;\n}","probId":"120804","createdAt":1679394094353,"lang":"JavaScript"},{"id":"8kX9ALQ_W9RpcWuaA8orB","author":"codeisneverodd","code":"function solution(num1, num2) {\n return Math.floor((num1 / num2) * 1000);\n}","probId":"120806","createdAt":1679394094353,"lang":"JavaScript"},{"id":"yQwy5c7WXcwqM2jDGreyj","author":"codeisneverodd","code":"function solution(num1, num2) {\n return num1 - num2;\n}","probId":"120803","createdAt":1679394094353,"lang":"JavaScript"},{"id":"flq5YSiss1nLA5LYkvWI2","author":"codeisneverodd","code":"function solution(num1, num2) {\n return num1 + num2\n}","probId":"120802","createdAt":1679394094353,"lang":"JavaScript"},{"id":"_JQtvPHPiTHkpMg6dBdYV","author":"codeisneverodd","code":"function solution(score) {\n const avgs = score.map(([a, b]) => (a + b) / 2);\n const avgRank = [...avgs]\n .sort((a, b) => b - a)\n .map((avg, i) => ({ avg, rank: i + 1 }))\n .map((a, i, arr) => (i > 0 && a.avg === arr[i - 1].avg ? { ...a, rank: arr[i - 1].rank } : a));\n\n return avgs.map(_avg => avgRank.find(({ avg }) => _avg === avg).rank);\n}","probId":"120882","createdAt":1679394094353,"lang":"JavaScript"},{"id":"bEBMTcBreInF2HUsI8Srb","author":"codeisneverodd","code":"function solution(id_pw, db) {\n const [id, pw] = id_pw;\n if (!db.find(([_id]) => _id === id)) return 'fail';\n return db.find(([_id, _pw]) => _id === id && _pw === pw) ? 'login' : 'wrong pw';\n}","probId":"120883","createdAt":1679394094353,"lang":"JavaScript"},{"id":"e9hMhyRpgd_yQEIsJosu9","author":"codeisneverodd","code":"function solution(array, height) {\n return array.filter(a => a > height).length;\n}","probId":"120585","createdAt":1679394094353,"lang":"JavaScript"},{"id":"A-b2Wsfa0T54J6VWMLuu9","author":"codeisneverodd","code":"function solution(letter) {\n const morse = { \n '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',\n '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',\n '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',\n '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',\n '-.--':'y','--..':'z'\n }\n return letter\n .split(' ')\n .map(l => morse[l])\n .join('');\n}","probId":"120838","createdAt":1679394094353,"lang":"JavaScript"},{"id":"tBLnLwhR8r9zfQcOfHxsx","author":"codeisneverodd","code":"function solution(my_string) {\n return my_string.replace(/[aeiou]/g, '');\n}","probId":"120849","createdAt":1679394094353,"lang":"JavaScript"},{"id":"8tUQNdlKqJGZVvFP8pfQb","author":"codeisneverodd","code":"function solution(num1, num2) {\n return Math.floor(num1 / num2);\n}","probId":"120805","createdAt":1679394094353,"lang":"JavaScript"},{"id":"wkUGsvxZ3z-W5vTvPExjc","author":"codeisneverodd","code":"function solution(my_string, n) {\n return [...my_string].map(char => char.repeat(n)).join('');\n}","probId":"120825","createdAt":1679394094353,"lang":"JavaScript"},{"id":"UVfLDE0kUq5-Mb2qiIT-Q","author":"codeisneverodd","code":"function solution(my_string) {\n return eval(my_string);\n}","probId":"120902","createdAt":1679394094353,"lang":"JavaScript"},{"id":"YMoDlo5dmBhdtuG9F-uqQ","author":"codeisneverodd","code":"function solution(my_string) {\n return [...my_string].reverse().join('');\n}","probId":"120822","createdAt":1679394094353,"lang":"JavaScript"},{"id":"6Y-EoZ6LOvILJ7Lel6NSI","author":"codeisneverodd","code":"function solution(A, B) {\n const pushRight = str => [str[str.length - 1], ...str.slice(0, str.length - 1)].join('');\n for (let i = 0; i <= A.length; i++) {\n if (A === B) return i;\n A = pushRight(A);\n }\n\n return -1;\n}","probId":"120921","createdAt":1679394094353,"lang":"JavaScript"},{"id":"cI4OhwYtuVREl6zRScqAI","author":"codeisneverodd","code":"function solution(my_string) {\n return my_string\n .match(/[0-9]/g)\n .map(str => +str)\n .sort((a, b) => a - b);\n}","probId":"120850","createdAt":1679394094353,"lang":"JavaScript"},{"id":"BxMASisim4qdys6KJBmev","author":"codeisneverodd","code":"function solution(my_string) {\n return [...my_string]\n .map(char => char.toLowerCase())\n .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))\n .join('');\n}","probId":"120911","createdAt":1679394094353,"lang":"JavaScript"},{"id":"uBNgRHK5Itek6vZj_b2ZF","author":"codeisneverodd","code":"function solution(str1, str2) {\n return str1.includes(str2) ? 1 : 2;\n}","probId":"120908","createdAt":1679394094353,"lang":"JavaScript"},{"id":"i6QAPFUAt3dpKN9EEHkOB","author":"codeisneverodd","code":"function solution(numbers) {\n return numbers.map(n => n * 2);\n}","probId":"120809","createdAt":1679394094353,"lang":"JavaScript"},{"id":"yyezriEKHxGA4903NHu-p","author":"codeisneverodd","code":"function solution(num_list) {\n return num_list.reverse();\n}","probId":"120821","createdAt":1679394094353,"lang":"JavaScript"},{"id":"8KAzdEaoD--V3usRyB810","author":"codeisneverodd","code":"function solution(strlist) {\n return strlist.map(s => s.length);\n}","probId":"120854","createdAt":1679394094353,"lang":"JavaScript"},{"id":"4lUPXxJ7YT1dtYeZ-wb5Z","author":"codeisneverodd","code":"function solution(numbers, num1, num2) {\n return numbers.slice(num1, num2 + 1);\n}","probId":"120833","createdAt":1679394094353,"lang":"JavaScript"},{"id":"xynsg91juTSBA6n0gTGqD","author":"codeisneverodd","code":"function solution(numbers, direction) {\n return direction === 'right'\n ? [numbers[numbers.length - 1], ...numbers.slice(0, numbers.length - 1)]\n : [...numbers.slice(1), numbers[0]];\n}","probId":"120844","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Sc60jxZax2HO-tpUSEC1f","author":"codeisneverodd","code":"function solution(s1, s2) {\n return s1.filter(s => s2.includes(s)).length;\n}","probId":"120903","createdAt":1679394094353,"lang":"JavaScript"},{"id":"FyRd_EPVRwYpZS9u07dkp","author":"codeisneverodd","code":"function solution(numbers) {\n return numbers.reduce((a, c) => a + c, 0) / numbers.length;\n}","probId":"120817","createdAt":1679394094353,"lang":"JavaScript"},{"id":"roh_q2oY0XpKwnNsBnP0s","author":"codeisneverodd","code":"function solution(denum1, num1, denum2, num2) {\n const denum = denum2 * num1 + denum1 * num2;\n const num = num1 * num2;\n const getGCD = (a, b) => (b === 0 ? a : getGCD(b, a % b));\n const gcd = getGCD(denum, num);\n return [denum / gcd, num / gcd];\n}","probId":"120808","createdAt":1679394094353,"lang":"JavaScript"},{"id":"iP7JW645q8rySEb5VCr6t","author":"codeisneverodd","code":"function solution(sides) {\n const max = Math.max(...sides);\n return max < sides.reduce((a, c) => a + c, 0) - max ? 1 : 2;\n}","probId":"120889","createdAt":1679394094353,"lang":"JavaScript"},{"id":"3XMMT8OfEfX0OAUf5cNuc","author":"codeisneverodd","code":"function solution(sides) {\n return Math.min(...sides) * 2 - 1;\n}","probId":"120868","createdAt":1679394094353,"lang":"JavaScript"},{"id":"q237y8p-W2-NymFreJNK2","author":"codeisneverodd","code":"function solution(n, t) {\n return n * 2 ** t;\n}","probId":"120910","createdAt":1679394094353,"lang":"JavaScript"},{"id":"aE4vSAa7PBamLUB4tsrEQ","author":"codeisneverodd","code":"function solution(n) {\n let pFactors = [];\n for (let i = 2; i <= Math.sqrt(n); i++) {\n while (n % i === 0) {\n pFactors = [...pFactors, i];\n n /= i;\n }\n }\n if (n >= 2) pFactors = [...pFactors, n];\n return [...new Set(pFactors)].sort((a, b) => a - b);\n}\n\nconst funcB = () => {\n return new Promise(resolve => {\n setTimeout(resolve('guys'), 1000);\n });\n};\n\nconst funcC = async () => {\n const m = 1;\n const res = await funcB();\n return res;\n};\nwindow.addEventListener('DOMContentLoaded', async () => {\n console.log(await funcC());\n});","probId":"120852","createdAt":1679394094353,"lang":"JavaScript"},{"id":"W1Ha5iyhI7K7os4oVnTqK","author":"codeisneverodd","code":"function solution(n) {\n let count = 0;\n for (let i = 1; i < Math.sqrt(n); i++) {\n if (n % i === 0) count += 2;\n }\n if (n % Math.sqrt(n) === 0) count += 1;\n return count;\n}","probId":"120836","createdAt":1679394094353,"lang":"JavaScript"},{"id":"kmOkg2WIkUP1Cm-OJ-MeQ","author":"codeisneverodd","code":"function solution(my_string) {\n return my_string.match(/[0-9]/g).reduce((a, c) => a + +c, 0);\n}","probId":"120851","createdAt":1679394094353,"lang":"JavaScript"},{"id":"uVccwTQARnsGW96AVykfD","author":"codeisneverodd","code":"function solution(my_string) {\n const nums = my_string.match(/[0-9]+/g);\n return nums ? nums.map(num => +num).reduce((a, c) => a + c, 0) : 0;\n}","probId":"120864","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-Os7P_tCHgkNkR4DrJ0PN","author":"codeisneverodd","code":"function solution(num1, num2) {\n return num1 === num2 ? 1 : -1;\n}","probId":"120807","createdAt":1679394094353,"lang":"JavaScript"},{"id":"zSDOYDjSmsATo2fbfxxWm","author":"codeisneverodd","code":"function solution(num, k) {\n const index = [...('' + num)].findIndex(n => +n === k);\n return index === -1 ? -1 : index + 1;\n}","probId":"120904","createdAt":1679394094353,"lang":"JavaScript"},{"id":"fLHyXayI4FyOCt255le-1","author":"codeisneverodd","code":"function solution(money) {\n return [Math.floor(money / 5500), money % 5500];\n}","probId":"120819","createdAt":1679394094353,"lang":"JavaScript"},{"id":"KkTti4G5XKJq39sAvcgUH","author":"codeisneverodd","code":"function solution(board) {\n const isBombNearby = (r, c) => {\n const nearby = [\n [-1, -1],\n [-1, 0],\n [-1, 1],\n [0, -1],\n [0, 1],\n [1, -1],\n [1, 0],\n [1, 1],\n ];\n\n const isInBoard = (r, c) => r >= 0 && r < board.length && c >= 0 && c < board.length;\n\n return nearby.some(([dR, dC]) => isInBoard(r + dR, c + dC) && board[r + dR][c + dC] === 1);\n };\n\n let count = 0;\n\n for (let r = 0; r < board.length; r++) {\n for (let c = 0; c < board.length; c++) {\n if (board[r][c] !== 1 && !isBombNearby(r, c)) count += 1;\n }\n }\n return count;\n}","probId":"120866","createdAt":1679394094353,"lang":"JavaScript"},{"id":"E6dyRuBWZAnVUJA4Du6ev","author":"codeisneverodd","code":"function solution(cipher, code) {\n return [...cipher].reduce((a, c, i) => ((i + 1) % code === 0 ? a + c : a), '');\n}","probId":"120892","createdAt":1679394094353,"lang":"JavaScript"},{"id":"VC4tCj0840HRGp-z1Q4qE","author":"codeisneverodd","code":"function solution(n) {\n let answer = [];\n for (let i = 1; i < Math.sqrt(n); i++) {\n if (n % i === 0) answer = [...answer, i, n / i];\n }\n if (Number.isInteger(Math.sqrt(n))) answer = [...answer, Math.sqrt(n)];\n return answer.sort((a, b) => a - b);\n}","probId":"120897","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7sOJt_9XaqOJvghXbf_kC","author":"codeisneverodd","code":"function solution(n, k) {\n return n * 12000 + (k - Math.floor(n / 10)) * 2000;\n}","probId":"120830","createdAt":1679394094353,"lang":"JavaScript"},{"id":"3BTyE9pEztLOFSaUde2h7","author":"codeisneverodd","code":"function solution(num, total) {\n const numArr = Array.from({ length: num }, (_, i) => i);\n const sum = numArr.reduce((a, c) => a + c);\n return numArr.map(n => n - (sum - total) / num);\n}","probId":"120923","createdAt":1679394094353,"lang":"JavaScript"},{"id":"EIIrUFaAS0V5x6_bEJexe","author":"codeisneverodd","code":"function solution(numbers) {\n const nums = { zero: 0, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9 };\n const regex = new RegExp(Object.keys(nums).join('|'), 'g');\n return +numbers.replace(regex, key => nums[key]);\n}","probId":"120894","createdAt":1679394094353,"lang":"JavaScript"},{"id":"jllBcdS7x6TpR19h4i3mW","author":"codeisneverodd","code":"function solution(price) {\n if (price >= 500000) return Math.floor(price * 0.8);\n if (price >= 300000) return Math.floor(price * 0.9);\n if (price >= 100000) return Math.floor(price * 0.95);\n return price;\n}","probId":"120818","createdAt":1679394094353,"lang":"JavaScript"},{"id":"k6ifMbSEXrkZxfNsJob9s","author":"codeisneverodd","code":"function solution(babbling) {\n const convertPWordsToNum = word => {\n const pWords = ['aya', 'ye', 'woo', 'ma'];\n return pWords.reduce((result, pWord, i) => result.replaceAll(pWord, i), word);\n };\n const canPronounce = word => {\n const result = convertPWordsToNum(word);\n return !/[^\\d]/.test(result) && [...result].every((num, i) => i + 1 > result.length || num !== result[i + 1]);\n };\n\n return babbling.filter(b => canPronounce(b)).length;\n}","probId":"120956","createdAt":1679394094353,"lang":"JavaScript"},{"id":"k1QZofbDT5yfaiJexD24k","author":"codeisneverodd","code":"function solution(spell, dic) {\n const sort = str => [...str].sort((a, b) => (a < b ? -1 : a !== b ? 1 : 0)).join('');\n return dic.find(dic => sort(dic) === sort(spell.join(''))) ? 1 : 2;\n}","probId":"120869","createdAt":1679394094353,"lang":"JavaScript"},{"id":"omKQmjAADJvBbGzzgMH-k","author":"codeisneverodd","code":"function solution(age) {\n return [...('' + age)].map(num => String.fromCharCode('a'.charCodeAt(0) + +num)).join('');\n}","probId":"120834","createdAt":1679394094353,"lang":"JavaScript"},{"id":"jOpezmOte2FKGRKxMqOws","author":"codeisneverodd","code":"function solution(a, b) {\n const getGCD = (a, b) => {\n let gcd = 1;\n for (let i = 1; i <= Math.min(a, b); i++) {\n if (a % i === 0 && b % i === 0) gcd = i;\n }\n return gcd;\n };\n\n const getPrimeFactors = num => {\n let pFactors = [];\n for (let i = 2; i <= Math.sqrt(num); i++) {\n while (num % i === 0) {\n pFactors = [...pFactors, i];\n num /= i;\n }\n }\n if (num > 2) pFactors = [...pFactors, num];\n return pFactors;\n };\n\n return getPrimeFactors(b / getGCD(a, b)).find(n => n !== 2 && n !== 5) ? 2 : 1;\n}","probId":"120878","createdAt":1679394094353,"lang":"JavaScript"},{"id":"LMVzWcSFfwsYtSgO6hNXc","author":"codeisneverodd","code":"function solution(bin1, bin2) {\n return (parseInt(bin1, 2) + parseInt(bin2, 2)).toString(2);\n}","probId":"120885","createdAt":1679394094353,"lang":"JavaScript"},{"id":"gtQGO4DvoU1oLUddtt-LZ","author":"codeisneverodd","code":"function solution(my_string, num1, num2) {\n const str = [...my_string];\n\n [str[num1], str[num2]] = [str[num2], str[num1]];\n\n return str.join('');\n}","probId":"120895","createdAt":1679394094353,"lang":"JavaScript"},{"id":"0VONCnZmY7f3yd625hIpr","author":"codeisneverodd","code":"function solution(n) {\n return [...('' + n)].map(num => +num).reduce((a, c) => a + c, 0);\n}","probId":"120906","createdAt":1679394094353,"lang":"JavaScript"},{"id":"GlYKS6KBtGmPGmladvL0U","author":"codeisneverodd","code":"function solution(my_str, n) {\n let result = [];\n for (let i = 0; i < my_str.length / n; i++) result = [...result, my_str.slice(i * n, i * n + n)];\n return result;\n}","probId":"120913","createdAt":1679394094353,"lang":"JavaScript"},{"id":"j3E7UTIvK9SivBYv-QN_b","author":"codeisneverodd","code":"function solution(n) {\n let num = 0;\n let count = 0;\n\n while (count < n) {\n num += 1;\n if (!('' + num).includes('3') && num % 3 !== 0) count += 1;\n }\n\n return num;\n}","probId":"120871","createdAt":1679394094353,"lang":"JavaScript"},{"id":"zuKW6v0J6alpgcDtzf58X","author":"codeisneverodd","code":"function solution(dot) {\n const [x, y] = dot;\n if (y > 0) return x > 0 ? 1 : 2;\n return x < 0 ? 3 : 4;\n}","probId":"120841","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Vhp-_gTRlWlIK9bwC20Bs","author":"codeisneverodd","code":"function solution(n) {\n return Number.isInteger(Math.sqrt(n)) ? 1 : 2;\n}","probId":"120909","createdAt":1679394094353,"lang":"JavaScript"},{"id":"0Rbwoi8hQYeh8KnDJ7Pjw","author":"codeisneverodd","code":"function solution(M, N) {\n return M * N - 1;\n}","probId":"120922","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ZXHZe-XilNybP5cTIZClP","author":"codeisneverodd","code":"function solution(box, n) {\n return Math.floor(box[0] / n) * Math.floor(box[1] / n) * Math.floor(box[2] / n);\n}","probId":"120845","createdAt":1679394094353,"lang":"JavaScript"},{"id":"LrS3JXzlAzv78oxs0JRvP","author":"codeisneverodd","code":"function solution(my_string) {\n return [...new Set(my_string)].join('');\n}","probId":"120888","createdAt":1679394094353,"lang":"JavaScript"},{"id":"kJJRY9GgLy98mK7jGPdK3","author":"codeisneverodd","code":"function solution(array, n) {\n return array.filter(a => a === n).length;\n}","probId":"120583","createdAt":1679394094353,"lang":"JavaScript"},{"id":"5UBJ9ldIXAeNjpp0JIkfB","author":"codeisneverodd","code":"function solution(array) {\n return array.sort((a, b) => a - b)[Math.floor(array.length / 2)];\n}","probId":"120811","createdAt":1679394094353,"lang":"JavaScript"},{"id":"SiUS7rs55Tz70IpM2SQzb","author":"codeisneverodd","code":"const readline = require('readline');\nconst rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n});\n\nlet input = [];\n\nrl.on('line', function (line) {\n input = line.split(' ');\n}).on('close', function () {\n for (let i = 1; i <= +input[0]; i++) console.log('*'.repeat(i));\n});","probId":"120823","createdAt":1679394094353,"lang":"JavaScript"},{"id":"2SCINAyIX_7A8LruK1A1V","author":"codeisneverodd","code":"function solution(dots) {\n const xDots = dots.flatMap(([x, y]) => x);\n const yDots = dots.flatMap(([x, y]) => y);\n const width = Math.max(...xDots) - Math.min(...xDots);\n const height = Math.max(...yDots) - Math.min(...yDots);\n return width * height;\n}","probId":"120860","createdAt":1679394094353,"lang":"JavaScript"},{"id":"jouig9uSYkIg_D-tsM4Zu","author":"codeisneverodd","code":"function solution(emergency) {\n const sorted = [...emergency].sort((a, b) => b - a);\n return emergency.map(e => sorted.findIndex(s => s === e) + 1);\n}","probId":"120835","createdAt":1679394094353,"lang":"JavaScript"},{"id":"mPD29Z9lQ_cxKrDHC__oI","author":"codeisneverodd","code":"function solution(num_list) {\n const evenLength = num_list.filter(n => n % 2 === 0).length;\n return [evenLength, num_list.length - evenLength];\n}","probId":"120824","createdAt":1679394094353,"lang":"JavaScript"},{"id":"zy6mk4AvXF9xztiXRS8-4","author":"codeisneverodd","code":"function solution(n) {\n let nums = [];\n for (let i = 0; i <= n; i++) {\n if (i % 2 === 1) nums = [...nums, i];\n }\n return nums;\n}","probId":"120813","createdAt":1679394094353,"lang":"JavaScript"},{"id":"kHlGOVzrZIqpqvNmbWow6","author":"codeisneverodd","code":"function solution(n) {\n let answer = 0;\n for (let i = 0; i <= n; i++) {\n if (i % 2 === 0) answer += i;\n }\n return answer;\n}","probId":"120831","createdAt":1679394094353,"lang":"JavaScript"},{"id":"JQpPiPuxh73c7kO5a7Nzh","author":"codeisneverodd","code":"function solution(numbers) {\n const [first, second, ...rest] = numbers.sort((a, b) => b - a);\n return first * second;\n}","probId":"120847","createdAt":1679394094353,"lang":"JavaScript"},{"id":"k8E_n2JN9JYI6PrLnGzfX","author":"codeisneverodd","code":"function solution(numbers) {\n const sorted = numbers.sort((a, b) => a - b);\n return Math.max(sorted[0] * sorted[1], sorted[sorted.length - 1] * sorted[sorted.length - 2]);\n}","probId":"120862","createdAt":1679394094353,"lang":"JavaScript"},{"id":"czion0YKw_J-4kluumzhK","author":"codeisneverodd","code":"function solution(array) {\n const counts = array.reduce((a, c) => (a[c] ? { ...a, [c]: a[c] + 1 } : { ...a, [c]: 1 }), {});\n const max = Math.max(...Object.values(counts));\n const modes = Object.keys(counts).filter(key => counts[key] === max);\n return modes.length === 1 ? +modes[0] : -1;\n}","probId":"120812","createdAt":1679394094353,"lang":"JavaScript"},{"id":"JWQH6EyirigybzhegY5ST","author":"codeisneverodd","code":"function solution(chicken) {\n const order = coupons => {\n if (coupons < 10) return 0;\n const service = Math.floor(coupons / 10);\n return service + order(service + (coupons % 10));\n };\n return order(chicken);\n}","probId":"120884","createdAt":1679394094353,"lang":"JavaScript"},{"id":"CDR9AYzvMSjY8652CVTQN","author":"codeisneverodd","code":"//명령형\nfunction solution(keyinput, board) {\n const moves = {\n up: [0, 1],\n down: [0, -1],\n left: [-1, 0],\n right: [1, 0],\n };\n const [rangeX, rangeY] = [Math.floor(board[0] / 2), Math.floor(board[1] / 2)];\n\n let pos = [0, 0];\n\n keyinput\n .map(key => moves[key])\n .forEach(move => {\n if (Math.abs(move[0] + pos[0]) > rangeX || Math.abs(move[1] + pos[1]) > rangeY) return;\n pos[0] += move[0];\n pos[1] += move[1];\n });\n\n return pos;\n}","probId":"120861","createdAt":1679394094353,"lang":"JavaScript"},{"id":"L0AgXguklH1kXTw0yykGl","author":"codeisneverodd","code":"function solution(s) {\n const arr = s.split(' ');\n while (arr.includes('Z')) arr.splice(arr.indexOf('Z') - 1, 2);\n return arr.map(n => +n).reduce((a, c) => a + c, 0);\n}","probId":"120853","createdAt":1679394094353,"lang":"JavaScript"},{"id":"8Fs11e7oBekuxNjpAstT3","author":"codeisneverodd","code":"function solution(numlist, n) {\n return numlist.sort((a, b) => {\n const [aDiff, bDiff] = [Math.abs(a - n), Math.abs(b - n)];\n if (aDiff === bDiff) return b - a;\n return aDiff - bDiff;\n });\n}","probId":"120880","createdAt":1679394094353,"lang":"JavaScript"},{"id":"vdwvjmlu0CVowMKz2vTZD","author":"codeisneverodd","code":"function solution(my_string, letter) {\n return my_string.replaceAll(letter, '');\n}","probId":"120826","createdAt":1679394094353,"lang":"JavaScript"},{"id":"hbxjMqfAUJmkubGtkiuZf","author":"codeisneverodd","code":"function solution(n) {\n let factorial = [1, 1];\n for (let i = 2; n > factorial[i - 1]; i++) factorial[i] = factorial[i - 1] * i;\n\n return factorial[factorial.length - 1] === n ? factorial.length - 1 : factorial.length - 2;\n}","probId":"120848","createdAt":1679394094353,"lang":"JavaScript"},{"id":"uT6FMY9QYKdJW8t9cY7Lk","author":"codeisneverodd","code":"function solution(message) {\n return message.length * 2;\n}","probId":"120898","createdAt":1679394094353,"lang":"JavaScript"},{"id":"orCSuHScIqur0ogDwynkK","author":"codeisneverodd","code":"function solution(dots) {\n const getInclination = ([[x1, y1], [x2, y2]]) => (x2 !== x1 ? (y2 - y1) / (x2 - x1) : Infinity);\n const isParallel = (line1, line2) => getInclination(line1) === getInclination(line2);\n\n return dots.some(dot => {\n const line1 = [dots[0], dot];\n const line2 = dots.filter(dot => !line1.includes(dot));\n return isParallel(line1, line2);\n })\n ? 1\n : 0;\n}","probId":"120875","createdAt":1679394094353,"lang":"JavaScript"},{"id":"PLZGvoLrsqLBgJXgDXUwd","author":"codeisneverodd","code":"function solution(n) {\n return Math.floor((n - 1) / 7) + 1;\n}","probId":"120814","createdAt":1679394094353,"lang":"JavaScript"},{"id":"H_H5U2fZK_cMpSSW8A_Rg","author":"codeisneverodd","code":"function solution(n) {\n const getLCM = (a, b) => {\n let lcm = 1;\n while ((lcm % a !== 0 || lcm % b !== 0) && lcm < a * b) lcm += 1;\n return lcm;\n };\n\n return getLCM(n, 6) / 6;\n}","probId":"120815","createdAt":1679394094353,"lang":"JavaScript"},{"id":"UF4EuA0Zbky3u50b1ay54","author":"codeisneverodd","code":"function solution(slice, n) {\n return Math.floor((n - 1) / slice) + 1;\n}","probId":"120816","createdAt":1679394094353,"lang":"JavaScript"},{"id":"44CkOTIiD_oxexcg_TZIK","author":"codeisneverodd","code":"function solution(s) {\n const count = [...s].reduce((a, c) => (a[c] ? { ...a, [c]: a[c] + 1 } : { ...a, [c]: 1 }), {});\n return Object.keys(count)\n .filter(key => count[key] === 1)\n .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))\n .join('');\n}","probId":"120896","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Ude8dWJ0veL-IkVuADF1k","author":"codeisneverodd","code":"function solution(n) {\n const isPrime = num => {\n for (let i = 2; i <= Math.sqrt(num); i++) {\n if (num % i === 0) return true;\n }\n return false;\n };\n\n let count = 0;\n\n for (let i = 1; i <= n; i++) {\n if (isPrime(i)) count += 1;\n }\n \n return count;\n}","probId":"120846","createdAt":1679394094353,"lang":"JavaScript"},{"id":"AEcVZmiBojNk8Oboba6mD","author":"codeisneverodd","code":"function solution(a, b) {\n let count = 0;\n const day = [\"SUN\", \"MON\", \"TUE\", \"WED\", \"THU\", \"FRI\", \"SAT\"];\n const month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n for (let i = 1; i < a; i++) count += month[i];\n count += b;\n return day[(count + 4) % 7]; // 금요일 부터 1일 이므로\n}","probId":"12901","createdAt":1679394094353,"lang":"JavaScript"},{"id":"S22YSfhqRPUc6UHmqWtTT","author":"yongchanson","code":"function solution(a, b) {\n const month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n const week = [\"THU\", \"FRI\", \"SAT\", \"SUN\", \"MON\", \"TUE\", \"WED\"];\n\n let sum = b;\n for (\n let i = 0;\n i < a - 1;\n i++ //ex)5월인 경우 1~4월까지 더해준다.\n )\n sum += month[i];\n\n return week[sum % 7]; //1일이 금요일이므로, 0이면 목요일이 출력되어야 한다.\n}","probId":"12901","createdAt":1679394094353,"lang":"JavaScript"},{"id":"LjTnxDHrI117NKRnU7Zqy","author":"chaerin-dev","code":"function solution(a, b) {\n let arr = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n let week = [\"SUN\", \"MON\", \"TUE\", \"WED\", \"THU\", \"FRI\", \"SAT\"];\n // 1월 1일부터 a월 b일까지 며칠 차이인지 저장할 변수\n let passedDays = 0;\n // a달 전까지의 모든 달에 대해 각 달의 날짜 수 더해줌\n for (let i = 1; i < a; i++) passedDays += arr[i];\n // b일 더해주고 1월 0일이 아닌 1월 1일부터 시작하므로 1 빼줌\n passedDays += b - 1;\n return week[(5 + passedDays) % 7];\n}","probId":"12901","createdAt":1679394094353,"lang":"JavaScript"},{"id":"1kHjxIv6xoYdMdmdvQlAg","author":"prove-ability","code":"function solution(a, b) {\n var answer = \"\";\n // 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요?\n const days = [\"SUN\", \"MON\", \"TUE\", \"WED\", \"THU\", \"FRI\", \"SAT\"];\n const daysOfMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n // 2016년 1월 1일은 금요일로 4를 더해준다\n let totalDays = 4;\n // a 이전 모든 달의 일 수를 더한다\n for (let i = 0, len = a - 1; i < len; i++) {\n totalDays += daysOfMonth[i];\n }\n // totalDays 와 해당 일을 더해주고 7로 나눈 나머지\n const dayIndex = (totalDays + b) % 7;\n return days[dayIndex];\n}","probId":"12901","createdAt":1679394094353,"lang":"JavaScript"},{"id":"czN4T6LuWlCohCBZEFVSf","author":"codeisneverodd","code":"function solution(n) {\n var answer = 0;\n const ternaryReversed = decimalToTernaryReversed(n);\n answer = parseInt(ternaryReversed, 3);\n return answer;\n}\n\nconst decimalToTernaryReversed = (num) => {\n let ternary = \"\";\n while (num >= 3) {\n ternary += (num % 3).toString();\n num = Math.floor(num / 3);\n }\n ternary += num.toString();\n return ternary;\n};","probId":"68935","createdAt":1679394094353,"lang":"JavaScript"},{"id":"bQuOLguok3JdvtEXbswhY","author":"jaewon1676","code":"function solution(n) {\n var answer = n.toString(3).split(\"\").reverse().join(\"\");\n\n return parseInt(answer, 3);\n}","probId":"68935","createdAt":1679394094353,"lang":"JavaScript"},{"id":"M3fIPh7bjuq-s72EiNRB_","author":"prove-ability","code":"function solution(n) {\n return parseInt(n.toString(3).split(\"\").reverse().join(\"\"), 3)\n}","probId":"68935","createdAt":1679394094353,"lang":"JavaScript"},{"id":"w731dCWjCy4oHDfK9usEH","author":"codeisneverodd","code":"function solution(array, commands) {\n return commands.map((cmd) => {\n const arrCmd = array.slice(cmd[0] - 1, cmd[1]).sort((a, b) => a - b);\n return arrCmd[cmd[2] - 1];\n });\n}","probId":"42748","createdAt":1679394094353,"lang":"JavaScript"},{"id":"JCbzIgZhJ3YjVlXbIT-z9","author":"jaewon1676","code":"function solution(array, commands) {\n var result = [];\n var temp = [];\n for (var i = 0; i < commands.length; i++) {\n temp = array.slice(commands[i][0] - 1, commands[i][1]).sort((a, b) => {\n return a - b;\n });\n console.log(temp);\n result.push(temp[commands[i][2] - 1]);\n }\n return result;\n}","probId":"42748","createdAt":1679394094353,"lang":"JavaScript"},{"id":"JF0TOt-JJ6h1O8Krb60Ke","author":"prove-ability","code":"function solution(array, commands) {\n var answer = [];\n commands.forEach(([i, j, k]) => {\n const su = array.slice(i - 1, j).sort((a, b) => a - b)[k - 1];\n answer.push(su);\n });\n return answer;\n}","probId":"42748","createdAt":1679394094353,"lang":"JavaScript"},{"id":"45jjvhNysFJA-M7MRfbX2","author":"createhb21","code":"function solution(array, commands) {\n let answer = [];\n for (let i = 0; i < commands.length; i++) {\n let eachCommand = commands[i];\n let slice = array.slice(eachCommand[0] - 1, eachCommand[1]);\n answer.push(slice.sort((a, b) => a - b)[eachCommand[2] - 1]);\n }\n return answer;\n}","probId":"42748","createdAt":1679394094353,"lang":"JavaScript"},{"id":"KeoN162P78OTI7INZNqDO","author":"chaerin-dev","code":"function solution(array, commands) {\n let t = commands.length;\n let answer = [];\n while (t--) {\n let command = commands.shift();\n answer.push(\n array.slice(command[0] - 1, command[1]).sort((a, b) => a - b)[\n command[2] - 1\n ]\n );\n }\n return answer;\n}","probId":"42748","createdAt":1679394094353,"lang":"JavaScript"},{"id":"wsEkfxo9XV-p77hkbekXa","author":"codeisneverodd","code":"function solution(dartResult) {\n const regex = /\\d{1,2}[SDT]{1}[*|#]?/g;\n let result = [];\n for (const dart of dartResult.match(regex)) {\n const game = [...dart.split(/([SDT]{1})/)];\n const score = game[0];\n let bonus = 1;\n let option = 1;\n if (game[1] === \"S\") bonus = 1;\n if (game[1] === \"D\") bonus = 2;\n if (game[1] === \"T\") bonus = 3;\n\n if (game[2] === \"*\") {\n if (result.length !== 0) result[result.length - 1] *= 2;\n option = 2;\n }\n if (game[2] === \"#\") option = -1;\n\n result.push(score ** bonus * option);\n }\n\n return result.reduce((a, b) => a + b);\n}","probId":"17682","createdAt":1679394094353,"lang":"JavaScript"},{"id":"irR2UXQX-A5XSGaRc1Hae","author":"jaewon1676","code":"function solution(dartResult) {\n var answer = 0;\n let score = 0;\n let cnt = [];\n\n for (let i = 0; i < dartResult.length; i++) {\n //점수가 주어질때\n if (!isNaN(dartResult[i])) {\n // i가 1인 경우는 10점, 그외에는 점수\n score = Number(dartResult[i - 1]) === 1 ? 10 : Number(dartResult[i]);\n //보너스 S일때\n } else if (dartResult[i] === \"S\") {\n cnt.push(score);\n //보너스 D일때\n } else if (dartResult[i] === \"D\") {\n cnt.push(Math.pow(score, 2));\n //보너스 T일때\n } else if (dartResult[i] === \"T\") {\n cnt.push(Math.pow(score, 3));\n //옵션 *일떄\n } else if (dartResult[i] === \"*\") {\n cnt[cnt.length - 2] = cnt[cnt.length - 2] * 2;\n cnt[cnt.length - 1] = cnt[cnt.length - 1] * 2;\n //옵션 #일때\n } else if (dartResult[i] === \"#\") {\n cnt[cnt.length - 1] = -1 * cnt[cnt.length - 1];\n }\n }\n //3개의 점수 합산\n answer = cnt.reduce((acc, cur) => acc + cur, 0);\n return answer;\n}","probId":"17682","createdAt":1679394094353,"lang":"JavaScript"},{"id":"VFnKIAMHH4Xt05M7jCGR8","author":"codeisneverodd","code":"function solution(n, arr1, arr2) {\n var answer = [];\n let mapA = [];\n let mapB = [];\n for (let i = 0; i < n; i++) {\n let rowArrA = arr1[i].toString(2).split(\"\");\n let rowArrB = arr2[i].toString(2).split(\"\");\n for (let j = 0, len = rowArrA.length; j < n - len; j++)\n rowArrA.unshift(\"0\");\n for (let j = 0, len = rowArrB.length; j < n - len; j++)\n rowArrB.unshift(\"0\");\n mapA.push(rowArrA);\n mapB.push(rowArrB);\n }\n let answer2D = mapA.slice();\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n answer2D[i][j] = mapA[i][j] === \"0\" && mapB[i][j] === \"0\" ? \" \" : \"#\";\n }\n }\n answer = answer2D.map((row) => row.join(\"\"));\n return answer;\n}","probId":"17681","createdAt":1679394094353,"lang":"JavaScript"},{"id":"5SiIjKY4OzuKQ5AL87KS3","author":"jaewon1676","code":"function solution(n, arr1, arr2) {\n let answer = [];\n for (let i = 0; i < n; i++) {\n let temp = (arr1[i] | arr2[i]).toString(2);\n let line = []; // 한 행의 모든 2진수 보관\n\n for (let j = temp.length - n; j < temp.length; j++) {\n if (temp[j] == 1) {\n line.push(\"#\");\n } else {\n line.push(\" \");\n }\n }\n answer.push(line.join(\"\"));\n }\n return answer;\n}\n\n/* 풀이 과정\n1. 배열 arr1, arr2 을 2진수로 변한한다. 이 때, 하나라도 1일 시에는 1로 변환하고, 그렇지 않으면 0을 반환한다.\n2. 9번의 반복문을 행의 길이만큼 돌려 1이면 #, 그렇지 않으면 띄어쓰기를 push 해준다.\n3. 행의 배열의 원소를 join 메서드를 사용하여 문자열로 합친다.*/","probId":"17681","createdAt":1679394094353,"lang":"JavaScript"},{"id":"YpoSpGPJGAlrqUgsohv5i","author":"codeisneverodd","code":"function solution(x, n) {\n return Array.from(Array(n), (_, index) => x * (index + 1));\n}","probId":"12954","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Cvkcn0ZBRI8ZT6VViEajm","author":"chaerin-dev","code":"function solution(x, n) {\n var answer = [];\n let add_gap = x;\n // n번 반복\n for (let i = 0; i < n; i++) {\n answer.push(x); // 처음 배열에 넣을 x\n x += add_gap; // x를 배열에 넣은 후 x값을 add_gap만큼 증가\n }\n return answer;\n}","probId":"12954","createdAt":1679394094353,"lang":"JavaScript"},{"id":"3qn2IflJ7P5F_tKB6XC7f","author":"jaewon1676","code":"function solution(n) {\n let str = \"\";\n for (let i = 0; i < n; i++) {\n // 삼항 연산자와 +로 문자열을 붙여주어 추가.\n i % 2 == 0 ? (str = str + \"수\") : (str = str + \"박\");\n }\n return str;\n}","probId":"12954","createdAt":1679394094353,"lang":"JavaScript"},{"id":"m0z2ecvCUempXfOB6GMMY","author":"prove-ability","code":"function solution(x, n) {\n var answer = [];\n let i = 1;\n // n개 지니는 리스트를 리턴해야 합니다\n while (answer.length !== n) {\n // x부터 시작해 x씩 증가하는 숫자\n answer.push(x * i);\n i++;\n }\n return answer;\n}","probId":"12954","createdAt":1679394094353,"lang":"JavaScript"},{"id":"dxeSx_ZVdGgq2z1QHa6Cw","author":"codeisneverodd","code":"function solution(s) {\n return s.length % 2 !== 0\n ? s[Math.floor(s.length / 2)]\n : s.slice(s.length / 2 - 1, s.length / 2 + 1);\n}","probId":"12903","createdAt":1679394094353,"lang":"JavaScript"},{"id":"r-rwFERI9-Lah5UA83Maq","author":"yongchanson","code":"function solution(s) {\n var answer = \"\";\n let L2 = s.length / 2;\n\n answer =\n s.length % 2 == 0 ? s[L2 - 1] + s[L2] : (answer = s[Math.ceil(L2 - 1)]);\n\n return answer;\n}","probId":"12903","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-qN4d-WX14-j50bZByLaG","author":"prove-ability","code":"function solution(s) {\n var answer = '';\n // 중간 지점 찾기\n const point = Math.floor(s.length / 2);\n // 짝수인 경우 - (중간지점 - 1) + 중간지점 \n if(s.length % 2 ===0) answer = s[point - 1] + s[point];\n // 홀수인 경우 - 중간지점\n else answer = s[point];\n return answer;\n}","probId":"12903","createdAt":1679394094353,"lang":"JavaScript"},{"id":"70_67tohf_a1hLYU_krte","author":"chaerin-dev","code":"function solution(s) {\n return s.length % 2\n ? s[parseInt(s.length / 2)]\n : s[s.length / 2 - 1] + s[s.length / 2];\n}","probId":"12903","createdAt":1679394094353,"lang":"JavaScript"},{"id":"oxWHg53i3iT665f8hozdE","author":"jaewon1676","code":"function solution(s) {\n var answer = '';\n \n if (s.length % 2 == 0 ) { // 짝수일 경우,\n answer = s[s.length / 2 - 1] + s[s.length / 2];\n } else {\n answer = s[parseInt(s.length / 2)]; // 홀수일 경우\n }\n return answer;\n}","probId":"12903","createdAt":1679394094353,"lang":"JavaScript"},{"id":"tplZVPK_PKF-XuBUl5Eq-","author":"codeisneverodd","code":"function solution(arr) {\n var answer = [arr[0]];\n for (let i = 1; i < arr.length; i++) {\n //arr를 수정하면(shift해서 사용하면) 효율성 테스트에서 미통과됩니다.\n answer[answer.length - 1] !== arr[i] ? answer.push(arr[i]) : null;\n }\n return answer;\n}","probId":"12906","createdAt":1679394094353,"lang":"JavaScript"},{"id":"GzhFem1SEpbyrlwaIwQkw","author":"chaerin-dev","code":"function solution(arr) {\n // 콜백함수의 조건을 만족하는 '모든' 값을 배열로 반환하고,\n // 조건을 만족하는 값이 없으면 빈 배열을 반환하는 filter 메서드 활용\n // 첫 번째 요소의 경우 undefined와 비교\n return arr.filter((item, index) => item !== arr[index - 1]);\n}","probId":"12906","createdAt":1679394094353,"lang":"JavaScript"},{"id":"sSuxksrH_HTsCFC99QbVD","author":"prove-ability","code":"function solution(arr) {\n let answer = [];\n // 이중 배열을 사용해서 포인터?를 두 개를 사용한다\n for (let i = 0, len = arr.length - 1; i < len; i++) {\n // i 의 다음수를 비교하기 위해 j = (i + 1)\n for (let j = i + 1, len = arr.length; j < len; j++) {\n // i 와 j 번째 값이 같이 않다면\n if (arr[i] !== arr[j]) {\n answer.push(arr[i]);\n i = j - 1;\n break;\n }\n }\n }\n answer.push(arr[arr.length - 1]);\n return answer;\n}","probId":"12906","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Apl4xThs1U943jNGofenj","author":"codeisneverodd","code":"function solution(arr, divisor) {\n var answer = [];\n arr.forEach((element) => {\n element % divisor === 0 ? answer.push(element) : null;\n });\n answer.length === 0 ? answer.push(-1) : null;\n answer.sort((a, b) => a - b);\n return answer;\n}","probId":"12910","createdAt":1679394094353,"lang":"JavaScript"},{"id":"wQ0wLhdnBhT5nV-HrUOG6","author":"dev","code":"function solution(arr, divisor) {\n let answer = [];\n arr.forEach((e) => {\n if (e % divisor === 0) answer.push(e);\n });\n return answer.length ? answer.sort((a, b) => a - b) : [-1];\n}","probId":"12910","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9gBj_SQybGqNPFUgPgwAL","author":"prove-ailbity","code":"function solution(arr, divisor) {\n var answer = [];\n arr.forEach((v) => v % divisor === 0 && answer.push(v))\n return answer.length === 0 ? [-1] : answer.sort((a, b) => a - b);\n}","probId":"12910","createdAt":1679394094353,"lang":"JavaScript"},{"id":"wBB0LgxWB13kFvcb7a0bn","author":"codeisneverodd","code":"function solution(n) {\n\n let answer = 0;\n for (let divisor = n - 1; divisor >= 2; divisor--) {\n if (n % divisor === 1) answer = divisor;\n }\n return answer;\n}","probId":"87389","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-3DC0G3b7HQlRUoXI1xS4","author":"prove-ability","code":"function solution(n) {\n var answer = 0;\n let i = 0;\n while(true) {\n if(n % i === 1) {\n answer = i;\n break;\n }\n i++;\n }\n return answer;\n}","probId":"87389","createdAt":1679394094353,"lang":"JavaScript"},{"id":"eNmzI_I9Cm2Zosmx6ry0u","author":"jaewon1676","code":"function solution(n) {\n var answer = 0;\n for (let i=1; i x + y * b[i], 0);\n}","probId":"70128","createdAt":1679394094353,"lang":"JavaScript"},{"id":"3TpNIAgLL-5u6NTCVTVPt","author":"yongchanson","code":"function solution(a, b) {\n var answer = 0;\n\n for (i = 0; i < a.length; i++) {\n answer += a[i] * b[i];\n }\n return answer;\n}","probId":"70128","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7FaF84IBRAP5M6el6xMzE","author":"prove-ability","code":"function solution(a, b) {\n var answer = 0;\n\n for (let i = 0, len = a.length; i < len; i++) {\n answer += a[i] * b[i];\n }\n\n return answer;\n}","probId":"70128","createdAt":1679394094353,"lang":"JavaScript"},{"id":"H1wPpp1YCjQYNFtS4N5p6","author":"jaewon1676","code":"function solution(a, b) {\n let answer = 0;\n for (let i=0; i acc + e * b[i], 0);\n}","probId":"70128","createdAt":1679394094353,"lang":"JavaScript"},{"id":"u1LRslWaD35sQvv9sq4Ix","author":"codeisneverodd","code":"function solution(numbers) {\n const answer = [];\n for (let i = 0; i < numbers.length; i++) {\n for (let j = i + 1; j < numbers.length; j++) {\n answer.push(numbers[i] + numbers[j]);\n }\n }\n return [...new Set(answer)].sort((a, b) => a - b);\n}","probId":"68644","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ddHM-zBFEziRa-cT5KCbU","author":"prove-ability","code":"function solution(numbers) {\n const answer = [];\n \n for(let i = 0, len = numbers.length; i < len; i++) {\n for(let j = i + 1, len = numbers.length; j < len; j++) {\n if(!answer.includes(numbers[i] + numbers[j])) answer.push(numbers[i] + numbers[j])\n }\n }\n \n return answer.sort((a, b) => a - b);\n}","probId":"68644","createdAt":1679394094353,"lang":"JavaScript"},{"id":"cH427BdoJegcnYsf3edFD","author":"codeisneverodd","code":"function solution(a, b) {\n let answer = 0;\n for (let i = Math.min(a, b); i <= Math.max(a, b); i++) {\n answer += i;\n }\n return answer;\n}","probId":"12912","createdAt":1679394094353,"lang":"JavaScript"},{"id":"rnopZ1is74uXF9AaqtqaK","author":"chaerin-dev","code":"function solution(a, b) {\n let answer = 0;\n for (let i = Math.min(a, b); i <= Math.max(a, b); i++) {\n answer += i;\n }\n return answer;\n}","probId":"12912","createdAt":1679394094353,"lang":"JavaScript"},{"id":"nESVaMUpCWlxN7XdDjjjE","author":"prove-ability","code":"function solution(a, b) {\n return Array.from({length: Math.max(a, b) - Math.min(a, b) + 1}, (_, i) => i + Math.min(a, b)).reduce((a, b) => a + b, 0);\n}","probId":"12912","createdAt":1679394094353,"lang":"JavaScript"},{"id":"bV_2v8ALJkaaeWq2X27Py","author":"jaewon1676","code":"function solution(a, b) {\n if (b < a){ // b가 a보다 큰 수가 되도록 해준다.\n let c = b\n b = a\n a = c\n }\n let sum = 0; // 합을 구할 변수\n for (let i=a; i<=b; i++){\n sum += i\n }\n return sum;\n}","probId":"12912","createdAt":1679394094353,"lang":"JavaScript"},{"id":"vefgEjNOZgxFWk82k8HSb","author":"codeisneverodd","code":"function solution(lottos, win_nums) {\n // 0이 없는 경우 > 최저 순위 == 최고 순위\n // 0이 있는 경우 > 모두 0인경우 > 1위\n // > 0이 아닌 수가 있는 경우 > 최저 순위 - (0의 개수) = 최고순위\n // 0이 있는 경우 0만 중복이 가능하므로, 0의 개수를 (배열 길이 - 집합 길이 + 1)를 통해 구함.\n // 순위는 7 - hit\n // 최종적으로 7위인 경우 6위로 변경\n var answer = [];\n if (lottos.indexOf(0) === -1) {\n answer[0] = answer[1] = 7 - hit(lottos, win_nums);\n } else {\n const zeroCount = lottos.length - [...new Set(lottos)].length + 1;\n answer[1] = 7 - hit(lottos, win_nums);\n zeroCount === 6 ? (answer[0] = 1) : (answer[0] = answer[1] - zeroCount);\n }\n for (let i = 0; i < 2; i++) {\n answer[i] >= 7 ? (answer[i] = 6) : null;\n }\n return answer;\n}\n\nfunction hit(lottos, win_nums) {\n let result = 0;\n lottos.forEach((element) => {\n win_nums.indexOf(element) === -1 ? null : (result += 1);\n });\n return result;\n}","probId":"77484","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9dpy1EpfSz9k1iArBgumY","author":"jaewon1676","code":"function solution(lottos, win_nums) {\n var answer = [];\n let max = 7;\n let min = 7;\n console.log(lottos);\n console.log(win_nums);\n for (let i = 0; i < 6; i++) {\n if (lottos.includes(win_nums[i])) {\n max--;\n }\n }\n min = max;\n for (let i = 0; i < 6; i++) {\n if (lottos[i] == 0) min--;\n }\n if (max == 7) max = 6;\n if (min == 7) min = 6;\n answer = [min, max];\n return answer;\n}","probId":"77484","createdAt":1679394094353,"lang":"JavaScript"},{"id":"vxbGIckHl0SSCwsKi5pe1","author":"yongchanson","code":"function solution(lottos, win_nums) {\n //최고당첨개수 : maxPoint + basicPoint\n //최저당첨개수 : basicPoint\n\n let basicPoint = 0;\n let maxPoint = 0;\n let answer = [];\n\n lottos.forEach(function (lottos_item) {\n win_nums.forEach(function (win_nums_item) {\n if (lottos_item == win_nums_item) {\n basicPoint++;\n }\n });\n });\n\n lottos.forEach(function (item) {\n if (item == 0) {\n maxPoint++;\n }\n });\n\n maxPoint + basicPoint >= 2\n ? answer.push(7 - maxPoint - basicPoint)\n : answer.push(6);\n basicPoint >= 2 ? answer.push(7 - basicPoint) : answer.push(6);\n\n return answer;\n}","probId":"77484","createdAt":1679394094353,"lang":"JavaScript"},{"id":"EyheSzDORX6Wu8Bei-nL0","author":"prove-ability","code":"function solution(lottos, win_nums) {\n // 맞춘 수와 0의 갯수 활용할 변수 0으로 초기화\n let winCount = 0;\n let zeroCount = 0;\n // 내 로또 번호 하니씩 접근\n lottos.forEach((num) => {\n // 번호가 0이 아니고 당첨 번호라면\n if (num !== 0 && win_nums.includes(num)) {\n winCount++;\n // 번호가 0이라면\n } else if (num === 0) {\n zeroCount++;\n }\n });\n // 일치한 수와 등수는 반비례하기 때문에 빼기 7\n // 이때 등수를 벗어나면 낙첨(6) 으로 고정\n let max = 7 - (winCount + zeroCount);\n if (max > 5) max = 6;\n let min = 7 - winCount;\n if (min > 5) min = 6;\n\n return [max, min];\n}","probId":"77484","createdAt":1679394094353,"lang":"JavaScript"},{"id":"qjNmmEmjC9keh1q2piy0p","author":"chaerin-dev","code":"function solution(lottos, win_nums) {\n let zeroCount = 0;\n let winCount = 0;\n lottos.forEach((item) => {\n if (item === 0) zeroCount++;\n else if (win_nums.includes(item)) winCount++;\n });\n let maxRank = Math.min(7 - (winCount + zeroCount), 6);\n let minRank = Math.min(7 - winCount, 6);\n return [maxRank, minRank];\n}","probId":"77484","createdAt":1679394094353,"lang":"JavaScript"},{"id":"jtXAf9CXgcBR0eVal_VcX","author":"codeisneverodd","code":"function solution(answers) {\n const answer = [];\n const firstPattern = [1, 2, 3, 4, 5];\n const firstPLength = firstPattern.length;\n const secondPattern = [2, 1, 2, 3, 2, 4, 2, 5];\n const secondPLength = secondPattern.length;\n const thirdPattern = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];\n const thirdLength = thirdPattern.length;\n let correctCount = [0, 0, 0];\n\n for (let i = 0, len = answers.length; i < len; i++) {\n if (answers[i] === firstPattern[i % firstPLength]) correctCount[0] += 1;\n if (answers[i] === secondPattern[i % secondPLength]) correctCount[1] += 1;\n if (answers[i] === thirdPattern[i % thirdLength]) correctCount[2] += 1;\n }\n\n const maxScore = Math.max(...correctCount);\n for (let i = 0; i < 3; i++) {\n if (correctCount[i] === maxScore) answer.push(i + 1);\n }\n\n return answer;\n}\n\n// 완벽한 정답이 아닙니다.","probId":"42840","createdAt":1679394094353,"lang":"JavaScript"},{"id":"hUEeeo5yGROmIsN_jAgdO","author":"prove-ability","code":"function solution(answers) {\n let result = [];\n\n let players = {\n 1: {\n pattern: [1, 2, 3, 4, 5],\n count: 0,\n },\n 2: {\n pattern: [2, 1, 2, 3, 2, 4, 2, 5],\n count: 0,\n },\n 3: {\n pattern: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5],\n count: 0,\n },\n };\n let max = 0;\n answers.forEach((answer, index) => {\n for (let [key, { pattern }] of Object.entries(players)) {\n // 조정된 index 의 값과 답이 맞다면 해당 플레이어 count 증가\n if (pattern[index % pattern.length] === answer) {\n players[key].count++;\n // 제일 높은 count 구하기\n if (max < players[key].count) max = players[key].count;\n }\n }\n });\n // players 중에 count 가 max 와 값이 같다면 result 추가\n for (let [key, { count }] of Object.entries(players)) {\n if (count === max) result.push(parseInt(key, 10));\n }\n\n return result;\n}","probId":"42840","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7ocFw-Mfowyrv60oOyoRL","author":"yongchanson","code":"function solution(answers) {\n let score = [];\n let answer = [];\n let a1 = [1, 2, 3, 4, 5];\n let a2 = [2, 1, 2, 3, 2, 4, 2, 5];\n let a3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];\n\n score.push(answers.filter((a, i) => a === a1[i % a1.length]).length);\n score.push(answers.filter((a, i) => a === a2[i % a2.length]).length);\n score.push(answers.filter((a, i) => a === a3[i % a3.length]).length);\n\n for (let i = 0; i < score.length; i++) {\n const max = Math.max(...score);\n if (score[i] === max) {\n answer.push(i + 1);\n }\n }\n\n return answer;\n}","probId":"42840","createdAt":1679394094353,"lang":"JavaScript"},{"id":"DsDsHG8XG_QE_c8oxKz0q","author":"jaewon1676","code":"function solution(answers) {\n let arr1 = [1,2,3,4,5]\n let arr2 = [2,1,2,3,2,4,2,5]\n let arr3 = [3,3,1,1,2,2,4,4,5,5]\n \n let score = [0, 0, 0]\n for (let i=0; i {\n for (let j = 0; j < pattern.length; j++) {\n const patternLength = pattern[j].length;\n if (answer === pattern[j][i % patternLength]) scores[j]++;\n }\n });\n\n const answer = [];\n const maxScore = Math.max(...scores);\n scores.forEach((score, i) => {\n if (score === maxScore) answer.push(i + 1);\n });\n return answer;\n}","probId":"42840","createdAt":1679394094353,"lang":"JavaScript"},{"id":"6Xvm3DRqhWlMmXu7pxkMi","author":"codeisneverodd","code":"function solution(s) {\n const countP = [...s.matchAll(/p/gi)].length;\n const countY = [...s.matchAll(/y/gi)].length;\n return countP === countY;\n}","probId":"12916","createdAt":1679394094353,"lang":"JavaScript"},{"id":"gbuN_FBdxM9d3v0pl7f72","author":"yongchanson","code":"function solution(s) {\n p = s.toLowerCase().split(\"p\").length;\n y = s.toLowerCase().split(\"y\").length;\n\n return p == y ? true : false;\n}","probId":"12916","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Wj5GvftUtCNvjbDPeRwyW","author":"chaerin-dev","code":"function solution(s) {\n let pCount = s.split(/p/i).length - 1;\n let yCount = s.split(/y/i).length - 1;\n return pCount === yCount;\n}\n// 문자열에서 특정 문자의 개수를 구하려면 split을 사용하면 된다.\n// Ex. \"ababb\".split(\"a\") 의 결과는 [\"\", \"b\", \"bb\"]\n// => 즉, \"a\"의 갯수는 3에서 1을 뺀 2","probId":"12916","createdAt":1679394094353,"lang":"JavaScript"},{"id":"2lh7YnCfgFLvYbiPaXMPY","author":"prove-ability","code":"function solution(s){\n // 배열로 변환 \n s = s.split(\"\");\n // filter 를 사용해 갯수 추출\n const pCount = s.filter((v) => v === \"p\" || v === \"P\").length;\n const yCount = s.filter((v) => v === \"y\" || v === \"Y\").length;\n return pCount === yCount;\n}","probId":"12916","createdAt":1679394094353,"lang":"JavaScript"},{"id":"SuH9zb3QseKwsBlIUvbeb","author":"codeisneverodd","code":"function solution(strings, n) {\n return strings.sort((a, b) => {\n if (a[n] < b[n]) return -1;\n if (a[n] > b[n]) return 1;\n if (a[n] === b[n]) return a < b ? -1 : 1;\n return 0;\n });\n}","probId":"12915","createdAt":1679394094353,"lang":"JavaScript"},{"id":"p0UrQpOrzjxTbpCrToefp","author":"chaerin-dev","code":"function solution(strings, n) {\n return strings.sort((a, b) => {\n // 인덱스 n번째 글자를 기준으로 오름차순 정렬\n if (a[n] > b[n]) return 1;\n else if (a[n] < b[n]) return -1;\n // 인덱스 n번째 글자가 같으면 사전순 정렬\n else return a > b ? 1 : -1;\n });\n}","probId":"12915","createdAt":1679394094353,"lang":"JavaScript"},{"id":"CZtoJ5hGw6yD6qmcOAxAh","author":"prove-ability","code":"function solution(strings, n) {\n // 정렬\n strings.sort((a, b) => {\n // n번째 클자가 같다면 사전순\n if(a[n].charCodeAt() === b[n].charCodeAt()) {\n return a > b ? 1 : -1;\n } else return a[n].charCodeAt() - b[n].charCodeAt();\n });\n \n return strings;\n}","probId":"12915","createdAt":1679394094353,"lang":"JavaScript"},{"id":"6PBSwqM-7Lxp2uzW3y5Rm","author":"codeisneverodd","code":"function solution(s) {\n return s\n .split(\"\")\n .sort((a, b) => {\n if (a < b) return 1;\n if (a > b) return -1;\n return 0;\n })\n .join(\"\");\n}","probId":"12917","createdAt":1679394094353,"lang":"JavaScript"},{"id":"POlRT_d81WKoMvkOpZLwE","author":"chaerin-dev","code":"function solution(s) {\n return s.split(\"\").sort((a, b) => (a < b ? 1 : -1)).join(\"\");\n}","probId":"12917","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Iht2iJ1-uF8rNDkfvgqA5","author":"prove-ability","code":"function solution(s) {\n return s.split(\"\").sort().reverse().join(\"\")\n}","probId":"12917","createdAt":1679394094353,"lang":"JavaScript"},{"id":"cVAON9iE8SNoeIa0AicHr","author":"jaewon1676","code":"function solution(s) {\n return s.split('').sort().reverse().join('')\n}\n// split('')은 문자열을 하나씩 쪼개주면서 타입을 배열로 변환시켜줍니다.\n// 그러면 문자열 타입이 배열이 되므로 정렬을 할 수 있습니다.\n// sort()는 오름차순이기때문에 다시 뒤집어서 합쳐줍니다.","probId":"12917","createdAt":1679394094353,"lang":"JavaScript"},{"id":"wOdMGpOtd-sWso4N0zJgS","author":"codeisneverodd","code":"function solution(s) {\n return s.search(/\\D/g) < 0 && (s.length === 4 || s.length === 6);\n}","probId":"12918","createdAt":1679394094353,"lang":"JavaScript"},{"id":"BC2iVdtTid2DmUfOWJ_Wx","author":"yongchanson","code":"function solution(s) {\n let parseInts = parseInt(s);\n if (s.length == 6 || s.length == 4) {\n if (s == parseInts) {\n return true;\n }\n }\n\n return false;\n}","probId":"12918","createdAt":1679394094353,"lang":"JavaScript"},{"id":"BLMS81Kd_3ESK6sJRDBv6","author":"prove-ability","code":"function solution(s) {\n var answer = true;\n // 문자열 s의 길이가 4 혹은 6이고\n if (s.length === 4 || s.length === 6) {\n for (let i = 0, len = s.length; i < len; i++) {\n // 숫자로만 구성돼있는지 확인\n if (!Number.isInteger(parseInt(s[i], 10))) return false;\n }\n // 문자열 s의 길이가 4 혹은 6 가 아니라면 false\n } else return false;\n\n return answer;\n}","probId":"12918","createdAt":1679394094353,"lang":"JavaScript"},{"id":"KdFwqPsbkbeC2sry1YlLP","author":"chaerin-dev","code":"function solution(s) {\n // 길이가 4 혹은 6이 아니면 false 반환\n if (s.length !== 4 && s.length !== 6) return false;\n // 각 자리중에 숫자가 아닌 것이 하나라도 있으면 false 반환\n for (let i = 0; i < s.length; i++) {\n if (isNaN(Number(s[i]))) return false;\n }\n // 위의 모든 조건에 포함되지 않으면\n // (길이가 4 혹은 6이고, 숫자로만 구성되어 있으면) true 반환\n return true;\n}","probId":"12918","createdAt":1679394094353,"lang":"JavaScript"},{"id":"8bAMLCGHJsEdyy4w-3wqv","author":"soulhn","code":"function solution(s) {\n if (s.length !== 4 && s.length !== 6) return false;\n return !s.split(\"\").some((i) => isNaN(parseInt(i, 10))); \n //early return 제외사항 먼저 처리\n //.split 문자열 배열로 변환, .some을 이용하여 isNaN인지 판별, ! 사용하여 문제 조건에 맞게 반환\n}","probId":"12918","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-D40QnsIG0MSdP2ddCzTM","author":"codeisneverodd","code":"function solution(s) {\n return parseInt(s);\n}","probId":"12925","createdAt":1679394094353,"lang":"JavaScript"},{"id":"M_pnjlqwOE1iXMlP8Sana","author":"chaerin-dev","code":"function solution(s) {\n return Number(s);\n}","probId":"12925","createdAt":1679394094353,"lang":"JavaScript"},{"id":"dcT3fiZrYG9B2fTtKBoYS","author":"prove-ability","code":"function solution(s) {\n return parseInt(s, 10);\n}","probId":"12925","createdAt":1679394094353,"lang":"JavaScript"},{"id":"CUOqDr4YB132Z2jleOMM3","author":"jaewon1676","code":"function solution(s) {\n return parseInt(s);\n}","probId":"12925","createdAt":1679394094353,"lang":"JavaScript"},{"id":"YkiXJ0xsbRd1Coc5zUSFB","author":"codeisneverodd","code":"function solution(price, money, count) {\n let totalCost = 0;\n for (let i = 1; i <= count; i++) totalCost += price * i;\n return totalCost <= money ? 0 : totalCost - money;\n}","probId":"82612","createdAt":1679394094353,"lang":"JavaScript"},{"id":"uezZoEz0m8hdOIR3BleHq","author":"yongchanson","code":"function solution(price, money, count) {\n var answer = 0;\n let sum = price;\n\n for (i = 2; i <= count; i++) {\n sum += price * i;\n }\n\n if (sum <= money) {\n answer = 0;\n } else {\n answer = sum - money;\n }\n return answer;\n}","probId":"82612","createdAt":1679394094353,"lang":"JavaScript"},{"id":"jPwA0bbofjNFRXr-RZahv","author":"jaewon1676","code":"function solution(price, money, count) {\n let sum_price = 0; // 놀이기구의 이용료의 합\n for (let i = 1; i <= count; i++) {\n sum_price += i * price; // 이용료의 N배 만큼 곱해서 더해준다.\n }\n if (sum_price <= money) {\n return 0;\n }\n return sum_price - money;\n}","probId":"82612","createdAt":1679394094353,"lang":"JavaScript"},{"id":"wgyHIm0C7_YgaxjJ_BNSm","author":"prove-ability","code":"function solution(price, money, count) {\n let sum = 0;\n for(let i = 1; i <= count; i++) {\n sum += (i * price)\n }\n \n return sum < money ? 0 : sum - money;\n}","probId":"82612","createdAt":1679394094353,"lang":"JavaScript"},{"id":"15io-kgHZyB9UaD1R45X3","author":"chaerin-dev","code":"function solution(price, money, count) {\n let totalPrice = 0;\n for(let i=1; i<=count; i++){\n totalPrice += i * price;\n }\n return money > totalPrice ? 0 : totalPrice-money;\n}","probId":"82612","createdAt":1679394094353,"lang":"JavaScript"},{"id":"MAqIJ3oD3esA37-hZPA7q","author":"codeisneverodd","code":"function solution(seoul) {\n return `김서방은 ${seoul.indexOf(\"Kim\")}에 있다`;\n}","probId":"12919","createdAt":1679394094353,"lang":"JavaScript"},{"id":"1P_8CD3TNq6Oyz3OfshfI","author":"chaerin-dev","code":"function solution(seoul) {\n return `김서방은 ${seoul.indexOf(\"Kim\")}에 있다`;\n}","probId":"12919","createdAt":1679394094353,"lang":"JavaScript"},{"id":"iPAbSgoCkYxzQbOgEYUbE","author":"prove-ability","code":"function solution(seoul) {\n return `김서방은 ${seoul.findIndex(v => v === \"Kim\")}에 있다`;\n}","probId":"12919","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9gGGQN_CRMDg_SQ5OviA1","author":"jaewon1676","code":"function solution(seoul) {\n var answer = '';\n for (let i=0; i<1000; i++){\n if (seoul[i] === 'Kim') return '김서방은 ' + i + '에 있다';\n }\n return 1;\n}","probId":"12919","createdAt":1679394094353,"lang":"JavaScript"},{"id":"8NK6j6prhKmavr0TqA-Hz","author":"ssi02014","code":"function solution(survey, choices) {\n const points = [3, 2, 1, 0, 1, 2, 3];\n const pointBoard = {\n R: 0,\n T: 0,\n C: 0,\n F: 0,\n J: 0,\n M: 0,\n A: 0,\n N: 0,\n };\n let result = \"\";\n\n // 카테고리 별 점수 추가\n for (let i = 0; i < survey.length; i++) {\n const categories = survey[i];\n\n if (choices[i] < 4) {\n pointBoard[categories[0]] += points[choices[i] - 1];\n } else if (choices[i] > 4) {\n pointBoard[categories[1]] += points[choices[i] - 1];\n }\n }\n\n const pointBoardEntries = Object.entries(pointBoard);\n\n // 지표에 맞게 결과 값 도출\n for (let i = 0; i < pointBoardEntries.length; i += 2) {\n const [curCategory, curValue] = pointBoardEntries[i];\n const [nextCategory, nextValue] = pointBoardEntries[i + 1];\n\n if (curValue < nextValue) {\n result += nextCategory;\n } else {\n result += curCategory;\n }\n }\n\n return result;\n}","probId":"118666","createdAt":1679394094353,"lang":"JavaScript"},{"id":"gdUf_Jv4tbVVoSAxLASPS","author":"codeisneverodd","code":"function solution(survey, choices) {\n const points = [-3, -2, -1, 0, 1, 2, 3];\n const types = ['RT', 'CF', 'JM', 'AN'];\n const pointBoard = types.reduce((a, key) => ({ ...a, [key]: 0 }), {});\n survey.forEach((key, i) => {\n const point = points[choices[i] - 1];\n Object.keys(pointBoard).includes(key) ? (pointBoard[key] += point) : (pointBoard[key[1] + key[0]] -= point);\n });\n return types.map(type => (pointBoard[type] <= 0 ? type[0] : type[1])).join('');\n}","probId":"118666","createdAt":1679394094353,"lang":"JavaScript"},{"id":"SNdoQ8Qv9dEeLfLK-anbF","author":"codisneverodd","code":"function solution(survey, choices) {\n const points = [-3, -2, -1, 0, 1, 2, 3];\n const types = ['RT', 'CF', 'JM', 'AN'];\n const pointBoard = survey.reduce((a, key, i) => {\n if (types.includes(key)) {\n a[key] = (a[key] || 0) + points[choices[i] - 1];\n return a;\n }\n const rKey = key[1] + key[0];\n a[rKey] = (a[rKey] || 0) - points[choices[i] - 1];\n return a;\n }, {});\n return types.map(type => (pointBoard[type] <= 0 || !pointBoard[type] ? type[0] : type[1])).join('');\n}","probId":"118666","createdAt":1679394094353,"lang":"JavaScript"},{"id":"XyOCnoh_VlUDGSpg85iyg","author":"codeisneverodd","code":"function solution(nums) {\n let answer = 0;\n const length = nums.length;\n for (let i = 0; i < length; i++) {\n for (let j = i + 1; j < length; j++) {\n for (let k = j + 1; k < length; k++) {\n const sum = nums[i] + nums[j] + nums[k];\n if (isPrime(sum)) answer += 1;\n }\n }\n }\n\n return answer;\n}\n\nfunction isPrime(num) {\n for (let i = 2; i <= Math.sqrt(num); i++) {\n if (num % i === 0) return false;\n }\n return num >= 2;\n}","probId":"12977","createdAt":1679394094353,"lang":"JavaScript"},{"id":"0Y_IqC7PEiVWAJcr2duZH","author":"jaewon1676","code":"// https://programmers.co.kr/learn/courses/30/lessons/12977?language=javascript\n\nfunction solution(nums) {\n let len = nums.length, answer = 0;\n\n for (let i = 0; i < len - 2; i++) {\n for (let j = i + 1; j < len - 1; j++) {\n for (let k = j + 1; k < len; k++) {\n if (isPrime(nums[i] + nums[j] + nums[k])) {\n answer++;\n }\n }\n }\n }\n return answer;\n}\n\nconst isPrime = (n) => {\n for (let i = 2; i <= Math.sqrt(n); i++) { //n의 제곱근까지 순회\n if (n % i === 0) { // 나머지가 0이 나오면 소수가 아니다.\n return false;\n }\n }\n return true;\n}\n// 세개의 수를 더해야 하기때문에 수 for문 하나당 수 하나를 넣어서 순회하였다.","probId":"12977","createdAt":1679394094353,"lang":"JavaScript"},{"id":"AZXA7k-ElkZZLut4wG3KN","author":"chaerin-dev","code":"// arr배열에서 selectNumber개의 요소를 뽑는 모든 경우를 배열로 반환하는 함수\nconst getCombinations = function (arr, selectNumber) {\n const results = [];\n if (selectNumber === 1) return arr.map((el) => [el]);\n arr.forEach((fixed, index, origin) => {\n const rest = origin.slice(index + 1);\n const combinations = getCombinations(rest, selectNumber - 1);\n const attached = combinations.map((el) => [fixed, ...el]);\n results.push(...attached);\n });\n return results;\n};\n\n// num이 소수인지 여부를 반환하는 함수\nfunction isPrime(num) {\n if (num === 1) return false;\n for (let i = 2; i <= Math.sqrt(num); i++) {\n if (num % i === 0) return false;\n }\n return true;\n}\n\nfunction solution(nums) {\n const combinationResult = getCombinations(nums, 3);\n let answer = 0;\n combinationResult.forEach((e) => {\n const sum = e[0] + e[1] + e[2];\n if (isPrime(sum)) answer++;\n });\n return answer;\n}","probId":"12977","createdAt":1679394094353,"lang":"JavaScript"},{"id":"WdPutYJKYWwobpw3iHgTs","author":"codeisneverodd","code":"function solution(numbers) {\n let answer = 0;\n const numArr = numbers.split(\"\");\n const permutationAll = [];\n for (let r = 1; r <= numbers.length; r++) {\n const permutationR = Permutation(numArr, r).map((arr) =>\n parseInt(arr.join(\"\"))\n );\n for (let i = 0; i < permutationR.length; i++)\n permutationAll.push(permutationR[i]);\n }\n const permutationSet = [...new Set(permutationAll)];\n for (const number of permutationSet) {\n if (isPrime(number)) answer += 1;\n }\n return answer;\n}\n\nfunction Permutation(arr, r) {\n const result = [];\n if (r === 1) return arr.map((num) => [num]);\n arr.forEach((fixed, index, org) => {\n const rest = [...org.slice(0, index), ...org.slice(index + 1)];\n const permutation = Permutation(rest, r - 1);\n const attached = permutation.map((numbers) => [fixed, ...numbers]);\n result.push(...attached);\n });\n return result;\n}\n\nfunction isPrime(num) {\n for (let i = 2; i <= Math.sqrt(num); i++) {\n if (num % i === 0) return false;\n }\n return num >= 2;\n}","probId":"42839","createdAt":1679394094353,"lang":"JavaScript"},{"id":"OLNhvIEzDa8VDxOEZYrAe","author":"chaerin-dev","code":"// 소수인지 판별하는 함수\nfunction isPrime(x) {\n for (let i = 2; i <= Math.sqrt(x); i++) {\n if (x % i === 0) return false;\n }\n return true;\n}\nfunction solution(n) {\n // 소수의 개수를 저장할 변수\n let answer = 0;\n // 1은 소수가 아니므로 2부터 n까지 모든 수에 대해\n for (let i = 2; i <= n; i++) {\n // 소수이면 소수의 개수에 1 추가\n if (isPrime(i)) answer++;\n }\n return answer;\n}","probId":"42839","createdAt":1679394094353,"lang":"JavaScript"},{"id":"GjmTbgvxQwThs5ZSSlu57","author":"prove-ability","code":"// 소수 판별 로직\nfunction isPrime(n) {\n // n 제곱근 후 올림\n for (let i = 2, len = Math.ceil(Math.sqrt(n)); i <= len; i++) {\n if (n % i === 0) return false;\n }\n return true;\n}\n\nfunction solution(n) {\n let count = 0;\n // 1부터 n까지 반복적으로 접근 - i\n for(let i = 1; i <= n; i++) {\n // i 가 소수인지 확인 후 count++\n if(isPrime(i)) count++;\n }\n \n return count;\n}","probId":"42839","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Q1xifF9kpxsX8VQ9MO2tf","author":"jaewon1676","code":"function solution(n) {\n let arr = [];\n \n // 0과 1을 제외한 2부터 n까지 배열에 담아줍니다.\n for(let i=2; i<=n; i++) {\n arr[i] = i;\n }\n for(let i=2; i<=n; i++) { // 인덱스 2부터 반복문 돌면서 0이면 다시 다음 반복문을 돕니다.\n if (arr[i] === 0) continue;\n \n for(let j=i*2; j<=n; j+=i) { // 각 인덱스(i)의 배수들을 0으로 지정해줍니다.\n arr[j] = 0;\n }\n }\n \n // filter를 이용해 0이아닌 수들의 개수를 return합니다.\n return arr.filter(v => v!==0).length;\n}","probId":"42839","createdAt":1679394094353,"lang":"JavaScript"},{"id":"QOF52m3MtLWnpsPMNKXFq","author":"codeisneverodd","code":"function solution(n) {\n let answer = '';\n for (let i = 0; i < n; i++) {\n answer += i % 2 === 0 ? '수' : '박';\n }\n return answer;\n}","probId":"12922","createdAt":1679394094353,"lang":"JavaScript"},{"id":"xOlxwtmGiP8gpAtX9Pmib","author":"chaerin-dev","code":"function solution(n) {\n // \"수박\"을 n번 반복한 문자열의 0번 인덱스부터 n만큼 추출해서 반환\n return '수박'.repeat(n).substr(0, n);\n}","probId":"12922","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9vmmj9sEOyC5yP6s7Zlmy","author":"jaewon1676","code":"function solution(n) {\n let str = '';\n for (let i = 0; i < n; i++) {\n // 삼항 연산자와 +로 문자열을 붙여주어 추가.\n i % 2 == 0 ? (str = str + '수') : (str = str + '박');\n }\n return str;\n}","probId":"12922","createdAt":1679394094353,"lang":"JavaScript"},{"id":"A09IQBDRCEQUKyJ8CzA5B","author":"prove-ability","code":"function solution(n) {\n let answer = '';\n answer = '수박'.repeat(n / 2);\n if (n % 2 !== 0) answer += '수';\n return answer;\n}","probId":"12922","createdAt":1679394094353,"lang":"JavaScript"},{"id":"LoyVegy_UkD2gDWIgfKpp","author":"yongchanson","code":"function solution(n) {\n return '수박'.repeat(n / 2) + '수'.repeat(n % 2);\n}","probId":"12922","createdAt":1679394094353,"lang":"JavaScript"},{"id":"BoOyjfNuDV4C8MS9ly_nQ","author":"codeisneverodd","code":"function solution(s) {\n var answer = 0;\n let answerString = s;\n const stringToNum = [\n \"zero\",\n \"one\",\n \"two\",\n \"three\",\n \"four\",\n \"five\",\n \"six\",\n \"seven\",\n \"eight\",\n \"nine\",\n ];\n for (let i = 0; i < 10; i++) {\n const regex = new RegExp(stringToNum[i], \"g\");\n answerString = answerString.replace(regex, i);\n }\n answer = Number(answerString);\n return answer;\n}","probId":"81301","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Vy5CLKCPikelKFvcoMVIR","author":"jaewon1676","code":"function solution(s) {\n let answer = 0;\n\n s = s.replace(/zero/g, 0);\n s = s.replace(/one/g, 1);\n s = s.replace(/two/g, 2);\n s = s.replace(/three/g, 3);\n s = s.replace(/four/g, 4);\n s = s.replace(/five/g, 5);\n s = s.replace(/six/g, 6);\n s = s.replace(/seven/g, 7);\n s = s.replace(/eight/g, 8);\n s = s.replace(/nine/g, 9);\n\n answer = Number(s);\n return answer;\n}","probId":"81301","createdAt":1679394094353,"lang":"JavaScript"},{"id":"5LyTD1YgWMMQWNwVetWEz","author":"chaerin-dev","code":"function solution(s) {\n s = s\n .replace(/zero/g, 0)\n .replace(/one/g, 1)\n .replace(/two/g, 2)\n .replace(/three/g, 3)\n .replace(/four/g, 4)\n .replace(/five/g, 5)\n .replace(/six/g, 6)\n .replace(/seven/g, 7)\n .replace(/eight/g, 8)\n .replace(/nine/g, 9);\n return parseInt(s);\n}","probId":"81301","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ESsEfG25v4htTMfsWv6GX","author":"yongchanson","code":"function solution(s) {\n let en = [\n \"zero\",\n \"one\",\n \"two\",\n \"three\",\n \"four\",\n \"five\",\n \"six\",\n \"seven\",\n \"eight\",\n \"nine\",\n ];\n\n for (let i = 0; i < s.length * 2; i++) {\n let p = i % en.length;\n s = s.replace(en[p], p);\n }\n return Number(s);\n}","probId":"81301","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Qz0Q4RxbD0ag_v-SZSnam","author":"ssi02014","code":"/**\n * X, Y의 길이가 굉장히 길어서 공통 숫자를 뽑아낼 때 객체를 이용해 연산 횟수 최적화\n * X, Y를 배열로 변환 후에 배열 메서드를 사용해도 되지만, for of문보다 효율성 떨어짐 \n * (테스트 케이스 11 ~ 15 100ms~200ms 차이)\n */\nfunction solution(X, Y) {\n const commons = [];\n const obj = {};\n\n for (const el of X) {\n obj[el] = (obj[el] || 0) + 1;\n }\n\n for (const el of Y) {\n if (obj[el]) {\n commons.push(el);\n obj[el]--;\n }\n }\n\n commons.sort((a, b) => b - a);\n\n if (!commons.length) return \"-1\";\n else if (commons[0] === \"0\") return \"0\";\n return commons.join(\"\");\n}","probId":"131128","createdAt":1679394094353,"lang":"JavaScript"},{"id":"BDzXjTTuWa38KvnMviYyT","author":"codeisneverodd","code":"function solution(s, n) {\n return s\n .split(\"\")\n .map((element) => {\n if (element === \" \") return \" \";\n const code = element.charCodeAt(0);\n if ((code + n > 90 && code <= 90) || code + n > 122) {\n return String.fromCharCode(code + n - 26);\n } else {\n return String.fromCharCode(code + n);\n }\n })\n .join(\"\");\n}","probId":"12926","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-oLnMXLaSmkk5goDvoMio","author":"jaewon1676","code":"function solution(s, n) {\n return s\n .split(\"\")\n .map((el) => {\n if (el == \" \") return el;\n let tmp = el.charCodeAt();\n return el.toLowerCase().charCodeAt() + n > 122\n ? String.fromCharCode(tmp + n - 26)\n : String.fromCharCode(tmp + n);\n })\n .join(\"\");\n}\n\n/* 문자열 -> 아스키코드 : s.charCodeAt()\n아스키코드 -> 문자열 : String.fromCharCode() \n풀이과정 \n1. 배열을 문자열로 쪼개서 map 메서드로 하나씩 순회한다., 문자열이 비어있으면 리턴한다.\n2. 알파벳을 통일 하기 위해 소문자 아스키코드로 변환한다. \n 대문자 아스키코드는 65가 A, 90이 Z이다.\n 소문자 아스키코드는 97이 a, 122가 z이다.\n3. 변환한 아스키코드 + n이 122이상이면 알파벳 단어 길이 25 + 알파벳 앞으로 이동 1만큼 뺴준고\n 그렇지 않으면 그대로 더한 후 해당 아스키코드의 알파벳으로 변환해준다.\n*/","probId":"12926","createdAt":1679394094353,"lang":"JavaScript"},{"id":"aAt0_J8gPPDdzILK3hinK","author":"chaerin-dev","code":"function solution(s, n) {\n let result = \"\";\n for (let i = 0; i < s.length; i++) {\n if (s[i] === \" \") result += \" \";\n else {\n let charCode = s.charCodeAt(i);\n // 원래 대문자였는데\n if (charCode <= 90) {\n charCode += n;\n // 변경 후 아스키코드값이 90보다 크다면\n if (charCode > 90) charCode -= 26;\n }\n // 원래 소문자였는데\n else {\n charCode += n;\n // 변경 후 아스키코드값이 122보다 크다면\n if (charCode > 122) charCode -= 26;\n }\n result += String.fromCharCode(charCode);\n }\n }\n return result;\n}","probId":"12926","createdAt":1679394094353,"lang":"JavaScript"},{"id":"42ZMqrfDapgsuTtfl5Cwk","author":"prove-ability","code":"function solution(s, n) {\n var answer = '';\n for(let i = 0, len = s.length; i < len; i++) {\n if(s[i] === \" \") {\n answer += \" \";\n continue;\n }\n let index = s[i].charCodeAt();\n // 65 - 90\n // 97 - 122\n if(index <= 90 && index + n > 90) index -= 26; \n else if (index + n > 122) index -= 26;\n \n answer += String.fromCharCode(index + n)\n }\n return answer;\n}","probId":"12926","createdAt":1679394094353,"lang":"JavaScript"},{"id":"_yXWsJOpZC1ik98YSVuJn","author":"jaewon1676","code":"function solution(id_list, report, k) {\n let answer = new Array(id_list.length).fill(0);\n let report_list = {}; // 신고당한 ID\n\n // key, value 형식의 report_list 객체를 만든다.\n id_list.map(user => {\n report_list[user] = []; //key = userid , value = 빈 배열을 가지는 객체\n });\n // report_list { muzi: [], frodo: [], apeach: [], neo: [] }\n\n // 유저가 신고한 ID를 report_list 객체에 넣어주기 위해 순회한다.\n report.map(user => {\n const [user_id, report_id] = user.split(' ');\n // report 값에서 띄어쓰기로 구분된 문자열을 자르고 user_id, report_id로 각각 넣어준다.\n if (!report_list[report_id].includes(user_id)) {\n report_list[report_id].push(user_id);\n // 배열에 포함하는지 여부를 확인하여 포함하지 않을때 신고자의 이름을 추가하였다.\n }\n });\n for (const key in report_list) {\n // report_list의 index 순회\n if (report_list[key].length >= k) {\n report_list[key].map(user => {\n answer[id_list.indexOf(user)] += 1;\n });\n }\n }\n return answer;\n}","probId":"92334","createdAt":1679394094353,"lang":"JavaScript"},{"id":"lhGPDTCRYBPDF1CqjNwlA","author":"prove-ability","code":"function solution(id_list, report, k) {\n // 사원 리스트 0으로 초기화 - 받은 메일 숫자 세기\n var answer = Array.from({ length: id_list.length }).fill(0);\n // 신고 내용 객체 초기화 - 신고된 내용 정리\n const reportObj = {};\n // 신고건 반복문으로 하나씩 접근\n for (let i = 0, len = report.length; i < len; i++) {\n const [userId, reportUserId] = report[i].split(' ');\n // 신고 내용 객체에 신고당한 사람이 있고 이전에 신고하지 않았다면 추가\n if (reportObj[reportUserId]) {\n if (!reportObj[reportUserId].includes(userId)) {\n reportObj[reportUserId] = [...reportObj[reportUserId], userId];\n }\n // 신고 내용 객체에 신고당한 사람이 없다면 추가\n } else reportObj[reportUserId] = [userId];\n }\n // 만들어진 신고 내용 객체로 반복적으로 접근\n for (const item of Object.values(reportObj)\n .filter(v => v.length >= k)\n .flatMap(v => v)) {\n // 인덱스로 접근해 메일 카운트 증가\n const index = id_list.findIndex(v => v === item);\n answer[index]++;\n }\n\n return answer;\n}","probId":"92334","createdAt":1679394094353,"lang":"JavaScript"},{"id":"XsnehvD59CuxJGJpkkWCv","author":"chaerin-dev","code":"function solution(id_list, report, k) {\n // 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리\n let set = new Set(report);\n report = Array.from(set);\n\n // 1. report를 2차원배열로 변형\n // 2. 각 유저가 신고당한 횟수 cnt에 저장\n // 3. 각 유저를 신고한 유저 who에 저장\n let cnt = Array.from({ length: id_list.length }, i => 0);\n let who = Array.from({ length: id_list.length }, i => []);\n for (let i = 0; i < report.length; i++) {\n report[i] = report[i].split(' ');\n cnt[id_list.indexOf(report[i][1])]++;\n who[id_list.indexOf(report[i][1])].push(report[i][0]);\n }\n\n // k회 이상 신고당한 유저 확인 및 각 유저가 받은 메일 개수 mail에 저장\n let mail = Array.from({ length: id_list.length }, i => 0);\n for (let i = 0; i < cnt.length; i++) {\n if (cnt[i] < k) continue;\n for (let j = 0; j < who[i].length; j++) {\n mail[id_list.indexOf(who[i][j])]++;\n }\n }\n return mail;\n}","probId":"92334","createdAt":1679394094353,"lang":"JavaScript"},{"id":"knELcZfUST9z1eYKpIttU","author":"codeisneverodd","code":"function solution(id_list, report, k) {\n //report를 set을 이용하여 중복제거, 각 id 당 신고당한 횟수 reportedCount에 저장,\n //각 id를 신고한 사람 array를 reportedBy에 저장,\n //k번 이상 신고당한 id를 신고한 id가 받을 메일 수를 mailCount에 저장\n //answer에 mailCount에 저장된 값을 id_list와 같은 id 순서로 저장.\n const reportSet = new Set(report);\n const reportedCount = {}; //{\"id\": Number(count)}\n const reportedBy = {}; //{\"id\":[]}\n const mailCount = {}; //{\"id\":Number(count)}\n\n id_list.forEach(element => {\n reportedCount[element] = 0;\n mailCount[element] = 0;\n reportedBy[element] = [];\n });\n\n reportSet.forEach(element => {\n const [id, reported] = element.split(' ');\n reportedCount[reported] += 1;\n reportedBy[reported].push(id);\n });\n\n for (const reportedId in reportedCount) {\n if (reportedCount[reportedId] >= k) {\n reportedBy[reportedId].forEach(reporter => {\n mailCount[reporter] += 1;\n });\n }\n }\n return id_list.map(id => mailCount[id]);\n}","probId":"92334","createdAt":1679394094353,"lang":"JavaScript"},{"id":"_SiX4wl7bHj68YYVp_Phb","author":"jaewon1676","code":"function solution(new_id) {\n // 1 소문자로 치환\n let answer = new_id\n .toLowerCase()\n\n // 2 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 문자 제거.\n .replace(/[^a-z0-9-_.]/gi, '')\n\n // 3 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환\n .replace(/[.]{2,}/gi, '.')\n\n // 4 마침표(.)가 처음이나 끝에 위치하면 제거\n .replace(/^[.]|[.]$/gi, '');\n\n // 5 빈 문자열이면 a 대입\n if (answer === '') answer = 'a';\n\n // 6 length > 15이면 그 뒤의 문자들은 제거\n if (answer.length > 15) {\n answer = answer.substring(0, 15);\n // 마침표(.)가 끝에 위치하면 마침표(.)제거\n answer = answer.replace(/[.]$/gi, '');\n }\n\n // 7 length < 3이면 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임\n while (answer.length < 3) {\n answer += answer[answer.length - 1];\n }\n return answer;\n}","probId":"72410","createdAt":1679394094353,"lang":"JavaScript"},{"id":"AMOMEz2Bz_Pt5jgvmesYA","author":"chaerin-dev","code":"function solution(new_id) {\n // 1단계: 모든 대문자를 소문자로\n new_id = new_id.toLowerCase();\n\n // 2단계: 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자 제거\n new_id = new_id.replace(/[^\\w\\-\\.]/g, '');\n\n // 3단계: 연속되는 마침표는 마침표 하나로\n new_id = new_id.replace(/\\.{2,}/g, '.');\n\n // 4단계: 처음이나 끝에 마침표가 있으면 제거\n new_id = new_id.replace(/^\\.|\\.$/, '');\n\n // 5단계: new_id가 빈 문자열이면 \"a\" 대입\n if (new_id.length === 0) new_id = 'a';\n\n // 6단계: new_id의 길이가 16자 이상이면,\n // new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거\n // 제거 후 끝에 마침표가 있으면 제거\n if (new_id.length >= 16) new_id = new_id.slice(0, 15);\n new_id = new_id.replace(/\\.$/, '');\n\n // 7단계: new_id의 길이가 2자 이하이면,\n // new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 이어붙임\n let len = new_id.length;\n if (len <= 2) new_id = new_id + new_id[len - 1].repeat(3 - len);\n\n return new_id;\n}","probId":"72410","createdAt":1679394094353,"lang":"JavaScript"},{"id":"jegWLXnzaexxLDEtxqlR-","author":"codeisneverodd","code":"function solution(new_id) {\n let answer = new_id\n .toLowerCase() //step 1\n .replace(/[^0-9a-z._-]/g, '') // step 2\n .replace(/\\.+/g, '.') //step 3\n .replace(/^\\.|\\.$/g, '') //step 4\n .replace(/^$/, 'a') //step 5\n .slice(0, 15)\n .replace(/\\.$/, ''); //step 6\n // step7\n if (answer.length === 1) answer = answer[0].repeat(3);\n if (answer.length === 2) answer = answer + answer[1];\n\n return answer;\n}","probId":"72410","createdAt":1679394094353,"lang":"JavaScript"},{"id":"VboAgE1t6rbLqLDBcavKA","author":"codeisneverodd","code":"function solution(N, stages) {\n var answer = [];\n let failRate = new Array(N + 2).fill(0);\n let playerChallenging = new Array(N + 2).fill(0);\n let playerReached = new Array(N + 2).fill(0);\n\n for (const stage of stages) {\n for (let i = 1; i <= stage; i++) playerReached[i] += 1;\n playerChallenging[stage] += 1;\n }\n for (let i = 1; i <= N + 1; i++)\n failRate[i] =\n playerReached[i] === 0 ? 0 : playerChallenging[i] / playerReached[i];\n const rateNIndex = failRate\n .slice(1, N + 1)\n .map((rate, stage) => [rate, stage + 1]);\n const sortedRate = rateNIndex.sort((a, b) => b[0] - a[0]);\n answer = sortedRate.map((stage) => stage[1]);\n return answer;\n}","probId":"42889","createdAt":1679394094353,"lang":"JavaScript"},{"id":"3u-cQ1Lt_RmNzog8GKI8O","author":"jaewon1676","code":"function solution(N, stages) {\n let map = Array.from(Array(N), () => Array(2).fill(0));\n let answer = Array(N).fill(0, 0, N); // 스테이지별 탈락자 수\n let rate = Array(N).fill(0, 0, N); // 스테이지별 실패율\n let count = 0;\n\n stages.sort(function (a, b) {\n return a - b;\n }); // 난이도 오름차순 정렬\n for (let i = 1; i <= N; i++) {\n while (1) {\n // i 스테이지의 실패율 계산\n if (stages[0] == i) {\n answer[i - 1] += 1;\n count += 1;\n stages.shift();\n } else break;\n }\n rate[i - 1] += answer[i - 1] / (stages.length + count); // 실패율 계산\n\n count = 0;\n\n map[i - 1][0] = i;\n map[i - 1][1] = rate[i - 1];\n }\n map.sort((a, b) => b[1] - a[1]); // value값(실패율) 기준 내림차순정렬\n let stack = []; // 답\n for (let i = 0; i < map.length; i++) {\n stack.push(map[i][0]);\n }\n\n return stack;\n}\n\n/* 풀이 과정\n1. 스테이지를 정렬 후 난이도 N과 같은 스테이지가 맨 앞에 있는지 찾아 찾으면 shift, 찾지 못하면 다음 난이도로 넘어간다.\n2. 실패율을 계산해주기 위해, 스테이지별 탈락자 수,스테이지별 실패율 배열을 생성하여 각각, 계산해준다.\n3. 계산 해준 값들을 2차원 배열 map 객체에 넣어준다. 2차원으로 한 이유는 index값과, 실패율 값을 같이 넣어 정렬 시에도 index값을 유지 하기 위해서.\n4. 실패율을 내림차순(같으면 스테이지가 낮은거부터 오름차순)으로 정렬하여 출력해준다.\n*/","probId":"42889","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Av6X7HBEZTken-98C8aB2","author":"codeisneverodd","code":"function solution(left, right) {\n var answer = 0;\n for (let num = left; num <= right; num++) {\n divisorCounter(num) % 2 === 0 ? (answer += num) : (answer -= num);\n }\n return answer;\n}\n\nconst divisorCounter = (num) => {\n let count = 0;\n const sqrt = Math.sqrt(num);\n for (let i = 1; i <= sqrt; i++) if (num % i === 0) count += 1;\n return Number.isInteger(sqrt) ? (count - 1) * 2 + 1 : count * 2;\n};","probId":"77884","createdAt":1679394094353,"lang":"JavaScript"},{"id":"GI7q65ilfJZ8ur-KW253Z","author":"jaewon1676","code":"function solution(left, right) {\n var answer = 0;\n\n for (left; left <= right; left++) {\n // left의 제곱근이 정수면 약수의 개수는 홀수\n if (Number.isInteger(Math.sqrt(left))) {\n answer -= left;\n } else {\n answer += left;\n }\n }\n return answer;\n}","probId":"77884","createdAt":1679394094353,"lang":"JavaScript"},{"id":"WuWuhvRMVKJvMcnEbwQ8_","author":"prove-bility","code":"function getDivisorCount(i) {\n let count = 0;\n for(let j = 1; j <= i; j++) {\n if(i % j === 0) count++;\n }\n return count;\n}\n\nfunction solution(left, right) {\n let answer = 0;\n for(let i = left; i <= right; i++) {\n let count = getDivisorCount(i);\n if(count % 2 === 0) answer += i;\n else answer -= i;\n }\n return answer;\n}","probId":"77884","createdAt":1679394094353,"lang":"JavaScript"},{"id":"yObJuA3KwklreVRYLDiiu","author":"codeisneverodd","code":"function solution(n) {\n let answer = 0;\n for (let divisor = 1; divisor <= n; divisor++) {\n if (n % divisor === 0) answer += divisor;\n }\n return answer;\n}","probId":"12928","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9z7gNX26mVynww375frEd","author":"yongchanson","code":"function solution(n) {\n var answer = 0;\n let i;\n for (i = 1; i <= Math.sqrt(n); i++) {\n if (n % i == 0) {\n if (i * i == n) {\n //i의 제곱이 n인경우 처리\n answer += i;\n } else {\n answer += i;\n answer += n / i;\n }\n }\n }\n\n return answer;\n}","probId":"12928","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Kb-Ud8hRFj3VntSJaRD_k","author":"chaerin-dev","code":"function solution(n) {\n let result = 0;\n let sqrtN = Math.sqrt(n);\n // 효율성을 위해 1부터 n의 제곱근-1까지만 순회\n for (let i = 1; i < sqrtN; i++) {\n if (n % i === 0) result += i + n / i;\n }\n // n의 제곱근이 정수인 경우 n의 제곱근도 더해줌\n if (Number.isInteger(sqrtN)) result += sqrtN;\n return result;\n}","probId":"12928","createdAt":1679394094353,"lang":"JavaScript"},{"id":"2hHCkl2LHLmbNCTMwzQvw","author":"jaewon1676","code":"function solution(n) {\n var answer = 0;\n for (let i = 1; i <= n; i++) {\n if (n % i == 0) {\n // n으로 i를 나눴을 때, 나머지가 0이면 약수이다.\n answer += i;\n }\n }\n return answer;\n}\n\n// 약수란 어떤 수를 나누었을 때 나머지 없이 나누어 떨어지게 하는 그 수입니다.\n// 10을 예로 들면, 10은 1, 2, 5, 10 이 나누었을 때 나머지가 없으므로 약수입니다.\n// 3, 4, 6, 7, 8, 9 는 나누었을 때 나머지가 남기때문에 약수가 아닙니다.","probId":"12928","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Wzs2YemubD5fFV8975Cl3","author":"prove-ability","code":"function solution(n) {\n let answer = 0;\n for(let i = 1; i <= n; i++) {\n if(n % i === 0) answer += i;\n }\n return answer;\n}","probId":"12928","createdAt":1679394094353,"lang":"JavaScript"},{"id":"qQLomQYYyEENnJPItTH7h","author":"codeisneverodd","code":"function solution(numbers) {\n var answer = 0;\n for (let i = 0; i < 10; i++) {\n answer += numbers.includes(i) ? 0 : i;\n }\n return answer;\n}","probId":"86051","createdAt":1679394094353,"lang":"JavaScript"},{"id":"abMRRy_N5Od0L1J1Fk2cH","author":"yongchanson","code":"function solution(numbers) {\n var answer = -1;\n\n let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n let arr_sum = 0;\n let numbers_sum = 0;\n\n for (i = 0; i < arr.length / 2; i++) {\n if (arr[i] == arr[arr.length - 1 - i]) {\n arr_sum += arr[i];\n } else {\n arr_sum += arr[i] + arr[arr.length - 1 - i];\n }\n }\n\n for (i = 0; i < numbers.length; i++) {\n numbers_sum += numbers[i];\n }\n\n answer = arr_sum - numbers_sum;\n return answer;\n}","probId":"86051","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7PooMLPnF3FELewxRVqp9","author":"prove-ability","code":"function solution(numbers) {\n var answer = 0;\n\n for (let i = 0; i < 10; i++) {\n if (!numbers.includes(i)) answer += i;\n }\n\n return answer;\n}","probId":"86051","createdAt":1679394094353,"lang":"JavaScript"},{"id":"yMhu_QGJsXeqlaCo1qG5K","author":"chaerin-dev","code":"function solution(numbers) {\n let answer = 0;\n for (let i = 0; i <= 9; i++) {\n if (!numbers.includes(i)) answer += i;\n }\n return answer;\n}","probId":"86051","createdAt":1679394094353,"lang":"JavaScript"},{"id":"lVSmCdDTM8cUCindwlS8g","author":"codeisneverodd","code":"function solution(d, budget) {\n let answer = 0;\n d.sort((a, b) => a - b);\n for (const department of d) {\n if (budget < department) break;\n answer += 1;\n budget -= department;\n }\n return answer;\n}","probId":"12982","createdAt":1679394094353,"lang":"JavaScript"},{"id":"qXusM8NX60lzwocrZm8pZ","author":"prove-ability","code":"function solution(d, budget) {\n let sum = 0;\n let count = 0;\n // 오름차순 정렬\n d.sort((a, b) => a - b);\n for(let i = 0, len = d.length; i < len; i++) {\n // 작은 수 부터 하나씩 더해준다\n sum += d[i];\n // 더한 수가 정해진 예산과 같다면 이전까지 센 카운트 반환\n if(sum > budget) return count;\n count++;\n }\n \n return count;\n}","probId":"12982","createdAt":1679394094353,"lang":"JavaScript"},{"id":"wGoMl70jO-ZfwphOxu9il","author":"jaewon1676","code":"function solution(d, budget) {\n let count = 0; // 최대 물품 지원 할 수 있는 부서 수 \n d.sort((a, b) => a - b) // 오름차순 정렬\n for (let i=0; i (v === participant[i] ? a + 1 : a),\n 0\n );\n // 해당 값이 참가자 그룹 내 2명 이상이고 이전 최대 동명이인 참가자보다 많다면\n // 해당 로직을 반복하면 제일 많은 동명이인을 알 수 있다\n if (count > 1 && max < count) {\n answer = participant[i];\n // 조건에 맞는 동명이인 수 저장\n max = count;\n }\n }\n return answer;\n}\n\n//완벽한 정답이 아닙니다.","probId":"42576","createdAt":1679394094353,"lang":"JavaScript"},{"id":"iYWX53fSR9dGhM_f2iKhP","author":"chaerin-dev","code":"function solution(participant, completion) {\n var answer = \"\";\n // 두 배열을 정렬한다!\n participant.sort();\n completion.sort();\n // 앞에서부터 차례로 비교하다가 값이 다를 때 participant의 요소가 완주하지 못한 선수!!\n // if (participant[i] != completion[i] || i == participant.length - 1) 이런 식으로\n // 완주하지 못한 선수의 이름이 마지막에 있을 경우도 고려해야 하나..? 라고 생각했지만\n // 그 때는 completion[i]의 값이 undefined가 되므로 괜찮음!\n for (let i = 0; i < participant.length; i++) {\n if (participant[i] != completion[i]) {\n answer = participant[i];\n break;\n }\n }\n return answer;\n}","probId":"42576","createdAt":1679394094353,"lang":"JavaScript"},{"id":"mK5dnWttxK4bzZaDoen7x","author":"codeisneverodd","code":"function solution(absolutes, signs) {\n return absolutes.reduce(\n (acc, curr, i) => acc + curr * (signs[i] ? 1 : -1),\n 0\n );\n}","probId":"76501","createdAt":1679394094353,"lang":"JavaScript"},{"id":"oafF4T4y5vl4OcYBuzMlM","author":"codeisneverod","code":"function solution(absolutes, signs) {\n var answer = 0;\n for (let i = 0; i < absolutes.length; i++) {\n answer += signs[i] ? absolutes[i] : -1 * absolutes[i];\n }\n return answer;\n}","probId":"76501","createdAt":1679394094353,"lang":"JavaScript"},{"id":"PHxsJEC41hkuqLR9jZfLB","author":"jaewon1676","code":"function solution(absolutes, signs) {\n var answer = 0;\n for (var i = 0; i < absolutes.length; i++) {\n if (signs[i] === false) {\n answer = answer - absolutes[i];\n } else {\n answer = answer + absolutes[i];\n }\n }\n\n return answer;\n}","probId":"76501","createdAt":1679394094353,"lang":"JavaScript"},{"id":"VavYZ0Yo3L_kfJjz4Imum","author":"prove-ability","code":"function solution(absolutes, signs) {\n let answer = 0;\n absolutes.forEach((absolute, i) => {\n if(!signs[i]) absolute *= -1;\n answer += absolute;\n })\n return answer;\n}","probId":"76501","createdAt":1679394094353,"lang":"JavaScript"},{"id":"xoDbdrm9SYhSQjb_f4FPY","author":"chaerin-dev","code":"function solution(absolutes, signs) {\n // 연산 결과를 저장할 변수\n let result = 0;\n // signs의 각 요소에 대해\n signs.forEach((e, i) => {\n // 요소가 true이면 result값에 같은 인덱스의 absolutes 요소를 더해줌\n if (e) result += absolutes[i];\n // 요소가 false이면 result값에 같은 인덱스의 absolutes 요소를 빼줌\n else result -= absolutes[i];\n });\n // result 반환\n return result;\n}","probId":"76501","createdAt":1679394094353,"lang":"JavaScript"},{"id":"klP9xJHjOoo88wPJGPL_U","author":"codeisneverodd","code":"function solution(s) {\n return s\n .split(\" \")\n .map((word) =>\n word\n .split(\"\")\n .map((char, index) =>\n index % 2 === 0\n ? word[index].toUpperCase()\n : word[index].toLowerCase()\n )\n .join(\"\")\n )\n .join(\" \");\n}","probId":"12930","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ghWDHDJDoQyhuF6qDhi7i","author":"chaerin-dev","code":"// 원래 문자가 모두 소문자여야 할 이유는 없다는 사실, 공백이 하나 이상일 수 있다는 사실을 빠뜨려서 조금 오래 생각한 문제..!\nfunction solution(s) {\n let result = \"\";\n let flag = true;\n for (let i = 0; i < s.length; i++) {\n if (s[i] === \" \") {\n flag = false;\n result += s[i];\n } else if (flag) {\n result += s[i].toUpperCase();\n } else {\n result += s[i].toLowerCase();\n }\n flag = !flag;\n }\n return result;\n}","probId":"12930","createdAt":1679394094353,"lang":"JavaScript"},{"id":"l3wUBAT9KqGlEv-l3000E","author":"jaewon1676","code":"function solution(s) {\n return s\n .split(\" \")\n .map((el) =>\n el\n .split(\"\")\n .map((el, index) =>\n index % 2 == 0 ? el.toUpperCase() : el.toLowerCase()\n )\n .join(\"\")\n )\n .join(\" \");\n}\n\n/* s.split(' ') // 띄어쓰기를 기준으로 나눕니다. [ 'try', 'hello', 'world' ]\n \n.map(el => el.split('')) 나눈것을 기준으로 요소 하나 하나씩 나눠줍니다 \n[[ 't', 'r', 'y' ], [ 'h', 'e', 'l', 'l', 'o' ], [ 'w', 'o', 'r', 'l', 'd' ]]\n \n.map((el, index) => index % 2 == 0 ? el.toUpperCase() : el.toLowerCase())\n//map에서 첫번째는 앞에서 가져온 요소, 두번째는 index를 반환 합니다!\n//map의 index를 기준으로 짝수인지 홀수인지 판별하여 대문자, 소문자로 변환 해줍니다.\n[[ 'T', 'r', 'Y' ], [ 'H', 'e', 'L', 'l', 'O' ], [ 'W', 'o', 'R', 'l', 'D' ]]\n \n.join('') 작은 배열들을 합쳐줍니다.\n['TrY', 'HeLlO', 'WoRlD']\n \n.join(' ') 큰 배열들을 합쳐줍니다.\n\"TrY HeLlO WoRlD\"\n\n대, 소문자 변환, split, reverse, join, map 등등을 활용 해야 하므로 \n문자열을 연습하는데 좋은 문제입니다.\n*/","probId":"12930","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7pKivSXqs3zO0lOkISP4s","author":"prove-ability","code":"function solution(s) {\n let answer = '';\n s.split(\" \").forEach((word) => {\n for(let i = 0, len = word.length; i < len; i++) {\n if(i % 2 === 0) answer+=word[i].toUpperCase();\n else answer+=word[i].toLowerCase();\n }\n answer += \" \";\n })\n answer = answer.slice(0, answer.length - 1)\n return answer;\n}","probId":"12930","createdAt":1679394094353,"lang":"JavaScript"},{"id":"KsHkHFSHZ5_q5H0lT4TCm","author":"codeisneverodd","code":"function solution(n) {\n return n\n .toString()\n .split(\"\")\n .map((x) => parseInt(x))\n .reduce((acc, curr) => acc + curr, 0);\n}","probId":"12931","createdAt":1679394094353,"lang":"JavaScript"},{"id":"rcCmcnK9rWAurCQbV9EBf","author":"chaerin-dev","code":"function solution(n) {\n let result = 0;\n while (n > 0) {\n result += n % 10;\n n = Math.floor(n / 10);\n }\n return result;\n}","probId":"12931","createdAt":1679394094353,"lang":"JavaScript"},{"id":"OMq9nGAGm11PY-z4EsQ4s","author":"prove-ability","code":"function solution(n) {\n var answer = 0;\n n.toString()\n .split(\"\")\n .forEach((v) => {\n answer += parseInt(v);\n });\n return answer;\n}","probId":"12931","createdAt":1679394094353,"lang":"JavaScript"},{"id":"lsVTnwM-8e4pB_oCBzF0q","author":"codeisneverodd","code":"function solution(n) {\n return n\n .toString()\n .split(\"\")\n .reverse()\n .map((x) => parseInt(x));\n}","probId":"12932","createdAt":1679394094353,"lang":"JavaScript"},{"id":"8RRpcAtRB1unJ874JhZuI","author":"chaerin-dev","code":"function solution(n) {\n // 숫자 -> 문자열 -> 배열 -> 뒤집기 -> 모든 원소에 대해 자연수로 형 변환\n return String(n)\n .split(\"\")\n .reverse()\n .map((item) => parseInt(item));\n}","probId":"12932","createdAt":1679394094353,"lang":"JavaScript"},{"id":"U6O8TExlKPNEPgeSKe6g9","author":"jaewon1676","code":"function solution(n) {\n return (n = n\n .toString()\n .split(\"\")\n .reverse()\n .map((o) => (o = parseInt(o))));\n}","probId":"12932","createdAt":1679394094353,"lang":"JavaScript"},{"id":"LUf4Zhl2TFK5I7HJzrOH8","author":"prove-ability","code":"function solution(n) {\n // 1. 문자열 변환\n // 2. 배열로 변환\n // 3. 배열 반전\n // 4. 정수로 변환\n return n\n .toString()\n .split(\"\")\n .reverse()\n .map((v) => parseInt(v));\n}","probId":"12932","createdAt":1679394094353,"lang":"JavaScript"},{"id":"DeTwAbPzJQTYHfFSYeyQo","author":"yongchanson","code":"function solution(n) {\n let answer = [];\n let string = n.toString();\n for (let i = string.length - 1; i >= 0; i--) {\n let slice = string.substr(i, 1) * 1;\n answer.push(slice);\n }\n return answer;\n}","probId":"12932","createdAt":1679394094353,"lang":"JavaScript"},{"id":"AaKhktbCwYIvuLdqtVkNd","author":"codeisneverodd","code":"function solution(n) {\n return parseInt(\n n\n .toString()\n .split(\"\")\n .sort((a, b) => b - a)\n .join(\"\")\n );\n}","probId":"12933","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Dv63J0O2GNbleNOxMz2Xt","author":"chaerin-dev","code":"function solution(n) {\n // 정수 -> 문자열 -> 배열\n let arrN = String(n).split(\"\");\n // 배열 내림차순 정렬\n arrN.sort((a, b) => b - a);\n // 배열 -> 문자열 -> 정수\n return parseInt(arrN.join(\"\"));\n}","probId":"12933","createdAt":1679394094353,"lang":"JavaScript"},{"id":"qfpLTD851pQJuKNfQzp2t","author":"prove-ability","code":"function solution(n) {\n return parseInt(n.toString().split(\"\").sort((a, b) => b - a).join(\"\"), 10);\n}","probId":"12933","createdAt":1679394094353,"lang":"JavaScript"},{"id":"6QJtzbbAPWi0dYskBUOY5","author":"codeisneverodd","code":"function solution(n) {\n return Number.isInteger(Math.sqrt(n)) ? (Math.sqrt(n) + 1) ** 2 : -1;\n}","probId":"12934","createdAt":1679394094353,"lang":"JavaScript"},{"id":"60u_rYRNkIfmgaN_kHfcK","author":"chaerin-dev","code":"function solution(n) {\n // n의 제곱근값을 x에 저장\n let x = Math.sqrt(n);\n // x가 정수이면 x+1의 제곱 반환, x가 정수가 아니면 -1 반환\n return Number.isInteger(x) ? Math.pow(x + 1, 2) : -1;\n}","probId":"12934","createdAt":1679394094353,"lang":"JavaScript"},{"id":"xcml0sXpJFts_rH6YPv9T","author":"prove-ability","code":"function solution(n) {\n // n의 제곱근을 x 초기화\n const x = Math.sqrt(n);\n // 양의 정수라면 x + 1 제곱 반환\n if(Number.isInteger(x)) return Math.pow(x + 1, 2)\n // 아니라면 -1 반환\n return -1;\n}","probId":"12934","createdAt":1679394094353,"lang":"JavaScript"},{"id":"RW2uCQ6hMfNMAoXTJZkEB","author":"jaewon1676","code":"function solution(n) {\n let s = parseInt(Math.sqrt(n)) // n의 제곱근을 확인\n if (s ** 2 === n) return ((s+1) ** 2)\n \n return -1;\n}","probId":"12934","createdAt":1679394094353,"lang":"JavaScript"},{"id":"LdOofECKfNCcPD_77jFrO","author":"yongchanson","code":"function solution(n) {\n const sqrt = Math.sqrt(n);\n //sqrt % 1 == 0 이면 양의정수, -0이면 음의정수\n return sqrt % 1 == 0 ? (sqrt + 1) ** 2 : -1;\n}","probId":"12934","createdAt":1679394094353,"lang":"JavaScript"},{"id":"B9slrixZJciwmd952NdVz","author":"codeisneverodd","code":"function solution(arr) {\n const index = arr.indexOf(Math.min(...arr));\n arr.splice(index, 1);\n return arr.length === 0 ? [-1] : arr;\n}","probId":"12935","createdAt":1679394094353,"lang":"JavaScript"},{"id":"LoSHgCe7ylxHusDVr2-zX","author":"jaewon1676","code":"function solution(arr) {\n arr.splice(arr.indexOf(Math.min(...arr)), 1);\n if (arr.length < 1) return [-1];\n return arr;\n}\n\n/* 풀이과정 arr [4,3,2,1] 일경우\nMath.min(...arr)은 1\narr.indexOf(1), 1이 있는 index가 3이므로 3 반환.\narr.splice(3, 1) arr의 3번째 index만 제거 해준다.\narr의 크기가 1보다 작으면 -1, 그렇지 않으면 그대로 반환. */","probId":"12935","createdAt":1679394094353,"lang":"JavaScript"},{"id":"iaE7QvR9yOJqvB5MoSqiw","author":"chaerin-dev","code":"function solution(arr) {\n // arr에서 가장 최솟값의 위치를 찾아 해당 위치의 값을 삭제\n arr.splice(arr.indexOf(Math.min(...arr)), 1);\n // arr가 빈 배열이 아니면 arr를 반환, arr가 빈 배열이면 [-1]반환\n return arr.length ? arr : [-1];\n}","probId":"12935","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Fo72LEa6RrJ9yvfb4xd_j","author":"prove-ability","code":"function solution(arr) {\n // 최솟값 찾기\n const min = Math.min(...arr);\n // arr 중 min 과 같은 요소의 인덱스 제거\n arr.splice(\n arr.findIndex((num) => num === min),\n 1\n );\n // 만약 arr 가 비어있다면 [-1] 반환\n if (arr.length === 0) return [-1];\n return arr;\n}","probId":"12935","createdAt":1679394094353,"lang":"JavaScript"},{"id":"LjNarjFhD8SKHsKs3UTF2","author":"chaerin-dev","code":"process.stdin.setEncoding(\"utf8\");\nprocess.stdin.on(\"data\", (data) => {\n const n = data.split(\" \");\n const a = Number(n[0]),\n b = Number(n[1]);\n // 정답을 저장할 문자열 answer\n answer = \"\";\n // 세로 길이만큼 아래의 과정(가로 길이만큼 별 더해주고 줄 바꾸기) 반복\n for (let i = 0; i < b; i++) {\n // 가로 길이만큼 문자열에 별 더해주기\n for (let j = 0; j < a; j++) answer += \"*\";\n // 가로 길이만큼 별을 다 더해줬으면 줄 바꾸기\n answer += \"\\n\";\n }\n // 정답 출력\n console.log(answer);\n});","probId":"12969","createdAt":1679394094353,"lang":"JavaScript"},{"id":"6EejGKp__RPMVZw1Jg5Lh","author":"prove-ability","code":"process.stdin.setEncoding('utf8');\nprocess.stdin.on('data', data => {\n const nums = data.split(\" \");\n const n = Number(nums[0]), m = Number(nums[1]);\n \n let result = \"\";\n // 2차원으로 접근\n // 세로 길이만큼 반복\n for(let i = 0; i < m; i++) {\n // 가로 길이만큼 별 더하기\n for(let j = 0; j < n; j++) {\n result += \"*\";\n }\n // 가로가 끝나면 줄내림\n result += \"\\n\";\n }\n console.log(result)\n});","probId":"12969","createdAt":1679394094353,"lang":"JavaScript"},{"id":"24VCY_CYJhFP96mVIvqwh","author":"yongchanson","code":"process.stdin.setEncoding(\"utf8\");\nprocess.stdin.on(\"data\", (data) => {\n const n = data.split(\" \");\n const a = Number(n[0]),\n b = Number(n[1]);\n console.log((\"*\".repeat(a) + `\\n`).repeat(b));\n});\n/*\n<풀이과정>\nrepeat() 메서드는 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환한다. ex) str.repeat(count);\n'*'.repeat(a) : *를 a만큼 반복한다.\n*/","probId":"12969","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Wv-MBFA5NHmUW8uTwXrei","author":"codeisneverodd","code":"function solution(num) {\n return num % 2 === 0 ? \"Even\" : \"Odd\";\n}","probId":"12937","createdAt":1679394094353,"lang":"JavaScript"},{"id":"27S6lHdgIBoq9T6OqNMSt","author":"chaerin-dev","code":"function solution(num) {\n return num % 2 == 0 ? \"Even\" : \"Odd\";\n}","probId":"12937","createdAt":1679394094353,"lang":"JavaScript"},{"id":"iP9qldlsLGaQ6zSbDN0f5","author":"jaewon1676","code":"function solution(num) {\n let answer;\n num % 2 == 0 ? (answer = \"Even\") : (answer = \"Odd\");\n // 삼항 연산자를 사용하여 참일경우 Even, 거짓일 경우 Odd를 반환.\n return answer;\n}","probId":"12937","createdAt":1679394094353,"lang":"JavaScript"},{"id":"U726lfDR_pckQ93HTvQTL","author":"prove-ability","code":"function solution(num) {\n return num % 2 === 0 ? \"Even\" : \"Odd\";\n}","probId":"12937","createdAt":1679394094353,"lang":"JavaScript"},{"id":"NCUk0-GHkrAvIwcvfBjRX","author":"yongchanson","code":"function solution(num) {\n return num % 2 ? \"Odd\" : \"Even\";\n}","probId":"12937","createdAt":1679394094353,"lang":"JavaScript"},{"id":"A-7EsySAVrBLbzbRxj41q","author":"codeisneverodd","code":"function solution(n, lost, reserve) {\n let answer = 0;\n let studentClothes = new Array(n + 2).fill(1);\n for (const student of reserve) studentClothes[student] += 1;\n for (const student of lost) studentClothes[student] -= 1;\n for (let i = 1; i < n + 1; i++) {\n if (studentClothes[i] === 0) {\n if (studentClothes[i - 1] === 2 || studentClothes[i + 1] === 2) {\n if (studentClothes[i - 1] === 2) {\n studentClothes[i - 1] -= 1;\n studentClothes[i] += 1;\n } else {\n studentClothes[i + 1] -= 1;\n studentClothes[i] += 1;\n }\n }\n }\n }\n for (const student of studentClothes) {\n answer += student > 0 ? 1 : 0;\n }\n answer -= 2;\n return answer;\n}","probId":"42862","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Jp_bARhodqdiX76BskYEU","author":"prove-ability","code":"function solution(n, lost, reserve) {\n // students 초기화 - 학생들은 체육복 개수 1로 초기화\n let students = Array.from({ length: n }).fill(1);\n\n // 읽어버린 학생 개수 반영\n lost.forEach((target) => {\n students[target - 1]--;\n });\n\n // 여별 체육복 개수 반영\n reserve.forEach((target) => {\n students[target - 1]++;\n });\n\n // 학생들 순차적으로 접근\n for (let i = 0, len = students.length; i < len; i++) {\n // 체육복 0 | 1 을 가진 학생들을 대여 불가능이기 때문에 continue\n if (students[i] === 0 || students[i] === 1) continue;\n // 이전 번호의 학생이 있고 그 학생이 0개의 체육복을 가졌다면\n if (i !== 0 && students[i - 1] === 0) {\n // 이전 학생 증가\n students[i - 1]++;\n // 자신은 대여해줬으니 감소\n students[i]--;\n }\n // 인덱스 학생이 1개 초과한 체육을 가지고 다음 번호의 학생이 있고 그 학생이 0개의 체육복을 가졌다면\n if (students[i] > 1 && i + 1 !== len && students[i + 1] === 0) {\n // 다음 학생 증가\n students[i + 1]++;\n // 자신은 대여해줬으니 감소\n students[i]--;\n }\n }\n // 체육복 1개 이상을 가진 학생들의 수 반환\n return students.filter((v) => v >= 1).length;\n}","probId":"42862","createdAt":1679394094353,"lang":"JavaScript"},{"id":"rBOyp_uZuvqujFMkrXKh8","author":"jaewon1676","code":"function solution(n, lost, reserve) {\n let answer = Array(n).fill(1) // n만큼의 배열을 만들어서 1을 만들어줍니다\n let cnt = 0;\n for(let i = 0; i < reserve.length; i++){ // reserve 를 순회하며 체육복\n answer[reserve[i]-1] += 1\n }\n for(let i = 0; i < lost.length; i++){ // lost 를 순회하며 체육복 수를 -1\n answer[lost[i]-1] -= 1\n }\n for(let i = 0; i < n; i++){ // n을 순회하며 앞사람과 뒷사람의 체육복 수를 비교한다.\n if (answer[i] == 2 && answer[i+1] == 0 || answer[i+1] == 2 && answer[i] == 0){\n answer[i] = 1\n answer[i+1] = 1\n }\n }\n for(let i = 0; i < answer.length; i++){\n (answer[i] >= 1 ? cnt += 1 : null)\n }\n return cnt\n }\n //그리디\n // lost 배열과 reserve 배열을 순회하여 체육복을 추가, 제거 해줍니다.\n // 그 후에 최종적으로 i부터 n까지 for문을 순회하며 i번쨰 학생과 i+1번째의 학생이 가진 체육복 수를 비교하여 빌려 줄 수 있는지, 빌려줄 수 없는지 확인 합니다.","probId":"42862","createdAt":1679394094353,"lang":"JavaScript"},{"id":"4mh35T96w0o_dN-4qMn3P","author":"chaerin-dev","code":"function solution(n, lost, reserve) {\n // 학생들의 체육복 개수를 저장할 배열 students\n // 학생의 index가 1번부터 시작하므로 배열의 길이를 n+1로 설정\n // 0번 학생은 실제로는 없지만 초기값을 1로 설정하면 이후 연산에 영향을 미치지 않음\n const students = Array.from({ length: n + 1 }, () => 1);\n\n // 체육복 분실/여분 정보 students 배열에 반영\n lost.forEach((lostStudent) => students[lostStudent]--);\n reserve.forEach((reserveStudent) => students[reserveStudent]++);\n\n // 체육복이 없어 체육 수업을 들을 수 없는 학생 수를 저장할 변수 cnt\n let cnt = 0;\n students.forEach((student, i) => {\n // 현재 인덱스의 학생이 체육복이 없다면\n if (student === 0) {\n // 바로 앞 학생이 체육복 여분이 있다면\n if (students[i - 1] === 2) {\n // 바로 앞 학생에게 체육복 빌리기\n students[i - 1]--;\n student++;\n }\n // 바로 앞 학생에게 체육복을 빌리지 못했고, 바로 뒤 학생이 체육복 여분이 있다면\n else if (students[i + 1] === 2) {\n // 바로 뒤 학생에게 체육복 빌리기\n students[i + 1]--;\n student++;\n }\n // 바로 앞 학생과 바로 뒤 학생 모두에게 체육복을 빌리지 못했다면 체육 수업을 들을 수 없음\n else cnt++;\n }\n });\n\n // 체육 수업을 들을 수 있는 학생 수 = 전체 학생 수 - 체육 수업을 들을 수 없는 학생 수\n return n - cnt;\n}","probId":"42862","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9Q0lkYcedv8SgcgtzudB0","author":"codeisneverodd","code":"function solution(n, m) {\n const gcd = greatestCommonDivisor(n, m);\n return [gcd, (n * m) / gcd];\n}\n\nconst greatestCommonDivisor = (a, b) => {\n if (b === 0) return a;\n else return greatestCommonDivisor(b, a % b);\n};","probId":"12940","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ewsZ9r3rqM2clbYhxTpQY","author":"chaerin-dev","code":"function solution(n, m) {\n // 최대공약수 구하기\n let gcd = (n, m) => (n % m === 0 ? m : gcd(m, n % m));\n // 최소공배수 구하기\n let lcm = (n, m) => (n * m) / gcd(n, m);\n // 결과 출력\n return [gcd(n, m), lcm(n, m)];\n}","probId":"12940","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Jr7B5dlwFDqEXbETHep2j","author":"yongchanson","code":"function solution(a, b) {\n let gcd = 0;\n for (let i = 1; i <= Math.min(a, b); i++) {\n if ((a % i) + (b % i) === 0) {\n gcd = i;\n }\n }\n return [gcd, (a / gcd) * b];\n}","probId":"12940","createdAt":1679394094353,"lang":"JavaScript"},{"id":"MXwkymbFd1kz6TIgqL_fK","author":"prove-ability","code":"function solution(sizes) {\n // 가로, 세로 중 큰 값을 가로 길이로 변경(스압)\n sizes.forEach(([width, height], index) => {\n if (sizes[index][0] < sizes[index][1]) [sizes[index][0], sizes[index][1]] = [sizes[index][1], sizes[index][0]];\n });\n\n // 가로, 세로 각각 큰 값 추출\n const widthMax = Math.max(...sizes.map(v => v[0]));\n const widthHeight = Math.max(...sizes.map(v => v[1]));\n\n return widthMax * widthHeight;\n}","probId":"86491","createdAt":1679394094353,"lang":"JavaScript"},{"id":"zTwUH1w_o_TSBqvU8Ui72","author":"codeisneverodd","code":"function solution(sizes) {\n for (let card of sizes) {\n if (card[0] < card[1]) [card[0], card[1]] = [card[1], card[0]];\n }\n\n const maxWidth = Math.max(...sizes.map(card => card[0]));\n const maxHeight = Math.max(...sizes.map(card => card[1]));\n return maxWidth * maxHeight;\n}","probId":"86491","createdAt":1679394094353,"lang":"JavaScript"},{"id":"94qlDqEmbjX9Yz8rrbh1O","author":"codeisneverodd","code":"function solution(num) {\n let answer = 0;\n while (answer <= 500) {\n if (num === 1) return answer;\n num = num % 2 === 0 ? num / 2 : num * 3 + 1;\n answer += 1;\n }\n return -1;\n}","probId":"12943","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Dm96pBci7mCGP2WUd4bXY","author":"chaerin-dev","code":"function solution(num) {\n // 작업을 반복한 횟수를 저장할 변수\n let cnt = 0;\n // num이 1이 되면 반복 종료\n while (num > 1) {\n // 작업을 500번 반복해도 1이 되지 않으면 -1 반환\n if (cnt == 500) return -1;\n // 작업 반복 횟수 증가\n cnt++;\n // 입력된 수가 짝수이면 2로 나누기\n if (num % 2 == 0) num /= 2;\n // 입력된 수가 홀수이면 3을 곱하고 1을 더하기\n else {\n num *= 3;\n num++;\n }\n }\n // 작업을 반복한 횟수 반환\n return cnt;\n}","probId":"12943","createdAt":1679394094353,"lang":"JavaScript"},{"id":"6Pz55YxSqwfiwool34rmC","author":"jaewon1676","code":"function solution(num) {\n var answer = 0;\n // num이 1이 아니고, answer이 500이 아니면 진행.\n // 두 가지 조건중 하나라도 맞지 않으면 while문 종료.\n while (num != 1 && answer != 500) {\n //짝수면, 2로 나눠주고 홀수면 3을 곱하고 1을 더해준다.\n num % 2 == 0 ? (num = num / 2) : (num = num * 3 + 1);\n answer++;\n }\n return num == 1 ? answer : -1;\n}","probId":"12943","createdAt":1679394094353,"lang":"JavaScript"},{"id":"UzH0LHREY5CZkFDEx6SnK","author":"prove-ability","code":"function solution(num) {\n let count = 0;\n\n // 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.\n while (num !== 1) {\n // 입력된 수가 짝수라면 2로 나눕니다.\n if (num % 2 === 0) num /= 2;\n // 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.\n else num = num * 3 + 1;\n count++;\n // 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요\n if (count > 500) return -1;\n }\n\n return count;\n}","probId":"12943","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7hfenXvttHxJdStgWjkFM","author":"yongchanson","code":"function solution(num) {\n let count = 0;\n while (num !== 1) {\n if (count++ === 500) return -1;\n num = num % 2 ? num * 3 + 1 : num / 2;\n }\n return count;\n}","probId":"12943","createdAt":1679394094353,"lang":"JavaScript"},{"id":"iPMEN0ayXeCq9KiQBcBKJ","author":"codeisneverodd","code":"function solution(board, moves) {\n let answer = 0;\n const length = board.length\n let basket = []\n moves.forEach(move => {\n for (let i = 0; i < length; i++) {\n const item = board[i][move - 1]\n if (item !== 0) {\n if (basket[basket.length - 1] !== item) {\n basket.push(item)\n } else {\n basket.pop()\n answer += 2\n }\n board[i][move - 1] = 0\n break\n }\n }\n })\n\n return answer;\n}","probId":"64061","createdAt":1679394094353,"lang":"JavaScript"},{"id":"S52gfdXl4Vf3G1iqQsGZk","author":"jaewon1676","code":"function solution(board, moves) {\n var answer = 0; // 인형을 터뜨린 횟수\n let basket = []; // 바구니\n let crane = 0; // 크레인의 행의 위치\n for (let i = 0; i < moves.length; i++) {\n crane = moves[i] - 1; // crane = 0\n for (let j = 0; j < board.length; j++) {\n if (board[j][crane] == 0)\n else if (board[j][crane] != 0) {\n basket.push(board[j][crane])\n board[j][crane] = 0\n if (basket[basket.length - 1] == basket[basket.length - 2]) {\n basket.pop();\n basket.pop();\n answer += 2;\n }\n break;\n }\n }\n }\n\n return answer;\n}\n\n/* 풀이 과정\n1. 입력받은 moves의 length만큼 for문을 돌린다.\n2. 크레인에 찾고자 하는 행을 저장하여 제일 윗부분부터 탐색한다., 제일 윗부분이 비어있으면 다음 행으로 넘어가면서 탐색 한다.\n3. 값이 들어있으면 해당 값을 바구니에 push 해주고, 비워준다.\n4. 바구니 배열의 끝부분에 같은 인형 값이 연속되어있으면 연속 된 인형들을 pop 해주고, answer에 인형이 터진 횟수인 2를 더해준다. */","probId":"64061","createdAt":1679394094353,"lang":"JavaScript"},{"id":"pfHtfsZVkkHiayrYTOHoG","author":"chaerin-dev","code":"function solution(board, moves) {\n let n = board.length;\n\n // 격자의 세로줄이 하나의 배열이 되도록 2차원 배열 방향 변경\n board = board.flat();\n let rotatedBoard = Array.from({ length: n }, (i) => []);\n for (let i = 0; i < board.length; i++) {\n if (board[i]) rotatedBoard[i % n].push(board[i]);\n }\n\n // moves 배열 순회하며 인형 꺼내서 stack에 집어넣기\n let stack = [];\n let cnt = 0;\n for (let move of moves) {\n let doll = rotatedBoard[move - 1].shift();\n if (doll === undefined) continue;\n if (stack[stack.length - 1] === doll) {\n stack.pop();\n cnt += 2;\n } else {\n stack.push(doll);\n }\n }\n\n return cnt;\n}","probId":"64061","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ZCxqB6BbJUzqxD9zJ5HfP","author":"chaerin-dev","code":"function solution(numbers, hand) {\n // 키패드를 4행 3열의 이차원 배열이라고 생각\n\n // leftRow, leftCol: 왼손의 현재 위치\n let [leftRow, leftCol] = [3, 0];\n // rightRow, rightCol: 오른손의 현재 위치\n let [rightRow, rightCol] = [3, 2];\n // 각 번호를 누른 엄지손가락이 어느 손인지 저장할 문자열\n let result = '';\n\n // 눌러야할 각 번호가\n numbers.forEach(e => {\n // 1/4/7이면 왼손으로 눌러야하므로\n if (e === 1 || e === 4 || e === 7) {\n // 왼손의 위치 업데이트\n [leftRow, leftCol] = [Math.floor((e - 1) / 3), 0];\n // result 문자열에 \"L\" 이어붙여줌\n result += 'L';\n }\n\n // 3/6/9이면 오른손으로 눌러야하므로\n else if (e === 3 || e === 6 || e === 9) {\n // 오른손의 위치 업데이트\n [rightRow, rightCol] = [Math.floor((e - 1) / 3), 2];\n // result 문자열에 \"R\" 이어붙여줌\n result += 'R';\n }\n\n // 2/5/8/0이면\n else {\n // 번호 위치 계산의 편의를 위해 눌러야 할 번호가 0일 경우 11로 바꿔줌\n if (e === 0) e = 11;\n\n // leftRow, leftCol: 다음에 눌러야 할 번호의 위치\n let [nextRow, nextCol] = [Math.floor((e - 1) / 3), 1];\n // leftDistance: 현재 왼손의 위치와 다음에 눌러야 할 번호의 위치 사이의 거리\n let leftDistance = Math.abs(leftRow - nextRow) + Math.abs(leftCol - nextCol);\n // rightDistance: 현재 오른손의 위치와 다음에 눌러야 할 번호의 위치 사이의 거리\n let rightDistance = Math.abs(rightRow - nextRow) + Math.abs(rightCol - nextCol);\n\n // 왼손이 다음에 눌러야 할 번호의 위치와 더 가깝거나, 두 손의 거리가 같으면서 왼손잡이라면 왼손으로 눌러야하므로\n if (leftDistance < rightDistance || (leftDistance == rightDistance && hand === 'left')) {\n // 왼손의 위치 업데이트\n [leftRow, leftCol] = [nextRow, nextCol];\n // result 문자열에 \"L\" 이어붙여줌\n result += 'L';\n }\n\n // 오른손이 다음에 눌러야 할 번호의 위치와 더 가깝거나, 두 손의 거리가 같으면서 오른손잡이라며 오른손으로 눌러야하므로\n else {\n // 오른손의 위치 업데이트\n [rightRow, rightCol] = [nextRow, nextCol];\n // reuslt 문자열에 \"R\" 이어붙여줌\n result += 'R';\n }\n }\n });\n\n // result 문자열 반환\n return result;\n}","probId":"67256","createdAt":1679394094353,"lang":"JavaScript"},{"id":"68jNGoyytzcOlAS5SyGFJ","author":"codeisneverodd","code":"function solution(numbers, hand) {\n let leftNum = 10;\n let rightNum = 12;\n return numbers\n .map(num => {\n if (num === 0) {\n num = 11;\n }\n if (num % 3 === 1) {\n return leftTo(num);\n } else if (num % 3 === 0) {\n return rightTo(num);\n } else {\n const numLocation = numToLocation(num);\n const leftDistance = distanceBtwLocation(numToLocation(leftNum), numLocation);\n const rightDistance = distanceBtwLocation(numToLocation(rightNum), numLocation);\n if (leftDistance === rightDistance) {\n return hand === 'left' ? leftTo(num) : rightTo(num);\n } else if (leftDistance < rightDistance) {\n return leftTo(num);\n } else {\n return rightTo(num);\n }\n }\n })\n .join('');\n\n function leftTo(num) {\n leftNum = num;\n return 'L';\n }\n\n function rightTo(num) {\n rightNum = num;\n return 'R';\n }\n}","probId":"67256","createdAt":1679394094353,"lang":"JavaScript"},{"id":"4MhQup3fXXKL9MmSX8T8n","author":"codeisneverodd","code":"function solution(arr) {\n return arr.reduce((acc, curr) => acc + curr) / arr.length;\n}","probId":"12944","createdAt":1679394094353,"lang":"JavaScript"},{"id":"hj6e3dHd8OFlm9FdM7EjK","author":"jaewon1676","code":"function solution(arr) {\n var answer = 0;\n for (var i = 0; i < arr.length; i++) {\n answer += arr[i];\n }\n return answer / arr.length;\n}","probId":"12944","createdAt":1679394094353,"lang":"JavaScript"},{"id":"HAOzveHmR3uEuIw0sngUX","author":"chaerin-dev","code":"function solution(arr) {\n // arr의 모든 요소를 sum에 더힘\n let sum = arr.reduce((sum, e) => sum + e);\n // sum을 arr의 요소의 갯수로 나눈 후 반환\n return sum / arr.length;\n}","probId":"12944","createdAt":1679394094353,"lang":"JavaScript"},{"id":"gm7pLWLd9DyjvgskAV2FJ","author":"prove-ability","code":"function solution(arr) {\n var answer = 0;\n arr.forEach((num) => {\n answer += num;\n });\n return answer / arr.length;\n}","probId":"12944","createdAt":1679394094353,"lang":"JavaScript"},{"id":"MmmrvwJ7lrAf31EdIDPfg","author":"codeisneverodd","code":"function solution(nums) {\n const numLen = nums.length;\n const setLen = [...new Set(nums)].length;\n return numLen / 2 >= setLen ? setLen : numLen / 2;\n}","probId":"1845","createdAt":1679394094353,"lang":"JavaScript"},{"id":"yhtVkzIR36dqONCwB25S2","author":"jaewon1676","code":"function solution(nums) {\n let max = nums.length / 2; // N / 2\n let set = [...new Set(nums)]; // 중복을 없앤다.\n return set.length > max ? max : set.length;\n}\n\n/* 풀이 과정\n1. 많은 종류의 폰켓몬을 포함해서 N/2마리 선택해야한다.\n2. 같은 숫자는 같은 종류이므로 set을 활용해 중복을 없애고 진행한다.\n3. 최대로 고를 수 있는 폰켓몬 수는 N / 2마리가 set의 길이보다 크냐 작냐에 따라 \n 두가지 경우의 수로 좁혀진다. */","probId":"1845","createdAt":1679394094353,"lang":"JavaScript"},{"id":"4TV8GYuTck0WnYo6CflGw","author":"prove-ability","code":"function solution(nums) {\n var answer = 0;\n // set 을 사용해 중복 제거\n const set = new Set();\n nums.forEach((num) => {\n set.add(num);\n });\n // set 의 사이즈가 N/2 보다 크다면 N/2 반환\n // 그렇지 않다면 set size 반환\n if (set.size > nums.length / 2) answer = nums.length / 2;\n else answer = set.size;\n\n return answer;\n}","probId":"1845","createdAt":1679394094353,"lang":"JavaScript"},{"id":"mYSk3xSypHHsW1bV15ymJ","author":"yongchanson","code":"function solution(nums) {\n const unique = nums.filter((element, index) => {\n return nums.indexOf(element) === index;\n });\n\n return unique.length > nums.length / 2 ? nums.length / 2 : unique.length;\n}","probId":"1845","createdAt":1679394094353,"lang":"JavaScript"},{"id":"1buPydN5hvSMYxiJWJhWk","author":"chaerin-dev","code":"function solution(nums) {\n // 가질 수 있는 폰켓몬의 수\n const getCnt = nums.length / 2;\n // 폰켓몬 종류의 수\n const setSize = new Set(nums).size;\n // 내가 가질 수 있는 폰켓몬의 수보다 폰켓몬 종류의 수가 더 많으면\n // -> 모두 다른 종류의 폰켓몬을 하나씩 가질 수 있음\n // 내가 가질 수 있는 폰켓몬의 수보다 폰켓몬 종류의 수가 더 적으면\n // -> 최대한 다양한 종류의 폰켓몬을 가지려고 해도 원래 있던 폰켓몬 종류의 수가 최대로 가질 수 있는 폰켓몬 종류의 수\n return setSize > getCnt ? getCnt : setSize;\n}","probId":"1845","createdAt":1679394094353,"lang":"JavaScript"},{"id":"1gdqtkUhXrhHbYE9Duzvi","author":"codeisneverodd","code":"function solution(x) {\n const sum = x\n .toString()\n .split(\"\")\n .map((x) => parseInt(x))\n .reduce((acc, curr) => acc + curr);\n return x % sum === 0;\n}","probId":"12947","createdAt":1679394094353,"lang":"JavaScript"},{"id":"KzMzxIkslLO020nqk83NZ","author":"chaerin-dev","code":"function solution(x) {\n // x의 각 자리에 접근하기 위해 x를 문자열로 변환\n let x_str = x.toString();\n // 각 자릿수의 합을 저장할 변수\n let sum_of_digits = 0;\n // x_str의 각 문자를 숫자로 바꿔 sum_of_digits에 더해줌\n for (let i = 0; i < x_str.length; i++) {\n sum_of_digits += Number(x_str[i]);\n }\n // x가 각 자릿수의 합으로 나누어떨어지는지 여부 반환\n return x % sum_of_digits == 0;\n}","probId":"12947","createdAt":1679394094353,"lang":"JavaScript"},{"id":"wofD5Hv4OpVm-o9uHmILl","author":"jaewon1676","code":"function solution(x) {\n let sum = 0;\n let arr = String(x).split(\"\"); // 숫자를 하나씩 분리한다.\n\n for (var i = 0; i < arr.length; i++) {\n sum += Number(arr[i]); // 각 숫자를 더해준다.\n }\n\n return x % sum == 0 ? true : false; // 자릿수의 합으로 x가 나누어지면 하샤드 수\n}","probId":"12947","createdAt":1679394094353,"lang":"JavaScript"},{"id":"DyuxxksmPktyA4cq5Lqum","author":"prove-ability","code":"function solution(x) {\n var answer = true;\n // 모든 자릿수의 합을 구한다\n const sum = x\n .toString()\n .split(\"\")\n .reduce((acc, cur) => acc + parseInt(cur, 10), 0);\n // x가 자릿수의 합으로 나누어떨어지지 않는다면 false 반환\n if (x % sum !== 0) return false;\n return answer;\n}","probId":"12947","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Y5u7p4htZYqblMzR79zHj","author":"codeisneverodd","code":"function solution(phone_number) {\n return \"*\".repeat(phone_number.length - 4) + phone_number.slice(-4);\n}","probId":"12948","createdAt":1679394094353,"lang":"JavaScript"},{"id":"RegkLLoeWx_PnVUz6Qs1L","author":"chaerin-dev","code":"function solution(phone_number) {\n // \"*\"을 phone_number의 길이에서 4만큼 뺀 횟수만큼 반복한 문자열과\n // phone_number의 -4인덱스부터 끝까지 추출한 문자열을\n // 이어붙인 후 반환\n return \"*\".repeat(phone_number.length - 4) + phone_number.slice(-4);\n}","probId":"12948","createdAt":1679394094353,"lang":"JavaScript"},{"id":"2-xaBZIgoE2krNO-WwgBd","author":"prove-ability","code":"function solution(phone_number) {\n var answer = \"\";\n answer += \"*\".repeat(phone_number.length - 4);\n answer += phone_number.slice(phone_number.length - 4, phone_number.length);\n return answer;\n}","probId":"12948","createdAt":1679394094353,"lang":"JavaScript"},{"id":"6h5JI_CTavzPJH7MtISGv","author":"codeisneverodd","code":"function solution(arr1, arr2) {\n var answer = new Array(arr1.length);\n for (let i = 0; i < arr1.length; i++) {\n answer[i] = new Array(arr1[0].length);\n }\n for (let row = 0; row < answer.length; row++) {\n for (let col = 0; col < answer[0].length; col++) {\n answer[row][col] = arr1[row][col] + arr2[row][col];\n }\n }\n return answer;\n}","probId":"12950","createdAt":1679394094353,"lang":"JavaScript"},{"id":"TWduPWGleuME_CJQCTSPk","author":"chaerin-dev","code":"function solution(arr1, arr2) {\n var answer = [];\n for (let i = 0; i < arr1.length; i++) {\n let ans_row = [];\n for (let j = 0; j < arr1[0].length; j++) {\n ans_row.push(arr1[i][j] + arr2[i][j]);\n }\n answer.push(ans_row);\n }\n return answer;\n}","probId":"12950","createdAt":1679394094353,"lang":"JavaScript"},{"id":"QC1oG84-d4QJwG15v-Ti7","author":"yongchanson","code":"function solution(A, B) {\n let answer = [];\n\n for (let i = 0; i < A.length; i++) {\n answer[i] = [];\n for (let j = 0; j < A[0].length; j++) {\n answer[i][j] = A[i][j] + B[i][j];\n }\n }\n return answer;\n}","probId":"12950","createdAt":1679394094353,"lang":"JavaScript"},{"id":"VjakovEpxyPzA5dcN2rzZ","author":"codeisneverodd","code":"function solution(n) {\n var answer = '';\n const oneTwoFour = ['4', '1', '2']\n while (n > 0) {\n const remainder = n % 3\n answer = oneTwoFour[remainder] + answer;\n if (remainder === 0) {\n n = Math.floor((n - 1) / 3)\n } else {\n n = Math.floor(n / 3)\n }\n }\n return answer;\n}","probId":"12899","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7LgMYX1DApNTOR0a8CSTp","author":"jaewon1676","code":"function solution(n) {\n const number = [ 4, 1, 2];\n let answer = \"\";\n \n while(n){ // \n answer = number[n%3] + answer;\n n = (n%3 == 0)? n/3 - 1 : Math.floor(n/3);\n }\n\n return answer\n}","probId":"12899","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9W6tETWU0iM4iM27P11Mr","author":"RyanDeclan","code":"// 3진법 풀이를 바탕으로 풀음 0,1,2 대신 1,2,3을 활용\n// 1,2,4 나라지만 임시적으로 1,2,3 나라를 운영하고 마지막에 replace로 3을 전부 4로 바꾸는 코드\nlet result = \"\";\nfunction solution(n) {\n let remainder = n % 3;\n let quotient = Math.floor(n / 3)\n if(!remainder){\n quotient = Math.floor(n / 3) - 1;\n remainder = 3\n }\n result += remainder;\n if( quotient <= 3){\n if(quotient)result += quotient\n result = result.replace(/[\"3\"]/g,\"4\")\n return result.split(\"\").reverse().join(\"\")\n } \n return solution(quotient);\n}","probId":"12899","createdAt":1679394094353,"lang":"JavaScript"},{"id":"nKaTjadaguUkLwT6umotE","author":"jaewon1676","code":"function solution(n) {\n let dp = [0, 1, 2] // n이 1, 2일때는 바로 답을 출력,\n if (n>2){ // n이 3 이상이면 필요한 만큼의 수 까지만 수를 만들어준다.\n for (let i=3; i<=n; i++){\n dp.push((dp[i-1] + dp[i-2]) % 1000000007);\n }\n }\n return dp[n]\n}\n/* \nn이 1일땐 1, 2일땐 2, 3일땐 3, 4일땐 5 . . 의 식이 보인다.\nn = (n - 1) + (n - 2)의 식으로 구할 수 있고,\n제한 사항을 주의해서 풀어보자. */","probId":"12900","createdAt":1679394094353,"lang":"JavaScript"},{"id":"AOPsrD2ijP3-40z3nFgW1","author":"le2sky","code":"function solution(numbers) {\n const answer = [];\n numbers.forEach((num) => {\n if (num % 2 == 0) answer.push(num + 1);\n else {\n let binary = [\"0\", ...num.toString(2)];\n let last = binary.lastIndexOf(\"0\");\n binary[last] = \"1\";\n binary[last + 1] = \"0\";\n answer.push(parseInt(binary.join(\"\"), 2));\n }\n });\n return answer;\n}","probId":"77885","createdAt":1679394094353,"lang":"JavaScript"},{"id":"zlZcsNzLVWdMwgVIPU8I2","author":"codeisneverodd","code":"function solution(n) {\n if (n % 2 !== 0) return 0;\n\n const getCount = n => {\n const k = n / 2;\n const count = [3, 11, ...Array(k - 2)];\n const divider = 1000000007;\n for (let i = 2; i < k; i++) {\n count[i] = (4 * count[i - 1] - count[i - 2] + divider) % divider;\n }\n return count[count.length - 1];\n };\n\n return getCount(n);\n}","probId":"12902","createdAt":1679394094353,"lang":"JavaScript"},{"id":"28P5BaMjEWq4UWKkmwqQz","author":"codeisneverodd","code":"function solution(citations) {\n var answer = 0;\n let h = 0\n let length = 0\n while (length >= h) {\n h++\n length = citations.filter(citation => citation >= h).length\n }\n answer = h - 1\n return answer;\n}","probId":"42747","createdAt":1679394094353,"lang":"JavaScript"},{"id":"07_VeueyKdEDFDyNjPTao","author":"jaewon1676","code":"function solution(citations) {\n var answer = 0;\n citations.sort((a,b)=>(b-a))\n\n for(var i=0; i word.charAt(0).toUpperCase() + word.substring(1).toLowerCase()).join(' ')\n //word[0]은 빈 문자열을 만나면 undefined를, word.charAt(0)은 빈 문자열을 만나면 빈 문자열을 반환한다.\n return answer;\n}","probId":"12951","createdAt":1679394094353,"lang":"JavaScript"},{"id":"zJu4dHtoKmaZoeqGvYxO6","author":"jaewon1676","code":"function solution(s) {\n s = s.split(' ').map(el => el.split('').map((el, index) => \n index == 0 ? el.toUpperCase() : el.toLowerCase()).join('')).join(' ')\n return s;\n}\n// 문자열을 연습하기에 좋은 문제입니다.\n \n// s.split(' ') // 띄어쓰기를 기준으로 나눕니다.\n// .map(el => el.split('')) 나눈 덩어리를 다시 요소 하나 하나씩 나눠줍니다 \n// .map((el, index) => index == 0 ? el.toUpperCase() : el.toLowerCase())\n// 덩어리의 요소가 첫번째이면 대문자, 그렇지 않으면 소문자로 변환 해줍니다. \n// .join('') 작은 배열들을 합쳐줍니다.\n// .join(' ') 큰 배열들을 합쳐줍니다.","probId":"12951","createdAt":1679394094353,"lang":"JavaScript"},{"id":"hK9f9ndQDE1sXaUinfKAe","author":"yongchanson","code":"function solution(s) {\n let answer = [];\n s = s.split(\" \");\n\n for (let i = 0; i < s.length; i++) {\n answer.push(\n s[i].substring(0, 1).toUpperCase() + s[i].substring(1).toLowerCase()\n );\n }\n return answer.join(\" \");\n}","probId":"12951","createdAt":1679394094353,"lang":"JavaScript"},{"id":"sPlDt5aiENmQJgvlQmebU","author":"RyanDeclan","code":"function solution(s) {\n return s.toLowerCase().split(\" \").map(x=>x[0] ? x[0].toUpperCase() + x.substring(1) : \"\").join(\" \");\n}\n\n// 이 문제에서 제일 핵심은 \"공백문자가 연속해서 나올 수 있습니다.\" 입니다. 이 부분을 꼭 고려하셔야합니다. \n// 왜냐하면 공백이 연속으로 있으면 split할때 공백이 포함되기에 그 공백이 마침 x[0]이 되어버리면 undefined.toUpperCase()가 되기에 런타임에러가 뜹니다.\n// 따라서 저는 풀때 당시 몰랐지만 chartAt()을 사용하는 것도 좋은 방법중 하나라고 생각합니다. \n//그게 아니라 이 코드로 한다면 꼭 undefined인 경우를 처리하는 코드를 추가해줘야합니다.","probId":"12951","createdAt":1679394094353,"lang":"JavaScript"},{"id":"TBwaxd9mZyrzb-Durxs46","author":"codeisneverodd","code":"function solution(n) {\n /*\n 1. 0번째 행에 0번째 queen을 놓는다.\n 2. 그 다음 행의 퀸은 이전 퀸들의 범위와 겹치지 않는 곳에 놓는다. 퀸은 한 행에 반드시 하나 두어야한다.\n 3. 마지막 열까지 도달하면 성공으로 간주하고 answer에 1을 더한다.\n 4. 0번째 queen의 위치를 바꿔가며 모두 시도한다.\n 4. 단, 체스판은 일차원 배열로 선언하고 index = 행, 값 = 열 로 생각한다.\n */\n let answer = 0;\n const canBePlacedOn = (chess, currentRow) => {\n //해당 행에 둔 queen이 유효한지\n for (let prevRow = 0; prevRow < currentRow; prevRow++) {\n const onDiagonal = currentRow - prevRow === Math.abs(chess[currentRow] - chess[prevRow])\n const onStraight = chess[prevRow] === chess[currentRow]\n if (onDiagonal || onStraight) return false\n }\n return true\n }\n const placeQueen = (chess, currentRow) => {\n //queen을 배치하다가 끝 행에 도착하면 1을 리턴, 도착하지 못하면 0을 리턴하여, 재귀적으로 모든 경우를 합하여 리턴\n let count = 0\n if (currentRow === chess.length) return 1\n for (let currentQueen = 0; currentQueen < n; currentQueen++) {\n //queen을 우선 배치한 후 가능한지 살펴본다.\n chess[currentRow] = currentQueen\n if (canBePlacedOn(chess, currentRow)) count += placeQueen(chess, currentRow + 1)\n }\n return count\n }\n for (let firstQueen = 0; firstQueen < n; firstQueen++) {\n const chess = new Array(n).fill(-1)\n chess[0] = firstQueen\n answer += placeQueen(chess, 1)\n }\n return answer;\n}","probId":"12952","createdAt":1679394094353,"lang":"JavaScript"},{"id":"JL6PQjS1Ye6tolU8A_E6R","author":"codeisneverodd","code":"function solution(arr) {\n var answer = 0;\n answer = arr.reduce((a, b) => leastCommonMultiple(a, b), 1)\n return answer;\n}\n\nfunction leastCommonMultiple(a, b) {\n return a * b / greatestCommonDivisor(a, b)\n}\n\nfunction greatestCommonDivisor(a, b) {\n while (b > 0) {\n let r = a % b;\n a = b;\n b = r;\n }\n return a;\n}","probId":"12953","createdAt":1679394094353,"lang":"JavaScript"},{"id":"i8sYJBOLUeicvCcuIG3se","author":"codeisneverodd","code":"function solution(str1, str2) {\n var answer = 0;\n let compare1 = verifiedSlices(str1), compare2 = verifiedSlices(str2)\n const union = new Set([...compare1, ...compare2])\n let multiIntersectionLen = 0, multiUnionLen = 0\n for (const slice of union) {\n const compare1Count = compare1.filter(x => x === slice).length,\n compare2Count = compare2.filter(x => x === slice).length\n multiIntersectionLen += Math.min(compare1Count, compare2Count)\n multiUnionLen += Math.max(compare1Count, compare2Count)\n }\n answer = multiUnionLen === 0 ? 65536 : Math.floor(multiIntersectionLen / multiUnionLen * 65536)\n return answer;\n}\n\nfunction verifiedSlices(str) {\n const onlyAlphabet = /[a-zA-Z]{2}/\n let result = []\n for (let i = 0; i < str.length - 1; i++) {\n const slice = str.slice(i, i + 2)\n if (onlyAlphabet.test(slice)) result.push(slice.toLowerCase())\n }\n return result\n}","probId":"17677","createdAt":1679394094353,"lang":"JavaScript"},{"id":"RBflJhaKTzyHXGsgMh8Tp","author":"jaewon1676","code":"function solution(str1, str2) {\n\n str1 = str1.toUpperCase(); // 대소문자를 구분하지 않으니 대문자로 맞춰줌.\n str2 = str2.toUpperCase();\n let arr1 = new Array() // 빈 객체를 만들어줌.\n let arr2 = new Array()\n \n for (var i = 0; i < str1.length - 1; i++) {\n let tmp = str1.substr(i, 2) // i부터 2개 ( i, i+1 )\n if (tmp.search(/[^A-Z]/g) >= 0) {\n // ^(not), A-Z(A ~ Z 의 범위), g(global 모두) \n // tmp 변수에 담은 문자열이 영문자가 아니면 -1을 반환.\n continue\n }\n arr1.push(tmp)\n }\n \n for (var i = 0; i < str2.length - 1; i++) {\n let tmp = str2.substr(i, 2)\n if (tmp.search(/[^A-Z]/g) >= 0) {\n continue\n }\n arr2.push(tmp)\n }\n arr1.sort()\n arr2.sort()\n var a = [] // 중복포함, 교집합 배열\n var b = [] // 중복포함, 합집합 배열\n \n for (var i = 0; i < arr2.length; i++) {\n if (arr1.indexOf(arr2[i]) >= 0) { \n // arr1 객체에 arr2[i]과 같은 값이 있는지 확인.\n // 없으면 -1을 반환하기때문에 조건이 성립되지 않는다. \n a.push(arr1.splice(arr1.indexOf(arr2[i]), 1))\n }\n // 교집합이 성립되지 않으면 실행.\n b.push(arr2[i])\n }\n\n for (var i = 0; i < arr1.length; i++) {\n b.push(arr1[i])\n }\n\n // 분모가 0이 될경우, 분자가 0이될 경우 따로 분리해줘야함\n if (b.length === 0) return 65536\n if (a.length === 0) return 0\n\n return Math.floor((a.length / b.length) * 65536)\n}","probId":"17677","createdAt":1679394094353,"lang":"JavaScript"},{"id":"AknDF5Bz9CpCYN5i9q76r","author":"codeisneverodd","code":"function solution(cacheSize, cities) {\n var answer = 0;\n let cache = []\n if (cacheSize === 0) return 5 * cities.length\n for (const city of cities) {\n const cityLC = city.toLowerCase()\n if (cache.includes(cityLC)) {\n cache.splice(cache.indexOf(cityLC), 1)\n cache.unshift(cityLC)\n answer += 1\n } else {\n if (cache.length >= cacheSize) cache.pop()\n cache.unshift(cityLC)\n answer += 5\n }\n }\n return answer;\n}","probId":"17680","createdAt":1679394094353,"lang":"JavaScript"},{"id":"DWtHGPN_Hr99gIXXEB6Uo","author":"jaewon1676","code":"function solution(cacheSize, cities) {\n var answer = 0;\n let cache = [];\n \n //캐시 크기가 0인 경우는 따로 처리\n if (cacheSize === 0) return cities.length * 5;\n \n while (cities.length != 0) {\n // 맨 앞의 배열의 요소 히나를 소문자로 변환해서 city에 넣는다.\n const city = cities.shift().toLowerCase(); \n // cities의 요소 city가 캐시 안에 있는지 비교한다. (hit or miss)\n if (cache.includes(city)) { \n // 캐시 안에 있으면 그 위치에 있는 캐시를 빼주고,\n cache.splice(cache.indexOf(city), 1);\n // 맨 뒤로 push 해준다.\n cache.push(city);\n // cache hit\n answer += 1;\n } else { // 캐시 크기가 꽉 차있으면 캐시 맨 앞에 요소를 하나 빼준다.\n if (cache.length === cacheSize) {\n cache.shift();\n }\n // 새로운 캐시 맨 뒤로 push\n cache.push(city);\n // cache miss\n answer += 5;\n }\n }\n return answer;\n }\n /* LRU 알고리즘\n n이 배열 안에 있으면 배열 안의 n을 빼주고, 새 n을 배열의 맨 뒤로 push 한다.\n n이 배열 안에 없으면 n을 배열의 맨 뒤로 push 한다. 이때 배열의 크기 여유가 없으면\n 배열에서 가장 오래된 요소를 하나 뺴준다. (arr.shift()) */","probId":"17680","createdAt":1679394094353,"lang":"JavaScript"},{"id":"hKVFCuqW6bqhwkd-G1poJ","author":"codeisneverodd","code":"function solution(m, n, board) {\n board = board.map(r => r.split(''));\n const getSquare = ([r, c]) => [\n [r, c],\n [r, c + 1],\n [r + 1, c],\n [r + 1, c + 1],\n ];\n\n const isSquare = ([r, c]) => {\n if (board[r][c] === '@') return false;\n return [...new Set(getSquare([r, c]).map(([r, c]) => board[r][c]))].length === 1;\n };\n\n const remove = () => {\n const removeArr = [];\n for (let r = 0; r < m - 1; r++) {\n for (let c = 0; c < n - 1; c++) {\n if (isSquare([r, c])) getSquare([r, c]).forEach(v => removeArr.push(v));\n }\n }\n removeArr.forEach(([r, c]) => {\n board[r][c] = '@';\n });\n return removeArr.length !== 0;\n };\n\n const pull = () => {\n for (let c = 0; c < n; c++) {\n const remainColumn = Array.from({ length: m }, (_, r) => board[r][c]).filter(v => v !== '@');\n const resultColumn = [...Array(m - remainColumn.length).fill('@'), ...remainColumn];\n resultColumn.forEach((v, r) => {\n board[r][c] = v;\n });\n }\n return board;\n };\n\n while (remove()) {\n pull();\n }\n\n return board.flat().filter(v => v === '@').length;\n}","probId":"17679","createdAt":1679394094353,"lang":"JavaScript"},{"id":"zGjcAQnQZZy9HifTDSHMS","author":"codeisneverodd","code":"function solution(n, t, m, p) {\n let queue = [], result = [], currentNumDecimal = -1, turn = 0\n while (result.length < t) {\n if (queue.length === 0) {\n currentNumDecimal++\n currentNumDecimal.toString(n).split('').forEach(x => queue.push(x))\n }\n const currentChar = queue.shift()\n if (turn % m === p - 1) result.push(currentChar)\n turn++\n }\n return result.join('').toUpperCase()\n}","probId":"17687","createdAt":1679394094353,"lang":"JavaScript"},{"id":"nWgDR9ot7FpFEI6isToMa","author":"minjongbaek","code":"function convertString(m) { // 문자열 m에 #이 붙은 음이 있다면 #을 제거하고 소문자로 변경한 후 반환하는 함수\n return m\n .replace(/C#/g, 'c')\n .replace(/D#/g, 'd')\n .replace(/F#/g, 'f')\n .replace(/G#/g, 'g')\n .replace(/A#/g, 'a');\n}\n\nfunction solution(m, musicinfos) {\n\n // 네오가 기억하고 있는 멜로디가 라디오에서 재생됐는지 확인해야합니다.\n // 재생시간이 길면 악보의 멜로디가 반복되어 재생되고, 짧다면 중간에 끊어지게 됩니다.\n // #이 붙은 음은 2자리를 차지하기 때문에 #이 붙은 음을 어떻게 처리할지가 중요합니다.\n\n const listenSound = convertString(m); // #이 붙은 음을 다른 문자로 변환합니다.\n \n const map = new Map(); // 조건에 일치하는 음악 정보를 저장할 map 변수를 선언합니다.\n for (const info of musicinfos) {\n const [start, finish, title, _score] = info.split(',');\n // 음악 재생이 끝난 시각과 재생된 시각의 차를 구하여 재생시간을 구합니다.\n const duration = ((Number(finish.slice(0, 2)) * 60) + (Number(finish.slice(3, 5)))) - ((Number(start.slice(0, 2)) * 60) + (Number(start.slice(3, 5))));\n \n const score = convertString(_score); // 악보의 멜로디에서 #이 붙은 음을 다른 문자로 변환합니다.\n\n // 재생된 멜로디를 구합니다.\n // 각 음이 1분에 1개씩 재생되므로, repeat() 메서드를 사용하여 재생시간을 악보의 길이로 나눈 몫 만큼 반복합니다.\n // slice() 메서드로 재생시간을 넘어가는 멜로디는 제외합니다.\n const playScore = score.repeat(Math.ceil(duration / score.length)).slice(0, duration);\n if (playScore.includes(listenSound)) { // 들은 멜로디가 재생된 멜로디에 포함되어 있다면 map에 저장한다.\n map.set(title, {score, playScore});\n }\n }\n \n // 조건에 일치하는 음악이 여러개인 경우 재생된 시간이 제일 길고 먼저 입력된 음악 제목을 반환합니다.\n // map 객체는 삽입에 대한 순서를 기억하므로 재생된 시간이 제일 긴 음악부터 내림차순으로 정렬합니다.\n const filter = [...map.keys()].sort((a,b) => map.get(b).playScore.length - map.get(a).playScore.length);\n return filter.length >= 1 ? filter[0] : '(None)'; // 결과가 없다면 '(None)'을 반환하고, 그렇지 않다면 첫 번째 요소를 반환합니다.\n}","probId":"17683","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Qxd8IoGaRi1uE89pRilU0","author":"codeisneverodd","code":"function solution(msg) {\n const outputs = [];\n const dict = ['@', ...Array.from(Array(26), (_, i) => String.fromCharCode(65 + i))];\n let [start, end] = [0, 1];\n\n const doesDictHave = (start, end) => dict.includes(msg.substring(start, end));\n\n const getInput = (start, end) => {\n if (end + 1 > msg.length || !doesDictHave(start, end + 1)) return [start, end];\n return getInput(start, end + 1);\n };\n\n const addToDict = (start, end) => {\n if (doesDictHave(start, end)) return;\n dict.push(msg.substring(start, end));\n };\n\n const addToOutputs = (start, end) => {\n if (!doesDictHave(start, end)) return;\n outputs.push(dict.indexOf(msg.substring(start, end)));\n };\n\n while (start < msg.length) {\n [start, end] = getInput(start, end);\n addToDict(start, end + 1);\n addToOutputs(start, end);\n start = end;\n }\n return outputs;\n}","probId":"17684","createdAt":1679394094353,"lang":"JavaScript"},{"id":"z1cEapQw_vTaWCYmPzbhM","author":"ssi02014","code":"function solution(msg) {\n const result = [];\n const dict = Array.from({length: 26},(_, i) => String.fromCharCode(65 + i))\n\n // 시간 복잡도 O(N^2)\n const lastWordAndCompression = msg.split(\"\").reduce((acc, cur) => {\n const nextWord = acc + cur;\n const nextWordIdx = dict.indexOf(nextWord);\n const prevWordIdx = dict.indexOf(acc);\n\n if (nextWordIdx !== -1) return acc + cur;\n dict.push(nextWord);\n\n if (prevWordIdx !== -1) result.push(prevWordIdx + 1);\n return cur;\n }, \"\");\n\n result.push(dict.indexOf(lastWordAndCompression) + 1);\n return result;\n}","probId":"17684","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9Z-Irf_aJY5hilnChcmkF","author":"codeisneverodd","code":"function solution(files) {\n var answer = [];\n const numberRegex = /[0-9]+/\n answer = files.sort((a, b) => {\n const [matchA, matchB] = [a.match(numberRegex), b.match(numberRegex)]\n const [headA, headB] = [a.slice(0, matchA.index).toLowerCase(), b.slice(0, matchB.index).toLowerCase()]\n const [numberA, numberB] = [parseInt(matchA[0]), parseInt(matchB[0])]\n return headA < headB ? -1 : headA > headB ? 1 : numberA < numberB ? -1 : numberA > numberB ? 1 : 0\n })\n return answer;\n}","probId":"17686","createdAt":1679394094353,"lang":"JavaScript"},{"id":"c92OX1CC72SNkMj5AsE1y","author":"minjongbaek","code":"function isPrime(number) { // 소수를 판별하는 함수\n if (number < 2) return false;\n for (let i = 2; i * i <= number; i += 1) {\n if (number % i === 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction solution(n, k) {\n // 문제를 얼핏 보면 4가지의 경우를 모두 생각해야할 것 같지만,\n // 결국은 앞이나 뒤에 0이 하나라도 있거나 아예 없는 경우에 소수인지 확인하면 됩니다.\n // 따라서 k진수로 변환 후 0을 기준으로 나누고 각 요소가 소수인지 판별하면 됩니다.\n\n // (n).toString(k) // n을 k진수로 변환합니다.\n // .split('0') // 0을 기준으로 나눕니다.\n // .filter((number) => isPrime(+number)).length // 소수가 아닌 요소를 걸러낸 후에 개수를 셉니다.\n return (n).toString(k).split('0').filter((number) => isPrime(+number)).length;\n}","probId":"92335","createdAt":1679394094353,"lang":"JavaScript"},{"id":"27x71P9qSjKl6H067BaL5","author":"jaewon1676","code":"function solution (n, left, right) {\n const answer = [];\n \n for (let i=left; i <= right; i++) { // left부터 right까지를 구한다.\n let row = parseInt(i/n);\t// 행(row)을 구한다.\n let column = i%n;\t// 열(column)을 구한다.\n answer.push(Math.max(row, column) + 1) // 행과 열중 큰 값을 푸시한다.\n }\n return answer\n}","probId":"87390","createdAt":1679394094353,"lang":"JavaScript"},{"id":"pRFDxEW6rpM6_8FS6eh6n","author":"codeisneverodd","code":"function solution(numbers) {\n var answer = '';\n numbers.sort(sortFunc)\n answer = numbers.join('')\n if (answer[0] === '0') return '0'\n return answer;\n}\n\nconst sortFunc = (a, b) => {\n const compareA = parseInt(a.toString() + b.toString())\n const compareB = parseInt(b.toString() + a.toString())\n return compareB - compareA\n}","probId":"42746","createdAt":1679394094353,"lang":"JavaScript"},{"id":"gI-HXKVi3H1H4Rxop37ag","author":"createhb21","code":"function solution(numbers) {\n let stringNum = \n numbers.map((el) => el + '').sort((a,b) => (b+a) - (a+b));\n \n return stringNum[0] === '0' ? '0' : stringNum.join('');\n}","probId":"42746","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9ocRqeQxGL8vljoJt2EKG","author":"prove-ability","code":"function solution(numbers) {\n return numbers.every(v => v === 0) ? \"0\" : numbers.map(v => v.toString(10)).sort((a,b) => (b+a) - (a+b)).join(\"\");\n}","probId":"42746","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7tq89XCXxHf6bAZ3N0QZq","author":"codeisneverodd","code":"function solution(board) {\n for (let row = 0; row < board.length; row++) {//해당 칸이 0이 아니고 위, 왼쪽 대각선, 왼쪽이 정사각형이면, 정사각형 연장가능\n for (let col = 0; col < board[0].length; col++) {\n if (board[row][col] >= 1 && (!(board[row - 1] === undefined || board[row][col - 1] === undefined)))\n board[row][col] = Math.min(board[row - 1][col], board[row - 1][col - 1], board[row][col - 1]) + 1;\n }\n }\n return Math.max(...board.map((row) => Math.max(...row))) ** 2; //수정된 board 내의 최댓값이 가능한 정사각형의 최대\n}","probId":"12905","createdAt":1679394094353,"lang":"JavaScript"},{"id":"OA4EV_bKkYpVL0WV_mOTj","author":"codeisneverodd","code":"function solution(places) {\n var answer = [];\n answer = places.map(place => {\n return place.some((row, rowIndex) =>\n row.split('').some((mark, colIndex, rowArr) => {\n if (mark === 'X') return false\n const countPeopleAround = [\n rowArr[colIndex - 1] || '',\n rowArr[colIndex + 1] || '',\n (place[rowIndex - 1] || '')[colIndex],\n (place[rowIndex + 1] || '')[colIndex],\n ].filter(mark => mark === 'P').length\n return (mark === 'P' && countPeopleAround > 0) || (mark === 'O' && countPeopleAround > 1)\n })\n ) ? 0 : 1\n })\n return answer;\n}","probId":"81302","createdAt":1679394094353,"lang":"JavaScript"},{"id":"B2euqt_Oe9uzKkVn_4p2k","author":"prove-ability","code":"function solution(maps) {\n // BFS 활용\n const row = maps.length - 1, col = maps[0].length - 1;\n \n // 큐 - 시작 위치 y, x, 이동 거리\n const queue = [[0, 0, 1]];\n \n while(queue.length) {\n // 큐 추출\n let [y, x, count] = queue.shift();\n // 상대 팀 진영이라면\n if(y === row && x === col) return count;\n // 동서남북 확인\n for(let i = 0; i < 4; i++) {\n const [dy, dx] = DIRECTION[i];\n // 다음 길 위치\n const nextY = dy + y, nextX = dx + x;\n // 맵 밖으로 나간다면\n if(isOut(nextY, nextX, row, col)) continue;\n // 도착한 곳이 벽이라면\n if(maps[nextY][nextX] === 0) continue;\n // 이미 지난 곳 벽으로 만들어서 다음에 접근 방지\n maps[nextY][nextX] = 0;\n // 다음에 확인해야하는 곳 큐에 추가\n // 갈수 있는 곳이 두 곳이라면 두 곳 추가됨 \n queue.push([nextY, nextX, count + 1]);\n // 처음에 count 를 let 으로 선언하고 ++count 로 작성했을 떄 에러 발생 - 이유는 모르겠음..\n }\n }\n \n return -1;\n}\n\n// 상 우 하 좌\nconst DIRECTION = [[1, 0], [0, 1], [-1, 0], [0, -1]];\n\n// 사용이 가능한 길인지 확인하는 함수\nconst isOut = (nextY, nextX, row, col) => nextY < 0 || nextX < 0 || nextY > row || nextX > col;","probId":"1844","createdAt":1679394094353,"lang":"JavaScript"},{"id":"tFgh55K9T3Fa-uPBaUKle","author":"codeisneverodd","code":"function solution(p) {\n if (p.length === 0) {\n return p\n } else {\n const sliceIndex = balancedIndex(p)\n const [u, v] = [p.slice(0, sliceIndex + 1), p.slice(sliceIndex + 1)]\n if (isRight(u)) {\n return u + solution(v)\n } else {\n let emptyString = '(' + solution(v) + ')'\n const slicedReversedString = u\n .slice(1, u.length - 1)\n .split('')\n .map(bracket => bracket === '(' ? ')' : '(')\n .join('')\n return emptyString + slicedReversedString\n }\n }\n}\n\nconst isRight = (str) => {\n if (str[0] === ')') return false\n let stack = 0\n for (let i = 0; i < str.length; i++) {\n stack = str[i] === '(' ? stack + 1 : stack - 1\n if (stack < 0) return false\n }\n return stack === 0\n}\nconst balancedIndex = (str) => {\n let count = 0\n for (let i = 0; i < str.length; i++) {\n count = str[i] === '(' ? count + 1 : count - 1\n if (count === 0) return i\n }\n}","probId":"60058","createdAt":1679394094353,"lang":"JavaScript"},{"id":"9A8pSUiT7gTgf5i5_sc4S","author":"codeisneverodd","code":"function solution(s) {\n let answer = 0;\n let sArr = s.split('')\n if (isRight(sArr.join(''))) answer += 1\n for (let i = 0; i < sArr.length - 1; i++) {\n sArr.push(sArr.shift())\n if (isRight(sArr.join(''))) answer += 1\n }\n return answer;\n}\n\nfunction isRight(str) {\n const bracketOpen = ['[', '{', '('], bracketClose = [']', '}', ')']\n let status = [{open: false, openOrder: []}, {open: false, openOrder: []}, {open: false, openOrder: []}]\n for (let sIndex = 0; sIndex < str.length; sIndex++) {\n for (let bIndex = 0; bIndex < 3; bIndex++) {\n if (str[sIndex] === bracketOpen[bIndex]) {\n status[bIndex].open = true\n status[bIndex].openOrder.push(sIndex)\n }\n if (str[sIndex] === bracketClose[bIndex]) {\n if (status[bIndex].openOrder.length > 0) {\n if (status.filter(check => check.open && check.openOrder[check.openOrder.length - 1] > status[bIndex].openOrder[status[bIndex].openOrder.length - 1]).length > 0)\n return false //먼저 닫혀야 하는 괄호보다 먼저 닫힘\n status[bIndex].openOrder.pop()\n status[bIndex].open = false\n } else {\n return false //열리기 전에 닫힘\n }\n }\n }\n }\n for (let i = 0; i < 3; i++) if (status[i].open) return false //닫히지 않은 괄호가 있음\n return true\n}","probId":"76502","createdAt":1679394094353,"lang":"JavaScript"},{"id":"KrD3_BIcUBFqXxi-vQXC0","author":"codeisneverodd","code":"function solution(line) {\n const getCrossPoint = ([A, B, E], [C, D, F]) => {\n if (A * D - B * C === 0) return [Infinity, Infinity];\n return [(B * F - E * D) / (A * D - B * C), (E * C - A * F) / (A * D - B * C)];\n }; //문제 설명 최하단 참조\n\n const crossPoints = line.flatMap((lineA, i) =>\n line\n .slice(i + 1)\n .map(lineB => getCrossPoint(lineA, lineB))\n .filter(([x, y]) => Number.isInteger(x) && Number.isInteger(y))\n );\n\n const generateCanvas = crossPoints => {\n const xPoints = [...crossPoints.map(([x, y]) => x)];\n const yPoints = [...crossPoints.map(([x, y]) => y)];\n const [minX, maxX] = [Math.min(...xPoints), Math.max(...xPoints)];\n const [minY, maxY] = [Math.min(...yPoints), Math.max(...yPoints)];\n const xLength = Math.abs(maxX - minX) + 1;\n const yLength = Math.abs(maxY - minY) + 1;\n\n return {\n canvas: Array.from({ length: yLength }, () => Array(xLength).fill('.')),\n draw([x, y], value) {\n this.canvas[Math.abs(y - maxY)][Math.abs(x - minX)] = value;\n },\n print() {\n return this.canvas.map(row => row.join(''));\n },\n };\n };\n\n const canvas = generateCanvas(crossPoints);\n\n crossPoints.forEach(point => {\n canvas.draw(point, '*');\n });\n\n return canvas.print();\n}","probId":"87377","createdAt":1679394094353,"lang":"JavaScript"},{"id":"GmyNKZ1InATO0-mX7t4j5","author":"jaewon1676","code":"function solution(people, limit) {\n let cnt = 0;\n \n people.sort((a, b) => {return a - b}) // 몸무게 오름차순\n \n while(people.length != 0){ // 무인도에 갖힌 사람이 없어질때까지 반복 \n if (people[0] + people[people.length-1] <= limit){ // 무게가 되면 둘 다 빼주기\n people.pop()\n people.shift()\n } else {\n people.pop() // 무거운사람을 뺴주자\n }\n cnt++;\n }\n return cnt;\n} // 4주차 2번 문제와 유사함","probId":"42885","createdAt":1679394094353,"lang":"JavaScript"},{"id":"rnxXpn50bj2uSIZOWgX1b","author":"prove-ability","code":"function solution(people, limit) {\n let count = 0;\n // 오름차순 정렬\n people.sort((a, b) => a - b);\n \n // people 배열 요소가 있다면?\n while(people.length) {\n \n // 요소 중 가장 큰 수인 마지막 요소를 가져온다\n let sum = people.pop();\n \n // 요소 중 가장 작은 수를 더한다\n sum += people[0]\n \n // 합이 무게제한보다 작거나 같다면 가장 작은 요소 제거\n if(sum <= limit) people.shift();\n \n count++;\n }\n \n return count;\n}","probId":"42885","createdAt":1679394094353,"lang":"JavaScript"},{"id":"GQgbNBSKI2JnPrJpE2HcO","author":"iHoHyeon","code":"function solution(people, limit) {\n people.sort((a, b) => a - b); // 오름차순 정렬\n\n let cnt = 0; // 구명보트 개수\n\n let front = 0; // 가장 몸무게가 작은 사람의 index\n let last = people.length; // 가장 몸무게가 큰 사람의 index\n\n while (last > front) {\n cnt++;\n\n const now = people.pop();\n last--;\n\n if (now + people[front] <= limit) {\n front++; // shift() 연산의 비효율로 인해 front 사용\n }\n }\n\n return cnt;\n}","probId":"42885","createdAt":1679394094353,"lang":"JavaScript"},{"id":"hU3-XGy5Dh5NouMa-QYII","author":"codeisneverodd - 시간복잡도 감소","code":"function solution(progresses, speeds) {\n var answer = [];\n const remainDays = progresses.map((prog, index) => Math.ceil((100 - prog) / speeds[index]))\n console.log(remainDays)\n let maxDay = remainDays[0]\n answer.push(0)\n for (let i = 0; i < remainDays.length; i++) {\n if (remainDays[i] <= maxDay) {\n answer[answer.length - 1] += 1\n } else {\n answer.push(1)\n maxDay = remainDays[i]\n }\n }\n return answer;\n}","probId":"42586","createdAt":1679394094353,"lang":"JavaScript"},{"id":"MDAltVc9KeeEZgMIeeet4","author":"codeisneverodd","code":"function solution(progresses, speeds) {\n var answer = [];\n while (progresses.length > 0) {\n let done = 0\n progresses = progresses.map((prog, index) => prog + speeds[index])\n const length = progresses.length\n for (let i = 0; i < length; i++) {\n if (progresses[0] >= 100) {\n progresses.shift()\n speeds.shift()\n done += 1\n } else {\n break\n }\n }\n if (done > 0) answer.push(done)\n }\n return answer;\n}","probId":"42586","createdAt":1679394094353,"lang":"JavaScript"},{"id":"YQvnq0DpOo94g-ZmlgFfh","author":"jaewon1676","code":"function solution(progresses, speeds) {\n let answer = [];\n \n while(speeds.length > 0) { \n for(let i=0;i= 100) { \n progresses.shift();\n speeds.shift();\n count++;\n }\n if(count > 0) { // 결과 배열에 넣어주기\n answer.push(count);\n }\n }\n return answer;\n}","probId":"42586","createdAt":1679394094353,"lang":"JavaScript"},{"id":"cvP9QQXeqFnvI8xgnwUQl","author":"createhb21","code":"function solution(progresses, speeds) {\n // answer은 각 배포 때 함께 배포되는 기능의 수를 담은 배열\n var answer = [];\n // 각각의 기능이 몇 일 소요되는지 담은 큐\n let queue = [];\n \n for (let i = 0; i < speeds.length; i++) {\n // 각각의 기능이 몇 일 걸리는지 계산\n let task = Math.ceil((100 - progresses[i]) / speeds[i]);\n // 위 계산한 결과값(작업일)을 모두 큐에 넣어준다.\n queue.push(task);\n \n // 그 다음 작업이 queue[0]보다 작거나 같을 경우, queue.push()\n // 그 다음 작업이 queue[0]보다 클 경우, queue의 사이즈만큼 answer.push(), queue 초기화\n if(task > queue[0]) {\n answer.push(queue.length-1);\n // 큐 초기화\n queue = [task];\n }\n }\n \n answer.push(queue.length);\n return answer;\n }","probId":"42586","createdAt":1679394094353,"lang":"JavaScript"},{"id":"rAFFsDtNjHyvISgoZJAo-","author":"chaerin-dev","code":"function solution(progresses, speeds) {\n // 각 기능 개발 작업이 끝나기까지 남은 일수를 계산해서 daysLeftArr 배열에 저장\n const daysLeftArr = progresses.map((progress, i) => Math.ceil((100 - progress) / speeds[i]));\n\n // 최초 배포날은 daysLeftArr의 첫 번째 요소\n let deployDay = daysLeftArr[0];\n // 각 배포에 몇 개의 기능이 배포될지 셀 변수\n let cnt = 0;\n // 각 배포에 몇 개의 기능이 배포될지 저장할 배열\n const answer = [];\n\n // leftDays 배열을 차례로 순회하며 현재 배포일보다 이후에 배포되어야할 기능을 만나면 이전까지의 기능을 한번에 배포\n daysLeftArr.forEach((daysLeft) => {\n if (deployDay < daysLeft) {\n deployDay = daysLeft;\n answer.push(cnt);\n cnt = 0;\n }\n cnt++;\n });\n answer.push(cnt);\n\n // 정답 반환\n return answer;\n}","probId":"42586","createdAt":1679394094353,"lang":"JavaScript"},{"id":"5egs3UUVQZKQu_4u4UAok","author":"RyanDeclan","code":"// 예제1) 입력값 : [93, 30, 55], [1, 30, 5]\nfunction solution(progresses, speeds) {\n // 각각의 progress 의 기존 인덱스와 해당 기능의 작업한 n일을 포함하는 배열\n let countBox = [];\n let completeBox = [];\n for(k=1; k<100; k++){\n let complete = []\n for(i=0; i= 100){\n complete.push([i,k]);\n progresses.splice(i,1,\"end\")\n } \n }\n if(complete[0] != null)completeBox.push(...complete)\n } \n completeBox.sort((a,b) => a[0] - b[0])\n \n //여기까지 한다면 console.log(completeBox) \t[ [ 0, 7 ], [ 1, 3 ], [ 2, 9 ] ] 이런식으로 정리가된다. \n // 첫번째 기능(인덱스 0) 은 7일간 작업후 배포한다. 두 번째 기능(인덱스 1)은 3일간의 작업 후 배포한다. 세 번째 기능 (인덱스2)는 9일간의 작업후 배포한다 \n \n // 인덱스와 작업한 일수가 같이 들어가있는 배열을 가지고 count하는 작업 \n let count = 0;\n completeBox.reduce((acc, cur, i) => {\n if( acc[0] < cur[1] ){ // 현재 순회하는 값(일수)가 기존에 저장된 값(일수)보다 클때 \n if(i) countBox.push(count)\n acc[0] = cur[1];\n count = 0;\n count++\n }else{count++}\n if(completeBox.length == i + 1) countBox.push(count) // 마지막 순회까지 다 돌고나면 count를 box에 담는다. \n return acc\n } ,[0])\n return countBox;\n}","probId":"42586","createdAt":1679394094353,"lang":"JavaScript"},{"id":"I_BeTPeqYJu7WrkmGpgOY","author":"codeisneverodd","code":"function solution(bridge_length, weight, truck_weights) {\n const bridge = new Array(bridge_length).fill(0)\n let tick = 0\n do {\n tick++\n bridge.pop()\n bridge.reduce((a, b) => a + b) + truck_weights[0] <= weight ?\n bridge.unshift(truck_weights.shift()) : bridge.unshift(0)\n } while (bridge.reduce((a, b) => a + b) !== 0)\n return tick;\n}","probId":"42583","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-cHOpUytMAnEUFlNx9D78","author":"jaewon1676","code":"function solution(bridge_length, weight, truck_weights) {\n var answer = 0; // 총 걸리는 시간\n let bridge = []; // 다리를 건너는 트럭\n let bridge_weight = 0; // 다리를 건너는 트럭의 총 무게\n \n while (truck_weights.length > 0) { // 대기 트럭이 없을때까지 반복한다.\n answer++; // 1초 추가\n if (bridge.length == bridge_length) { // 다리가 가득 차있으면 제일 먼저 들어간 트럭을 뺴준다.\n bridge_weight -= bridge.shift();\n }\n if (bridge_weight + truck_weights[0] > weight) { \n bridge.push(0);\n continue;\n }\n let truck_weight = truck_weights.shift();\n bridge.push(truck_weight);\n bridge_weight += truck_weight;\n }\n \n answer += bridge_length;\n \n return answer;\n }","probId":"42583","createdAt":1679394094353,"lang":"JavaScript"},{"id":"WOEHE3aeD1nT7kWkRw_ng","author":"codeisneverodd","code":"function solution(n) {\n var answer = 0;\n let find = false\n const nCountOne = countOne(n.toString(2))\n let counter = 1\n while (!find) {\n if (nCountOne === countOne((n + counter).toString(2))) {\n answer = n + counter\n find = true\n }\n counter++\n }\n return answer;\n}\n\nconst countOne = (str) => {\n return str.split('').reduce((sum, currentChar) =>\n currentChar === '1' ? sum += 1 : sum, 0)\n}","probId":"12911","createdAt":1679394094353,"lang":"JavaScript"},{"id":"a3oIfmg9mz5ioPQMr21vu","author":"prove-ability","code":"function solution(n) {\n let i = n;\n n = n.toString(2).match(/1/g).length;\n while(true) {\n i++;\n const value = i.toString(2).match(/1/g).length;\n if(n === value) return i;\n }\n}","probId":"12911","createdAt":1679394094353,"lang":"JavaScript"},{"id":"l95ho5Jwir614tOg5zY0m","author":"dia","code":"function solution(n) {\n const count = (num) => num.toString(2).match(/1/g).length;\n for(i=(n+1); i< 1_000_000; i++) if(count(n) == count(i)) return i\n}","probId":"12911","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Hw4Uvj4iiYalJiSxgHjUR","author":"codeisneverodd","code":"function solution(queue1, queue2) {\n const getSum = arr => arr.reduce((a, c) => a + c, 0);\n\n if (getSum([...queue1, ...queue2]) % 2 !== 0) return -1;\n\n const queue = [...queue1, ...queue2, ...queue1, ...queue2];\n const maxCount = queue.length;\n const average = getSum(queue) / 4;\n let [currentSum, count, start, end] = [getSum(queue1), 0, 0, queue1.length];\n\n const pop = () => {\n currentSum -= queue[start];\n start += 1;\n count += 1;\n };\n const insert = () => {\n currentSum += queue[end];\n end += 1;\n count += 1;\n };\n\n while (count <= maxCount) {\n if (currentSum < average) insert();\n if (currentSum > average) pop();\n if (currentSum === average) return count;\n }\n return -1;\n}","probId":"118667","createdAt":1679394094353,"lang":"JavaScript"},{"id":"fTOq7pYYB9bscgn2zupAh","author":"jaewon1676","code":"function solution(land) {\n var answer = 0;\n \n for (i = 1; i < land.length; i++){\n land[i][0] += (Math.max(land[i-1][1], land[i-1][2], land[i-1][3]));\n land[i][1] += (Math.max(land[i-1][0], land[i-1][2], land[i-1][3]));\n land[i][2] += (Math.max(land[i-1][0], land[i-1][1], land[i-1][3]));\n land[i][3] += (Math.max(land[i-1][0], land[i-1][1], land[i-1][2]))\n }\n answer = land[land.length - 1]\n return Math.max(...answer)\n}\n/* 풀이 과정\n1. land의 행만큼 반복문을 돌린다.\n2. i행(두번째 행)부터 land.length - 1행(마지막 행)까지 본인 열을 제외한 나머지 열의 최댓값을 본인의 열에 더하여 누적한다.\n3. 마지막까지 다 구하면 마지막 행에서 최대값을 반환한다.*/","probId":"12913","createdAt":1679394094353,"lang":"JavaScript"},{"id":"HPyYrHXIrMycrG0bq4EQD","author":"codeisneverodd","code":"function solution(land) {\n for (let rowIndex = 1; rowIndex < land.length; rowIndex++) {\n for (let colIndex = 0; colIndex < land[0].length; colIndex++) {\n land[rowIndex][colIndex] += Math.max(...land[rowIndex - 1].slice(0, colIndex), ...land[rowIndex - 1].slice(colIndex + 1))\n }\n }\n return Math.max(...land[land.length - 1])\n}","probId":"12913","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ZZz7GQgS64dtdd3u9DJyV","author":"codeisneverodd","code":"function solution(n) {\n if (n < 2) return 1;\n const count = [0, 1, 2, ...Array(n - 2).fill(0)];\n count.forEach((_, i) => {\n if (i > 2) count[i] = (count[i - 2] + count[i - 1]) % 1234567;\n });\n return count[n];\n}\n//재귀를 사용하면 콜스택 오버플로우가 발생합니다.","probId":"12914","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Wu7paTcG7YzIMjk1uBSP7","author":"codeisneverodd","code":"function solution(w, h) {\n var answer = 1;\n const gcd = greatestCommonDivisor2(w, h)\n const erasedBoxInUnit = h / gcd + w / gcd - 1\n answer = w * h - erasedBoxInUnit * gcd\n return answer;\n}\n\nlet greatestCommonDivisor2 = (a, b) => {\n while (b > 0) {\n let r = a % b;\n a = b;\n b = r;\n }\n return a;\n}","probId":"62048","createdAt":1679394094353,"lang":"JavaScript"},{"id":"rn6KK1xRT0IxHWmnGvOY4","author":"jaewon1676","code":"// 유클리드 호제법을 이용한 최대 공약수 구하기\nfunction gcd(w, h) { \n let mod = w % h; // w와 h의 나머지를 구합니다.\n\n if (mod === 0) { // 나머지가 0일 경우 h를 반환합니다.\n return h;\n }\n // 만약 0이 아닐경우 w에 h를 넣고 h에 나머지인 mod를 넣어 해당 함수를 다시 호출해 줍니다.\n return gcd(h, mod);\n}\nfunction solution(w, h) {\n const gcdVal = gcd(w, h); // 최대 공약수를 구해줍니다.\n return w * h - (w + h - gcdVal);\n}","probId":"62048","createdAt":1679394094353,"lang":"JavaScript"},{"id":"sj4JCFVuhirDTa3u5lH4y","author":"yongchanson","code":"function solution(w,h){\n const slope = h / w;\n let cnt = 0;\n //대각선 아래에 위치한 도형의 개수를 구합니다.\n //대각선과 만나는 도형을 포함하기 위해 ceil을 사용합니다.\n for(let i = 1; i <= w; i++){\n cnt += Math.ceil(slope * i);\n }\n //대각선 위에 위치한 도형의 개수 * 2을 리턴합니다.\n return ((w*h - cnt) * 2);\n}","probId":"62048","createdAt":1679394094353,"lang":"JavaScript"},{"id":"sDZT5JV-1nxnQsPC7kAoX","author":"codeisneverodd","code":"function solution(orders, course) {\n var answer = [];\n for (const selectNum of course) {\n let combinations = []\n for (const order of orders) {\n getCombinations(Array.from(order), selectNum)\n .map(combination => combination.sort().join(''))// 'WX'는 'XW'와 같아야한다.\n .forEach(combString => combinations.push(combString))\n }\n const combCounts = combinations.reduce((counts, combination) => {\n counts[combination] = (counts[combination] || 0) + 1;\n return counts;\n }, {});\n let maxCount = 0, maxComb = []\n for (const comb in combCounts) if (combCounts[comb] >= maxCount) maxCount = combCounts[comb]\n for (const comb in combCounts) if (combCounts[comb] === maxCount && maxCount >= 2) maxComb.push(comb)\n answer.push(...maxComb)\n }\n answer = answer.sort()\n return answer;\n}\n\nconst getCombinations = (array, selectNum) => {\n const result = [];\n if (selectNum === 1) return array.map((element) => [element]);\n array.forEach((fixed, index, origin) => {\n const restCombinations = getCombinations(origin.slice(index + 1), selectNum - 1);\n const attached = restCombinations.map((restCombination) => [fixed, ...restCombination]);\n result.push(...attached);\n });\n return result;\n}","probId":"72411","createdAt":1679394094353,"lang":"JavaScript"},{"id":"7irtNw9hvAlaZPb_MDTcj","author":"codeisneverodd","code":"function solution(word) {\n const alphabetRank = { A: 0, E: 1, I: 2, O: 3, U: 4 };\n const price = calculatePrice([1], 5);\n return word\n .split(\"\")\n .map((alphabet, index) => 1 + price[index] * alphabetRank[alphabet])\n .reduce((acc, curr) => acc + curr, 0);\n}\nconst calculatePrice = (result = [1], targetLength) => {\n if (result.length === targetLength) return result;\n return calculatePrice([result[0] * 5 + 1, ...result], targetLength);\n};\n/*\n각 자리 문자를 바로 다음 문자로 바꾸는 데에 얼마의 비용이 들까?\n4번째 자리 - 1\n3번째 자리 - 1*5 + 1 = 6\n2번째 자리 - 6*5 + 1 = 31\n1번째 자리 - 31*5 + 1 = 156\n0번째 자리 - 156*5 + 1 = 781\n\n검증(1부터 시작하므로 1 + 비용)\nI => (1 + 781 * 2) = 1563\nEIO => (1 + 781 * 1) + (1 + 156 * 2) + (1 + 31 * 3) = 1189\nAAAE => 1 + 1 + 1 + (1 + 6 * 1) = 10\nAAAAE => 1 + 1 + 1 + 1 + (1 + 1*1) = 6\n추천 레퍼런스: https://seongho96.tistory.com/50\n*/","probId":"84512","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-5BZuGm5AyC5ZKLKpd7JE","author":"codeisneverodd","code":"function solution(s) {\n var answer = 0;\n let lengthArr = []\n for (let i = 1; i <= s.length; i++) lengthArr.push(compressedString(s, i).length)\n answer = Math.min(...lengthArr)\n return answer;\n}\n\nfunction compressedString(str, unitNum) {\n let count = 1\n let result = ['']\n for (let repeat = 0; repeat <= str.length / unitNum; repeat++) {\n const slicedGroup = str.slice(unitNum * repeat, unitNum * repeat + unitNum)\n if (result[result.length - 1] === slicedGroup) {\n count++\n } else {\n if (count > 1) result[result.length - 1] = count + result[result.length - 1]\n result.push(slicedGroup)\n count = 1\n }\n }\n return result.join('')\n}","probId":"60057","createdAt":1679394094353,"lang":"JavaScript"},{"id":"uW25FzfRyHvkJYHKFHBWN","author":"chaerin-dev","code":"function solution(s) {\n // len: 압축 전 문자열 길이\n const len = s.length;\n // shortenLen: 압축 후 문자열 길이의 최솟값을 저장할 변수(압축 전 문자열 길이로 초기화)\n let shortenLen = len;\n\n // 문자열을 1개 단위, 2개 단위, ... 문자열 길이의 절반 단위로 잘라가며 압축 수행\n for (let i = 1; i <= len / 2; i++) {\n // cnt: 단위가 반복되는 횟수를 카운트할 변수\n let cnt = 1;\n // temp: 현재 단위 문자열을 임시로 저장해둘 변수\n let temp = s.slice(0, i);\n // shhortenS: 압축 후 문자열을 저장할 변수\n let shortenS = \"\";\n\n // 문자열을 i개 단위로 잘라가며 현재 단위 문자열과 일치하는지 판단\n for (let j = i; j < len; j += i) {\n // 현재 단위 문자열과 일치하면 단위가 반복되는 횟수 1 증가\n if (temp === s.slice(j, j + i)) cnt++;\n // 현재 단위 문자열과 일치하지 않으면\n else {\n // 압축 후 문자열에 단위가 반복되는 횟수와 단위를 이어붙이고\n if (cnt === 1) shortenS += temp;\n else shortenS += cnt + temp;\n\n // 단위가 반복되는 횟수는 다시 1로 초기화\n cnt = 1;\n // 현재 단위 문자열 업데이트\n temp = s.slice(j, j + i);\n }\n }\n\n // 반복이 끝난 후 마지막으로 고려했던 단위 문자열도 압축 후 문자열에 이어붙여줘야 함\n if (cnt === 1) shortenS += temp;\n else shortenS += cnt + temp;\n\n // 압축 후 문자열 길이의 최솟값 업데이트\n shortenLen = Math.min(shortenLen, shortenS.length);\n }\n\n // 압축 후 문자열 길이의 최솟값 반환\n return shortenLen;\n}","probId":"60057","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Z8cmY--tXmTO-zeIET6sc","author":"codeisneverodd","code":"function solution(dirs) {\n const move = ([x, y], dir) => {\n let next = [x, y];\n if (dir === 'U') next = [x, y + 1];\n if (dir === 'D') next = [x, y - 1];\n if (dir === 'R') next = [x + 1, y];\n if (dir === 'L') next = [x - 1, y];\n if (Math.abs(next[0]) > 5 || Math.abs(next[1]) > 5) return [x, y];\n return next;\n };\n\n const isSameRoute = ([s1, e1], [s2, e2]) => {\n const isSamePoint = ([x1, y1], [x2, y2]) => x1 === x2 && y1 === y2;\n return (isSamePoint(s1, s2) && isSamePoint(e1, e2)) || (isSamePoint(s1, e2) && isSamePoint(s2, e1));\n };\n\n const trace = {\n visited: [],\n visit(start, end) {\n if (start[0] === end[0] && start[1] === end[1]) return;\n if (!this.visited.find(route => isSameRoute(route, [start, end]))) this.visited.push([start, end]);\n },\n };\n\n let current = [0, 0];\n\n dirs.split('').forEach(dir => {\n const next = move(current, dir);\n trace.visit(current, next);\n current = next;\n });\n\n return trace.visited.length;\n}","probId":"49994","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Kq1GVFNQc8tCairBbSKlp","author":"pereng11","code":"// 다익스트라 + 최소힙 O( N * logN ) \n // [목적지, 거리] 노드를 값으로 가지는, 거리에 대한 최소힙 \nclass MinHeap{\n constructor ()\n {\n this.heap = [ null ];\n }\n // 맨 끝에 노드를 삽입 후 위로 올라가면서 정렬\n push ( val )\n {\n this.heap.push(val);\n let childIdx = this.heap.length-1;\n let parentIdx = Math.floor(childIdx / 2);\n while(parentIdx > 0 && this.heap[parentIdx][1] > this.heap[childIdx][1]){\n this.swap( childIdx, parentIdx );\n childIdx = parentIdx;\n parentIdx = Math.floor(childIdx / 2);\n }\n }\n pop ()\n {\n if ( this.heap.length === 1 )\n {\n return undefined;\n }\n // 최소값은 빼두었다가 리턴하고, 가장 끝 값을 맨 위로 가져와 아래로 내려가면서 정렬\n const minNode = this.heap[ 1 ];\n this.heap[ 1 ] = this.heap[ this.heap.length - 1 ];\n this.heap.pop();\n let parentIdx = 1;\n let leftChildIdx = 2;\n let rightChildIdx = 3;\n while ( parentIdx < this.heap.length )\n {\n // 자식이 없는 경우 \n if ( !this.heap[ leftChildIdx ] )\n {\n break;\n } // 왼쪽 자식만 있는 경우\n else if ( !this.heap[ rightChildIdx ] )\n {\n if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] )\n {\n this.swap( parentIdx, leftChildIdx );\n }\n break;\n // 둘 중 하나가 부모보다 작을 때, 더 작은 쪽으로 정렬\n } else if ( this.heap[ parentIdx ][ 1 ] > this.heap[ leftChildIdx ][ 1 ] || this.heap[ parentIdx ][ 1 ] > this.heap[ rightChildIdx ][ 1 ] )\n {\n const minChildIdx = this.heap[ leftChildIdx ][ 1 ] < this.heap[ rightChildIdx ][ 1 ] ? leftChildIdx : rightChildIdx;\n this.swap( parentIdx, minChildIdx );\n parentIdx = minChildIdx;\n leftChildIdx = parentIdx * 2\n rightChildIdx = parentIdx * 2 + 1;\n } else\n {\n // 끝까지 내려가지 않았더라도 부모가 가장 작으면 정렬 중지\n break;\n }\n }\n return minNode;\n }\n swap ( idx1, idx2 )\n {\n [ this.heap[ idx1 ], this.heap[ idx2 ] ] = [ this.heap[ idx2 ], this.heap[ idx1 ] ];\n }\n length ()\n {\n return this.heap.length;\n }\n}\n \nfunction solution ( N, road, K )\n{\n const roadsTable = {}; //전체 도로 정보\n \n // 도로 정보 초기화 roadTable[시작점] = [목적지, 거리] 배열\n for ( let i = 1; i <= N; i++ )\n {\n roadsTable[ i ] = [];\n }\n road.forEach( road =>\n {\n let [ sp, ep, dist ] = road;\n roadsTable[ sp ].push( [ ep, dist ] );\n roadsTable[ ep ].push( [ sp, dist ] );\n } );\n\n function djikstra ( sp )\n {\n const visited = new Array( N + 1 ).fill( false ); //방문 확인 배열\n const dist = new Array( N + 1 ).fill( Infinity ); //목표지점까지 거리\n const heap = new MinHeap();\n\n //시작점 삽입\n heap.push( [sp, 0] );\n\n // 가장 가까운 목적지부터 순서대로 방문\n while ( heap.length() > 1 )\n {\n //힙에 저장된 목적지 중 가장 가까운 거리의 목적지를 꺼냄 [목적지, 거리]\n const [ ep, val ] = heap.pop();\n //아직 방문하지 않은 곳만 처리\n if ( !visited[ ep ] )\n {\n //방문처리, 거리 저장\n visited[ ep ] = true;\n dist[ ep ] = val;\n //방문 지점을 거쳐서 가는 다른 목적지 구하기\n const nexts = roadsTable[ ep ];\n if ( nexts )\n {\n nexts.forEach( n =>\n {\n let [ nextEp, nextVal ] = n;\n if ( !visited[ nextEp ] ) //아직 방문하지 않은 곳일 경우, '지금까지의 거리 + 현재 위치에서의 거리'로 힙에 삽입\n {\n heap.push( [ nextEp, val + nextVal ] );\n }\n })\n }\n }\n }\n // 거리가 K이하인 지점의 개수 반환\n const result = dist.filter( d => d <= K ).length;\n return result;\n }\n \n const answer = djikstra( 1 );\n return answer;\n}","probId":"12978","createdAt":1679394094353,"lang":"JavaScript"},{"id":"msy-ML-qEtm5CfrdCPenf","author":"pereng11 O(N * N);","code":"//다익스트라 + 선형탐색\nfunction solution ( N, road, K )\n{ \n const roadsTable = {}; //전체 도로 정보\n \n // 도로 정보 초기화 roadTable[시작점] = [목적지, 거리] 배열\n for ( let i = 1; i <= N; i++ )\n {\n roadsTable[ i ] = [];\n }\n road.forEach( road =>\n {\n let [ sp, ep, dist ] = road;\n roadsTable[ sp ].push( [ ep, dist ] );\n roadsTable[ ep ].push( [ sp, dist ] );\n } );\n\n function djikstra ( sp )\n {\n const dist = new Array( N + 1 ).fill( Infinity ); //목표지점까지 거리\n const queue = [];\n\n queue.push( [sp, 0] );\n\n while ( queue.length > 0 )\n {\n const [ ep, val ] = queue.shift();\n if ( dist[ ep ] > val )\n {\n dist[ ep ] = val;\n const nexts = roadsTable[ ep ];\n if ( nexts )\n {\n nexts.forEach( n =>\n {\n let [ nextEp, nextVal ] = n;\n //거리가 더 줄어드는 경우, '지금까지의 거리 + 현재 위치에서의 거리'로 힙에 삽입\n if ( dist[ nextEp ] > val + nextVal )\n {\n queue.push( [ nextEp, val + nextVal ] );\n }\n } );\n }\n }\n }\n // 거리가 K이하인 지점의 개수 반환\n const result = dist.filter( d => d <= K ).length;\n return result;\n }\n \n const answer = djikstra( 1 );\n return answer;\n}","probId":"12978","createdAt":1679394094353,"lang":"JavaScript"},{"id":"lr1m9SNkA3cP3Kko4poyk","author":"minjongbaek","code":"// 빛의 이동을 위한 DX, DY 변수를 선언합니다.\nconst DX = [-1, 1, 0, 0];\nconst DY = [0, 0, -1, 1];\n\nfunction solution(grid) {\n\n // DFS에 4방향을 고려하여 문제를 풉니다.\n // 핵심은 이미 방문한 칸이고 방향이 동일하다면 하나의 사이클이 형성된 것으로 생각해야합니다.\n\n const answer = [];\n\n // visited 변수를 선언 후 방문 여부를 확인할 3차원 배열을 할당합니다. [x좌표, y좌표, [하, 상, 좌, 우]]\n const visited = Array.from({ length: grid.length }, () => []).map((v) => {\n for (let i = 0; i < grid[0].length; i += 1) {\n v.push(new Array(4).fill(false));\n }\n return v\n });\n\n for (let x = 0; x < grid.length; x += 1) {\n for (let y = 0; y < grid[0].length; y += 1) {\n for (let d = 0; d < 4; d += 1) {\n // x, y 좌표에 하, 상, 좌, 우 방향으로 방문한 적이 없다면 dfs를 수행합니다.\n if (!visited[x][y][d]) {\n const stack = [];\n stack.push([x, y, d]);\n\n let cnt = 0;\n while (stack.length !== 0) {\n const [currentX, currentY, currentD] = stack.pop();\n if (!visited[currentX][currentY][currentD]) {\n visited[currentX][currentY][currentD] = true;\n cnt += 1;\n\n const [nextX, nextY] = getNextXY(currentX, currentY, currentD, grid.length, grid[0].length); // 다음으로 이동할 좌표를 구합니다.\n const nextD = getNextD(grid[nextX][nextY], currentD) // x, y 칸에 적혀있는 문자열대로 방향을 다음 방향을 구합니다.\n \n stack.push([nextX, nextY, nextD])\n }\n\n }\n answer.push(cnt);\n }\n }\n }\n }\n return answer.sort((a, b) => a - b);\n}\n\n// 다음 행선지를 구하는 함수\nfunction getNextXY(x, y, d, xLength, yLength) {\n x += DX[d];\n y += DY[d];\n\n // x나 y의 값이 유효하지 않은 경우 값을 재할당합니다.\n if (x < 0) x = xLength - 1;\n if (x >= xLength) x = 0;\n if (y < 0) y = yLength - 1;\n if (y >= yLength) y = 0;\n\n return [x, y];\n}\n\n// 현재 방향과 칸에 표시된 문자를 기준으로 다음 행선지의 방향을 구하는 함수\nfunction getNextD(command, d) {\n if (command === 'L') {\n d = [2, 3, 1, 0][d]\n } else if (command === 'R') {\n d = [3, 2, 0, 1][d]\n }\n return d\n}","probId":"86052","createdAt":1679394094353,"lang":"JavaScript"},{"id":"1z-2PinVSvQGSCBO6kbcX","author":"codeisneverodd","code":"function solution(n) {\n const snail = Array.from(Array(n), (_, index) => Array(index + 1));\n let currentNum = 0;\n let [currentRow, currentCol] = [-1, 0];\n let shouldMove = n;\n while (shouldMove > 0) {\n for (let i = 0; i < shouldMove; i++)\n snail[++currentRow][currentCol] = ++currentNum;\n for (let i = 0; i < shouldMove - 1; i++)\n snail[currentRow][++currentCol] = ++currentNum;\n for (let i = 0; i < shouldMove - 2; i++)\n snail[--currentRow][--currentCol] = ++currentNum;\n shouldMove -= 3;\n }\n return snail.flatMap((num) => num);\n}","probId":"68645","createdAt":1679394094353,"lang":"JavaScript"},{"id":"r_27wlpTxUvAtFpPJ1Muf","author":"jaewon1676","code":"function solution(n) {\n const answer = new Array(n).fill().map((e, i) => new Array(i + 1));\n // 이차원배열을 만들어준다\n \n let count = 0;\n let x = -1; // 행 , 0행 0열부터 시작해주기 위해 x는 -1 해줍니다.\n let y = 0; // 열 \n while (n > 0) {\n for (let i = 0; i < n; i++) answer[++x][y] = ++count; // 아래로 이동합니다.\n for (let i = 0; i < n - 1; i++) answer[x][++y] = ++count; // 오른쪽으로 이동합니다.\n for (let i = 0; i < n - 2; i++) answer[--x][--y] = ++count; // 대각선 오른쪽 위로 이동합니다.\n \n n -= 3;\n }\n return answer.flatMap(e => e);\n // flatMap은 이차원의 여러 배열을 하나의 배열로 묶어줍니다. \n // ex [ [ 1 ], [ 2, 9 ], [ 3, 10, 8 ], [ 4, 5, 6, 7 ] ] \n // => [1, 2, 9, 3, 10, 8, 4, 5, 6, 7]\n}","probId":"68645","createdAt":1679394094353,"lang":"JavaScript"},{"id":"lVgctjAf-exC5vJPEUJbT","author":"codeisneverodd","code":"function solution(expression) {\n var answer = 0;\n const mathExp = ['*', '+', '-']\n let priorityArr = Permutation(mathExp, 3)\n const calculated = []\n for (const priority of priorityArr) {\n const expressionArr = expression.split(/(\\D)/)\n for (const exp of priority) {\n while (expressionArr.includes(exp)) {\n const index = expressionArr.indexOf(exp)\n expressionArr.splice(index - 1, 3, eval(expressionArr.slice(index - 1, index + 2).join('')))\n }\n }\n calculated.push(Math.abs(expressionArr[0]))\n }\n answer = Math.max(...calculated)\n return answer\n}\n\nfunction Permutation(arr, r) {\n const result = []\n if (r === 1) return arr.map((num) => [num])\n arr.forEach((fixed, index, org) => {\n const rest = [...org.slice(0, index), ...org.slice(index + 1)]\n const permutation = Permutation(rest, r - 1)\n const attached = permutation.map((numbers) => [fixed, ...numbers])\n result.push(...attached)\n })\n return result\n}","probId":"67257","createdAt":1679394094353,"lang":"JavaScript"},{"id":"rWHtuGCQ8Bi-ns1CkKnGB","author":"codeisneverodd","code":"function solution(infos, queries) {\n const infoData = {};\n\n const fetchInfoData = (keyArr, score, start) => {\n const key = keyArr.join('');\n\n infoData[key] ? infoData[key].push(score) : (infoData[key] = [score]);\n\n for (let i = start; i < keyArr.length; i++) {\n fetchInfoData(\n keyArr.map((v, index) => (index === i ? '-' : v)),\n score,\n i + 1\n );\n }\n };\n\n const getPassCount = (key, passScore) => {\n const scores = infoData[key];\n\n if (!scores) return 0;\n\n let [left, right] = [0, scores.length];\n\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n scores[mid] >= passScore ? (right = mid) : (left = mid + 1);\n }\n\n return scores.length - left;\n };\n\n infos\n .map(info => [info.split(' ').slice(0, 4), info.split(' ')[4]])\n .forEach(([keyArr, score]) => fetchInfoData(keyArr, +score, 0));\n\n Object.keys(infoData).forEach(key => {\n infoData[key].sort((a, b) => a - b);\n });\n\n return queries\n .map(query => query.replace(/ and /g, '').split(' '))\n .map(([key, passScore]) => getPassCount(key, +passScore));\n}\n// 주의 할 점\n// 1. 중첩 구조에 있는 객체를 수정할 때 새로운 객체를 만들어 재할당하면 효율성에 걸림\n// 2. 고차함수 중첩하면 새로운 객체를 만드는 행위가 너무 많음으로 효율성에 걸림.\n// 3. filter 대신 정렬 후 이진 탐색을 활용해야 효율성에 걸리지 않음.","probId":"72412","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ADsyb_WjuSSyUyZN5m2ms","author":"iHoHyeon","code":"function solution(begin, end) {\n return new Array(end - begin + 1).fill(null).map((v, idx) => calc(begin + idx));\n // begin ~ end 각 위치에 대해서 calc 함수의 return 값으로 채운다.\n}\n \nconst calc = (number) => {\n if (number === 1) return 0;\n // 1번째 위치는 무조건 0블록이 위치\n\n for (let i = 2; i <= Math.sqrt(number); i++) {\n if (number % i === 0 && number / i <= 10_000_000) return number / i;\n // 10_000_000번 블록까지만 놓았으므로 숫자를 초과하는 경우는 제외\n }\n\n return 1;\n};\n\n/*\n 1번 블록부터 10_000_000번 블록까지 전부 규칙에 따라서 놓는 경우는\n 시간 / 공간 복잡도가 급상승\n\n -> 따라서 각 위치에 어떤 숫자의 블록이 놓일지를 계산해주자\n \n -> n번째 위치에는 1, n을 제외한 n의 가장 큰 약수의 블록이 놓이게 된다.\n\n -> 가장 큰 약수는 n / (n의 가장 작은 약수)임을 이용해서 계산해주면 된다.\n\n + 가장 큰 약수가 1인 경우는 소수인 경우이고 숫자 1 블록이 놓인다.\n*/","probId":"12923","createdAt":1679394094353,"lang":"JavaScript"},{"id":"epYEmCvF69vISKQQao27r","author":"codeisneverodd","code":"function solution(n) { //수학적 풀이는 별도로 하지 않았습니다.\n var answer = 0;\n for (let i = 1; i <= n; i++) {\n let sum = 0\n for (let j = i; j <= n; j++) {\n sum += j\n if (sum >= n) {\n if (sum === n) answer++\n break\n }\n }\n }\n return answer;\n}","probId":"12924","createdAt":1679394094353,"lang":"JavaScript"},{"id":"P-SWSqmBiDEVa1fxk6yWa","author":"prove-ability","code":"function solution(n) {\n let answer = 0;\n for(let i = 1; i <= n; i++) {\n let sum = 0;\n for(let j = i; j <= n; j++) {\n sum += j;\n if(sum > n) break;\n if(n === sum) {\n answer++;\n break;\n }\n }\n }\n return answer;\n}","probId":"12924","createdAt":1679394094353,"lang":"JavaScript"},{"id":"56IM1kIWG8vovFb8FvlKD","author":"yongchanson","code":"function solution(n) {\n /*\n 정답 = n의 홀수 약수의 개수\n 15의 홀수 약수 : 1,3,5,15\n 1+2+3+4+5=15 (중간값 3)\n 4+5+6=15 (중간값 5)\n 7+8=15 (연속된 값)\n 15=15 (15)\n */\n let result = 0;\n\n for (let i = 1; i <= n; i++) {\n if (n % i == 0 && i % 2 == 1) result++;\n }\n return result;\n}","probId":"12924","createdAt":1679394094353,"lang":"JavaScript"},{"id":"8igzK_8Vg_mn3wJvxre2g","author":"codeisneverodd","code":"function solution(skill, skill_trees) {\n var answer = 0;\n for (const tree of skill_trees) {\n let check = Array.from(tree).filter(x => skill.includes(x)).map(x => skill.indexOf(x))\n if (checkOrder(check)) answer += 1\n }\n return answer;\n}\n\nfunction checkOrder(checkArr) {\n for (let i = 0; i < checkArr.length; i++) if (checkArr[i] !== i) return false\n return true\n}","probId":"49993","createdAt":1679394094353,"lang":"JavaScript"},{"id":"_Y9o25wC8QdSGtoAs53PM","author":"codeisneverodd","code":"// 문제 풀이 전략\n// 1. 라이언이 쏠 수 있는 모든 경우를 비교한다.\n// 2. 10점부터 0점 순으로 어피치와 라이언을 비교해 가면서, 라이언이 해당 점수를 이길지, 비길지, 질지를 결정하며 가능한 경우를 만들어 간다.\n// 3. 이기는 경우는 화살을 어피치 + 1 개, 비기는 경우는 어피치와 동일한 개수를 소모하고, 지는 경우는 화살을 쏘지 않는다.\n// 4. 단, 0점에 도달하기 전에 화살을 모두 소진하면 더이상 쏠 화살이 없으므로 나머지 점수는 쏘지 않은 것으로 한다. 마찬가지로 0점에 도달하였는데 화살이 남아있더라면, 남은 화살을 모두 0점에 쏜다.\n// 5. 따라서 [지금까지 화살을 쏜 상황, 현재 검사중인 점수, 남은 화살 수]를 파라미터로 갖는 재귀함수를 구현하면 모든 경우를 검사할 수 있다.\n// 6. 모든 경우가 구해졌다면, 어피치와 라이언의 점수차가 가장 큰 경우들만 남긴다\n// 7. 가장 큰 경우들이 여러개라면 각 경우들을 중 마지막으로 쏜 화살의 점수 배점이 낮은 경우를 우선적으로 정렬한다.\n// RETURN. 정렬이 완료되면 가장 우선순위가 높은 경우를 반환한다.\nfunction solution(possibleArrows, apeachComb) {\n const compareTable = apeachComb.map(apeachArrow => ({\n apeachArrow,\n ryanArrow: 0,\n }));\n const possibleRyanTable = getPossibleRyanTable(compareTable, 0, possibleArrows);\n const maxScoreDiff = Math.max(...possibleRyanTable.flatMap(({ scoreDiff }) => scoreDiff));\n const maxRyanTables = possibleRyanTable.filter(({ scoreDiff }) => scoreDiff === maxScoreDiff);\n if (maxScoreDiff <= 0) return [-1];\n const getIndexOfLastArrow = arrowTable =>\n arrowTable.length -\n arrowTable\n .slice()\n .reverse()\n .findIndex(x => x !== 0);\n return maxRyanTables.sort((a, b) => getIndexOfLastArrow(b.ryanTable) - getIndexOfLastArrow(a.ryanTable))[0].ryanTable;\n}\nfunction getPossibleRyanTable(compareTable, currentIndex, numberOfArrowLeft) {\n const { apeachArrow } = compareTable[currentIndex];\n const lastIndex = compareTable.length - 1;\n const possibleRyanArrows = [\n 0,\n numberOfArrowLeft > apeachArrow && apeachArrow + 1,\n numberOfArrowLeft >= apeachArrow && apeachArrow,\n ];\n\n if (currentIndex === lastIndex || numberOfArrowLeft === 0) {\n if (numberOfArrowLeft > 0) {\n compareTable[compareTable.length - 1] = {\n apeachArrow,\n ryanArrow: numberOfArrowLeft,\n };\n }\n const appeachScore = compareTable.reduce(\n (acc, { apeachArrow, ryanArrow }, index) =>\n apeachArrow >= ryanArrow && apeachArrow !== 0 ? acc + 10 - index : acc,\n 0\n );\n const ryanScore = compareTable.reduce(\n (acc, { apeachArrow, ryanArrow }, index) => (ryanArrow > apeachArrow ? acc + 10 - index : acc),\n 0\n );\n return [\n {\n scoreDiff: ryanScore - appeachScore,\n ryanTable: compareTable.flatMap(({ ryanArrow }) => ryanArrow),\n },\n ];\n }\n return [\n ...possibleRyanArrows.flatMap(ryanUsedArrow => {\n const nextCompareTable = [...compareTable];\n nextCompareTable.splice(currentIndex, 1, {\n apeachArrow,\n ryanArrow: ryanUsedArrow,\n });\n return getPossibleRyanTable(nextCompareTable, currentIndex + 1, numberOfArrowLeft - ryanUsedArrow);\n }),\n ];\n}","probId":"92342","createdAt":1679394094353,"lang":"JavaScript"},{"id":"vXqqWwDddeHUK1og0nBmR","author":"codeisneverodd","code":"function solution(n, words) {\n var answer = [];\n let turn = 1\n for (let i = 1; i < words.length; i++) {\n let pass = (words[i][0] === words[i - 1][words[i - 1].length - 1]) && !(words.slice(0, i).includes(words[i]))\n if (i % n === 0) turn++\n if (!pass) return [i % n + 1, turn]\n }\n return [0, 0];\n}","probId":"12981","createdAt":1679394094353,"lang":"JavaScript"},{"id":"oejp1FMB4gLCyabKsl2QQ","author":"codeisneverodd","code":"function solution(n, a, b) {\n let currentRound = 1;\n const myNextNumber = (num) => Math.floor((num + 1) / 2)//내가 이긴경우 다음으로 가지게 될 번호\n while (a !== b) { // a의 다음 번호가 b의 다음번호와 같아지면 끝난다.\n if (myNextNumber(a) === myNextNumber(b)) break\n a = myNextNumber(a)\n b = myNextNumber(b)\n currentRound++\n }\n return currentRound\n}","probId":"12985","createdAt":1679394094353,"lang":"JavaScript"},{"id":"1qQBLwDgkV8i1jHbXrqgo","author":"le2sky","code":"function solution(n, a, b) {\n let arr = Array.from({ length: n }, () => 0)\n arr[b - 1] = \"B\"\n arr[a - 1] = \"A\"\n\n const isDiff = () => {\n return (\n (arr.indexOf(\"A\") + 1 > arr.length / 2 && arr.indexOf(\"B\") + 1 <= arr.length / 2) ||\n (arr.indexOf(\"A\") + 1 <= arr.length / 2 && arr.indexOf(\"B\") + 1 > arr.length / 2)) ? true : false\n };\n const isLeft = () => {\n return (arr.indexOf(\"A\") + 1 > arr.length / 2) ? false : true\n };\n\n //대진표의 절반을 기준으로 양옆에 A와 B가 있을 경우 log2N을 구하면 라운드 수가 나옴\n while (!isDiff()) {\n if (isLeft()) {\n arr.splice(arr.length / 2)\n } else {\n arr.splice(0, arr.length / 2)\n }\n }\n return Math.log2(arr.length)\n}","probId":"12985","createdAt":1679394094353,"lang":"JavaScript"},{"id":"WqmL2Na4bYUXvbpas_beg","author":"codeisneverodd","code":"function solution(record) {\n var answer = [];\n const users = {}\n record.map(history => {\n const [action, id, name] = history.split(' ')\n if (action !== 'Leave') users[id] = name\n })\n record.map(history => {\n const [action, id, name] = history.split(' ')\n if (action === 'Enter') answer.push(`${users[id]}님이 들어왔습니다.`)\n if (action === 'Leave') answer.push(`${users[id]}님이 나갔습니다.`)\n })\n return answer;\n}","probId":"42888","createdAt":1679394094353,"lang":"JavaScript"},{"id":"L4ouXXaVgcMhVlgbrHcAW","author":"jaewon1676","code":"function solution(record) {\n let answer = [];\n const map = new Map();\n \n for (let i = 0; i < record.length; ++i) {\n const [state, uid, name] = record[i].split(' '); \n\n if (state == 'Leave') {\n answer.push([uid, '님이 나갔습니다.']);\n \n continue;\n }\n \n if (state == 'Enter') {\n answer.push([uid, '님이 들어왔습니다.']);\n }\n map.set(uid, name);\n }\n return answer.map(ele => map.get(ele[0]) + ele[1]);\n}","probId":"42888","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ukiGWrvIwF3CSE8NsZGZf","author":"chaerin-dev","code":"function solution(record) {\n // 최종 메시지를 저장할 배열\n let result = [];\n // 채팅방을 출입하는 유저의 아이디를 차례로 저장할 배열\n let resultId = [];\n // 유저의 아이디: 닉네임 쌍을 저장할 Map\n let idNameMap = new Map();\n\n // record의 각 문자열을 띄어쓰기 단위로 나눠 배열로 변환\n record = record.map((e) => e.split(\" \"));\n\n // record의 각 요소에 대해\n record.forEach((e) => {\n // 각 요소의 첫 번째 요소(Enter/Leave/Change)가\n switch (e[0]) {\n // Enter이면\n case \"Enter\":\n // resultID 배열에 들어온 유저의 아이디 저장\n resultId.push(e[1]);\n // result 배열에 닉네임을 제외하고 표시될 메시지 저장\n result.push(\"님이 들어왔습니다.\");\n // idNameMap Map에 유저의 아이디: 닉네임 쌍 저장\n idNameMap.set(e[1], e[2]);\n break;\n // Leave이면\n case \"Leave\":\n // resultID 배열에 들어온 유저의 아이디 저장\n resultId.push(e[1]);\n // result 배열에 닉네임을 제외하고 표시될 메시지 저장\n result.push(\"님이 나갔습니다.\");\n break;\n // Change이면\n case \"Change\":\n // idNameMap Map에 유저의 아이디에 해당하는 닉네임 변경\n idNameMap.set(e[1], e[2]);\n break;\n }\n });\n\n // resultId의 각 요소에 해당하는 닉네임을 idNameMap에서 찾아서 result의 각 요소와 이어붙인 값 배열 반환\n return result.map((e, i) => idNameMap.get(resultId[i]) + e);\n}","probId":"42888","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-nrwIjEg7lUKSi4DaTTEY","author":"codeisneverodd","code":"function solution(s) {\n let opened = 0;\n for (const bracket of s) {\n if (bracket === \"(\") opened += 1;\n if (bracket === \")\") opened -= 1;\n if (opened < 0) return false;\n }\n return opened === 0;\n}","probId":"12909","createdAt":1679394094353,"lang":"JavaScript"},{"id":"CI2BZYf06lWIw_JFexsaq","author":"codeisneverodd","code":"function solution(clothes) {\n\tvar answer = 0;\n\tconst spyWear = {};\n\tfor (const clothNPart of clothes) {\n\t\tif (spyWear[clothNPart[1]] === undefined) spyWear[clothNPart[1]] = [];\n\t\tspyWear[clothNPart[1]].push(clothNPart[0]);\n\t}\n\tconst clothesCount = [];\n\tfor (const part in spyWear) clothesCount.push(spyWear[part].length + 1);\n\tanswer =\n\t\tclothesCount.reduce((previous, current) => previous * current, 1) - 1;\n\treturn answer;\n}","probId":"42578","createdAt":1679394094353,"lang":"JavaScript"},{"id":"39IUEp57bhrqiS-t-iI-D","author":"hyosung","code":"function solution(clothes) {\n\tlet answer = 1;\n\t// 옷 종류\n\tconst types = {};\n\t// 반복문 최적화 - length, 비교연산 제거\n\tconst length = clothes.length;\n\tfor (let i = length; i--; ) {\n\t\t// 해당 옷의 종류가 없다면 종류 1\n\t\tif (!types[clothes[i][1]]) types[clothes[i][1]] = 1;\n\t\t// 해당 옷의 종류가 있다면 종류 증가\n\t\telse types[clothes[i][1]] += 1;\n\t}\n\t// (종류 별 값 + 1 ) 을 다 곱셈\n\tObject.values(types).forEach((v) => {\n\t\tanswer *= v + 1;\n\t});\n\n\treturn answer - 1;\n}","probId":"42578","createdAt":1679394094353,"lang":"JavaScript"},{"id":"DSBtX18gKMNaJrGch8gX7","author":"jaewon1676","code":"function solution(clothes) {\n var answer = 1;\n var obj={};\n for(var i=0;i\n clothsObj[cloth[1]] ? clothsObj[cloth[1]]++ : (clothsObj[cloth[1]] = 1)\n );\n\n // 어떤 카테고리의 옷의 개수가 n개라면, 스파이는 해당 카테고리에 대해 n+1가지 선택권을 가짐\n // (옷을 입지 않거나, 1번 옷을 입거나, 2번 옷을 입거나, ..., n번 옷을 입거나)\n // 즉, (각 카테고리의 옷의 개수 + 1)를 answer에 차례로 곱해주면 됨\n let answer = 1;\n for (let key of Object.keys(clothsObj)) {\n answer *= clothsObj[key] + 1;\n }\n\n // 스파이는 하루에 최소 한 개의 의상은 입어야 하므로 아무것도 입지 않는 경우 빼기\n return answer - 1;\n}","probId":"42578","createdAt":1679394094353,"lang":"JavaScript"},{"id":"HsabCQxkazjk8-nxkXZLR","author":"codeisneverodd","code":"function solution(s) {\n const removeZero = s => {\n const removed = s\n .split('')\n .filter(n => n !== '0')\n .join('');\n return { removed, count: s.length - removed.length };\n };\n\n const convertToBinary = (s, turnCount, removedCount) => {\n if (s === '1') return [turnCount, removedCount];\n const { removed, count } = removeZero(s);\n return convertToBinary(removed.length.toString(2), turnCount + 1, removedCount + count);\n };\n\n return convertToBinary(s, 0, 0);\n}","probId":"70129","createdAt":1679394094353,"lang":"JavaScript"},{"id":"3DQJbbkh30kukb_u8-iUt","author":"RyanDeclan","code":"function solution(s) {\n let box = [0,0]\n while(s.length > 1){\n let reamain = s.replace(/0/g,\"\").length\n box[0] += 1\n box[1] += (s.length - reamain)\n s = reamain.toString(2)\n }\n return box;\n}","probId":"70129","createdAt":1679394094353,"lang":"JavaScript"},{"id":"CAQQEDkBb3To_C9jvFqs_","author":"codeisneverodd","code":"function solution(n, wires) {\n const hasOneOfWire = (tree, [a, b]) => tree.includes(a) || tree.includes(b);\n\n const convertWiresToTree = wires => [...new Set(wires.flat())];\n\n const generateTree = (wires, tree) => {\n if (!wires.find(wire => hasOneOfWire(tree, wire))) return tree;\n\n const nextWires = wires.filter(wire => !hasOneOfWire(tree, wire));\n const nextTree = [...tree, ...convertWiresToTree(wires.filter(wire => hasOneOfWire(tree, wire)))];\n\n return [...new Set(generateTree(nextWires, nextTree))];\n };\n\n let minDiff = Infinity;\n const length = convertWiresToTree(wires).length;\n\n wires.forEach((_, i) => {\n const [initWire, ...remainWires] = wires.filter((_, j) => j !== i);\n const lengthA = generateTree(remainWires, convertWiresToTree([initWire])).length;\n const diff = Math.abs(lengthA - (length - lengthA));\n minDiff = Math.min(diff, minDiff);\n });\n\n return minDiff;\n}","probId":"86971","createdAt":1679394094353,"lang":"JavaScript"},{"id":"J3oOt_BhD7UCkxSbXOpzE","author":"codeisneverodd","code":"function solution(n) {\n var ans = 0;\n while (n > 0) {\n if (n % 2 !== 0) {\n n = (n - 1) / 2\n ans++\n } else {\n n = n / 2\n }\n }\n return ans;\n}","probId":"12980","createdAt":1679394094353,"lang":"JavaScript"},{"id":"gmqlVlP3Y8jTkL8DkaU7B","author":"yongchanson","code":"function solution(n) {\n let result = 0;\n while (n > 0) {\n result += n % 2;\n n = Math.floor(n / 2);\n }\n return result;\n}","probId":"12980","createdAt":1679394094353,"lang":"JavaScript"},{"id":"QoGVCaku34rJVqQRX2TJp","author":"codeisneverodd","code":"function solution(name) {\n var answer = 0;\n const length = name.length;\n let upDownCount = 0\n let leftRightCountList = [length - 1]//한 방향으로 쭉 갔을 때\n for (let i = 0; i < length; i++) upDownCount += minUpOrDownCount(name[i])\n for (let startOfA = 0; startOfA < name.length; startOfA++) {\n let endOfA = startOfA + 1;\n while (endOfA < length && name[endOfA] === 'A') endOfA++;\n const [moveToStartOfA, moveToEndOfA] = [startOfA, length - endOfA]\n leftRightCountList.push(moveToStartOfA * 2 + moveToEndOfA)// 0 -> A.., 0 <- A.., ..A <- -1\n leftRightCountList.push(moveToEndOfA * 2 + moveToStartOfA)//시작부터 뒤로 가는 경우 ..A <- -1, ..A -> -1, 0 -> A..\n }\n answer = upDownCount + Math.min(...leftRightCountList)\n return answer;\n}\n\nfunction minUpOrDownCount(destination) {\n const Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n const index = Alphabet.indexOf(destination)\n return Math.min(index, Alphabet.length - index)\n}","probId":"42860","createdAt":1679394094353,"lang":"JavaScript"},{"id":"t6z3H25tPulkTlyJaRhfF","author":"ljw0096","code":"function solution(fees, records) {\n const answer = []\n\n const parkingTable = getParkingTable(records)\n const sortedKeys = Object.keys(parkingTable).sort()\n\n for (const targetCar of sortedKeys) {\n if (parkingTable[targetCar].length % 2 === 1) {\n parkingTable[targetCar].push(['23:59', 'OUT'])\n }\n const totalTime = getTotalTime(parkingTable, targetCar)\n const fee = calculateFee(totalTime, fees)\n answer.push(fee)\n }\n\n return answer\n}\n\nfunction getParkingTable(records) {\n const parkingTable = {}\n\n records.forEach((val) => {\n const info = val.split(' ')\n if (Object.keys(parkingTable).includes(info[1])) {\n parkingTable[info[1]].push([info[0], info[2]])\n } else {\n parkingTable[info[1]] = [[info[0], info[2]]]\n }\n })\n\n return parkingTable\n}\n\nfunction getTotalTime(parkingTable, targetCar) {\n let totalTime = 0\n for (let i = 0; i < parkingTable[targetCar].length - 1; i += 2) {\n totalTime += calculateTotalTime(\n parkingTable[targetCar][i][0],\n parkingTable[targetCar][i + 1][0]\n )\n }\n return totalTime\n}\n\nfunction calculateTotalTime(time1, time2) {\n const [hour1, minute1] = time1.split(':').map((val) => parseInt(val))\n const [hour2, minute2] = time2.split(':').map((val) => parseInt(val))\n\n return hour2 * 60 + minute2 - (hour1 * 60 + minute1)\n}\n\nfunction calculateFee(totalTime, feeInfo) {\n let fee = 0\n if (feeInfo[0] >= totalTime) {\n fee = feeInfo[1]\n } else {\n fee =\n feeInfo[1] + Math.ceil((totalTime - feeInfo[0]) / feeInfo[2]) * feeInfo[3]\n }\n return fee\n}","probId":"92341","createdAt":1679394094353,"lang":"JavaScript"},{"id":"kNhne_-9qa6A70jJI3s7A","author":"codeisneverodd","code":"function solution(n, k) {\n const getFactorial = n => {\n const result = [1, 1, 2, ...Array(n - 2)];\n result.forEach((_, i) => {\n if (i > 2) result[i] = result[i - 1] * i;\n });\n return result;\n };\n\n const getDivision = (dividend, divisor) => {\n const quotient = Math.floor(dividend / divisor);\n const remainder = dividend % divisor;\n return [quotient, remainder];\n };\n\n const stepCount = getFactorial(n).reverse();\n\n const generateSteps = (k, step) => {\n const [q, r] = getDivision(k, stepCount[step]);\n if (r === 0) return [q];\n return [q, ...generateSteps(r, step + 1)];\n };\n\n const answer = [];\n\n const steps = generateSteps(k - 1, 0);\n\n const notUsedNums = Array.from({ length: n }, (_, i) => i + 1);\n\n steps.slice(1).forEach(q => {\n answer.push(notUsedNums[q]);\n notUsedNums.splice(q, 1);\n });\n\n return [...answer, ...notUsedNums];\n}","probId":"12936","createdAt":1679394094353,"lang":"JavaScript"},{"id":"HK9ptDmy8O0AWl-b4C8xX","author":"codeisneverodd","code":"function solution(s) {\n var answer = -1;\n let notPairStack = []\n notPairStack.push(s[0])\n for (let i = 1; i < s.length; i++) {\n if (notPairStack[notPairStack.length - 1] === s[i]) {\n notPairStack.pop()\n } else {\n notPairStack.push(s[i])\n }\n }\n answer = notPairStack.length === 0 ? 1 : 0\n return answer;\n}","probId":"12973","createdAt":1679394094353,"lang":"JavaScript"},{"id":"A1eHRdaz8Haz6HcQ661RQ","author":"jaewon1676","code":"function solution(s){\n let cnt = 0; // 빼준 부분을 카운트 해줍니다\n let answer;\n let stack = []\n for (let i of s){\n if (stack[stack.length - 1] === i){ // 스택의 끝부분과 i를 비교합니다\n stack.pop();\n cnt++;; \n } else {\n stack.push(i)\n }\n }\n \n (s.length / 2 == cnt ? answer = 1 : answer = 0 ) \n // s의 길이를 2로 나눠서 cnt 값이 된다면 문자열의 개수만큼 잘 잘라졌다는 뜻입니다\n return answer;\n }\n // 코테 1주차 5번 문제와 유사합니다. 문자열 유형을 연습하기에 좋은 문제입니다","probId":"12973","createdAt":1679394094353,"lang":"JavaScript"},{"id":"CQt47w1Rkj3wzrx_KPRQH","author":"codeisneverodd","code":"function solution(s) {\n var answer = '';\n const arr = s.split(' ').map(x => parseInt(x, 10)).sort((a, b) => a - b)\n answer = arr[0] + ' ' + arr[arr.length - 1]\n return answer;\n}","probId":"12939","createdAt":1679394094353,"lang":"JavaScript"},{"id":"gJbHOI90B9U2PgJhfx5lx","author":"jaewon1676","code":"function solution(s) {\n s = s.split(' ')\n s.sort((a, b) => {return a - b}) // 오름차순 정렬\n let small = s[0] // s의 최솟값\n let large = s[s.length - 1] // s의 최댓값\n return (small + ' ' + large)\n}","probId":"12939","createdAt":1679394094353,"lang":"JavaScript"},{"id":"yBhUFqKetjxAdygubedf4","author":"prove-ability","code":"function solution(s) {\n s = s.split(\" \").map((v) => parseInt(v, 10))\n return `${Math.min(...s)} ${Math.max(...s)}`;\n}","probId":"12939","createdAt":1679394094353,"lang":"JavaScript"},{"id":"RCe6dqEFVBlbw2Z1vzhwn","author":"yongchanson","code":"function solution(s) {\n let arr = s.split(\" \").sort((a, b) => a - b);\n arr.splice(1, arr.length - 2, \" \");\n let result = arr.join(\"\");\n return result;\n}","probId":"12939","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ZagjFEXwfraHemfRfFgUS","author":"codeisneverodd","code":"function solution(A, B) {\n var answer = 0;\n A = A.sort((a, b) => a - b)\n B = B.sort((a, b) => b - a)\n for (let i = 0; i < A.length; i++) answer += A[i] * B[i]\n return answer;\n}","probId":"12941","createdAt":1679394094353,"lang":"JavaScript"},{"id":"4bClFnncYWhFex1Lfup3h","author":"prove-ability","code":"function solution(A,B){\n let sum = 0;\n A.sort((a, b) => a - b);\n B.sort((a, b) => b - a);\n \n for(let i = 0, len = A.length; i < len; i++) {\n sum += A[i] * B[i];\n }\n\n return sum;\n}","probId":"12941","createdAt":1679394094353,"lang":"JavaScript"},{"id":"jwKRjvyzgD21fL-3MPvht","author":"yongchanson","code":"function solution(A, B) {\n A.sort((a, b) => a - b);\n B.sort((a, b) => b - a);\n return A.reduce((t, n, i) => t + n * B[i], 0);\n}","probId":"12941","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ZRCoORaCjptFmvuCGAdyP","author":"codeisneverodd","code":"function solution(brown, yellow) {\n var answer = [];\n const size = brown + yellow\n answer = widthHeightPair(size).filter(pair => (pair[0] + pair[1]) * 2 - 4 === brown)[0]\n return answer;\n}\n\nfunction widthHeightPair(size) {\n let result = []\n for (let i = 1; i <= Math.sqrt(size); i++) if (size % i === 0) result.push([size / i, i])\n return result\n}","probId":"42842","createdAt":1679394094353,"lang":"JavaScript"},{"id":"F8IWVoPp35R-_7wvY6KPI","author":"jaewon1676","code":"function solution(brown, yellow) {\n var answer = [];\n let sum = brown + yellow; \n \n //카펫의 최소높이는 3부터이다.(테두리 갈색, 가운데 노란색)\n for(let height=3; height {\n const length = matrix.length;\n const half = length / 2;\n const pass = matrix => matrix.every(row => row.every(v => v === matrix[0][0]));\n\n if (pass(matrix)) return [matrix[0][0]];\n if (length <= 2) return matrix;\n\n const startPoints = [\n [0, 0],\n [0, half],\n [half, 0],\n [half, half],\n ];\n\n return startPoints.map(([r, c]) => quad(matrix.slice(r, r + half).map(row => row.slice(c, c + half))));\n };\n return quad(arr)\n .flat(Infinity)\n .reduce((a, c) => (c === 0 ? [a[0] + 1, a[1]] : [a[0], a[1] + 1]), [0, 0]);\n}","probId":"68936","createdAt":1679394094353,"lang":"JavaScript"},{"id":"szaRprAfZy_qUOWpA27cx","author":"codeisneverodd","code":"function solution(number, k) {\n var answer = '';\n let answerStack = [0]\n let deleteCount = -1\n for (let i = 0; i < number.length; i++) {\n while (deleteCount < k && number[i] > answerStack[answerStack.length - 1]) {\n answerStack.pop()\n deleteCount++\n }\n if (answerStack.length < number.length - k) answerStack.push(number[i])\n }\n answer = answerStack.join('')\n return answer;\n}","probId":"42883","createdAt":1679394094353,"lang":"JavaScript"},{"id":"EyQH8kejDSI0N4q9lG02r","author":"jaewon1676","code":"function solution(number, k) {\n const stack = [];\n let answer = '';\n \n for(let i=0; i 0 && stack[stack.length-1] < el){\n stack.pop();\n k--;\n }\n stack.push(el);\n }\n stack.splice(stack.length-k, k);\n answer = stack.join(\"\");\n return answer;\n}","probId":"42883","createdAt":1679394094353,"lang":"JavaScript"},{"id":"yE5QUyga-dDB9MnM34OhF","author":"ssi02014","code":"function solution(numbers, target) {\n let answer = 0;\n\n dfs(0, 0);\n return answer;\n\n function dfs(index, sum) {\n // 재귀 종료\n if (index === numbers.length) {\n if (sum === target) {\n answer++;\n }\n return;\n }\n\n dfs(index + 1, sum + numbers[index]);\n dfs(index + 1, sum - numbers[index]);\n }\n}","probId":"43165","createdAt":1679394094353,"lang":"JavaScript"},{"id":"NMURcMhFuwRUsJWmaW1To","author":"codeisneverodd","code":"function solution(numbers, target) {\n var answer = 0;\n const binaryLength = numbers.length;\n const binary = 2 ** binaryLength;\n for (let i = 0; i < binary; i++) {\n const numSlice = numbers.slice();\n const binaryString = i.toString(2).padStart(binaryLength, '0');\n for (let j = 0; j < binaryString.length; j++) binaryString[j] === '0' ? (numSlice[j] *= -1) : null;\n const calculated = numSlice.reduce((prev, current) => prev + current);\n if (calculated === target) answer += 1;\n }\n return answer;\n}","probId":"43165","createdAt":1679394094353,"lang":"JavaScript"},{"id":"KG0o_ArOVK7FGDSi2Uxj_","author":"codeisneverodd","code":"function solution(s) {\n var answer = [];\n let sets = s\n .slice(2, -2)\n .split('},{')\n .map(set => set.split(',').map(x => parseInt(x)))\n .sort((a, b) => a.length - b.length)\n for (const set of sets) answer.push(...set.filter(x => !answer.includes(x)))\n return answer;\n}","probId":"64065","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ljkFBseZ_xqY2qwOlnE0q","author":"chaerin-dev","code":"function solution(s) {\n // 문자열 -> 정수 이차원 배열\n const sArr = s\n .substring(2, s.length - 2)\n .split(\"},{\")\n .map((e) => e.split(\",\").map((e) => parseInt(e)))\n .sort((a, b) => a.length - b.length);\n // 정답을 저장할 배열\n const answer = [];\n // 이차원배열을 순회하며 직전 배열과 겹치지 않는 요소만 answer에 추가\n for (let i = 0; i < sArr.length; i++) {\n for (let j = 0; j < sArr[i].length; j++) {\n const temp = sArr[i][j];\n if (!answer.includes(sArr[i][j])) answer.push(sArr[i][j]);\n }\n }\n return answer;\n}","probId":"64065","createdAt":1679394094353,"lang":"JavaScript"},{"id":"qEH0Pyao5w3x9ZFjUKlNB","author":"jaewon1676","code":"function solution(priorities, location) {\n var answer = 0;\n while (true) {\n\n if (priorities[0] < Math.max(...priorities)) {\n if (location - 1 < 0) location = priorities.length\n priorities.push(priorities.shift())\n location--;\n } else {\n answer++;\n if (location - 1 < 0) {\n return answer;\n }\n priorities.shift()\n location--;\n }\n console.log(priorities, location, answer)\n\n }\n return answer\n}","probId":"42587","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Rk4Let4yq3vO47W6aO2vR","author":"createhb21","code":"function solution(priorities, location) {\n var answer = priorities.map((priority, index) => {\n return {\n index,\n priority\n };\n });\n \n let queue = [];\n \n while(answer.length > 0){\n const first = answer.shift();\n const isPriority = answer.some((p) => p.priority > first.priority);\n isPriority ? answer.push(first) : queue.push(first);\n }\n const idx = queue.findIndex(p => p.index === location) + 1;\n return idx;\n }","probId":"42587","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Z7hpmyMSWenF2xM3-NSVa","author":"codeisneverodd","code":"//shift를 사용하지 않고 queue를 구현한 풀이를 추가합니다.\nfunction solution(priorities, location) {\n let answer = 0;\n const printer = new Queue;\n priorities.forEach((priority, index) => {\n printer.enqueue([priority, index])\n })\n while (printer.size() > 0) {\n const check = printer.dequeue()\n const countHigherPriority = printer.queue.filter(x => x[0] > check[0]).length\n if (countHigherPriority > 0) {\n printer.enqueue(check)\n } else {\n answer += 1\n if (check[1] === location) break\n }\n\n }\n return answer;\n}\n\nclass Queue {\n constructor() {\n this.queue = []\n this.front = 0\n this.rear = 0\n }\n\n enqueue(value) {\n this.queue[this.rear++] = value\n }\n\n dequeue() {\n const value = this.queue[this.front]\n delete this.queue[this.front]\n this.front += 1\n return value\n }\n\n peek() {\n return this.queue(this.front)\n }\n\n size() {\n return this.rear - this.front\n }\n}","probId":"42587","createdAt":1679394094353,"lang":"JavaScript"},{"id":"VTaNyHO40w4_74rGMSLnW","author":"pereng11","code":"//완전 탐색, greedy O(N^2)\nfunction solution(currentFatigue, dungeons) {\n return getMaxCount(currentFatigue, 0, dungeons);\n}\n\nfunction getMaxCount(currentFatigue, visitedCount, dungeons) {\n const possibleDungeons = dungeons.filter(([minNeededFatigue, _]) => minNeededFatigue <= currentFatigue);\n if (possibleDungeons.length === 0) return visitedCount;\n\n const maxCount = possibleDungeons.reduce((prevCount, curr, currentIndex) => {\n const [_, usedFatigue] = curr;\n const nextDungeons = possibleDungeons.filter((_, index) => index !== currentIndex);\n const currentCount = getMaxCount(\n currentFatigue - usedFatigue,\n visitedCount + 1,\n nextDungeons\n );\n return Math.max(currentCount, prevCount);\n }, 0);\n\n return maxCount;\n}","probId":"87946","createdAt":1679394094353,"lang":"JavaScript"},{"id":"EMiltQkFNcp5H6BUbdl7p","author":"codeisneverodd","code":"function solution(n) {\n var answer = 0;\n answer = fibonacci1234567(n)\n return answer;\n}\n\nfunction fibonacci1234567(n) { //재귀적으로 하면 시간초과\n let fiboArr = new Array(n + 1).fill(0)\n fiboArr[0] = 0\n fiboArr[1] = 1\n for (let i = 2; i <= n; i++) fiboArr[i] = (fiboArr[i - 1] + fiboArr[i - 2]) % 1234567 //1234567로 나눈 나머지로 하지 않으면 정수범위 초과\n return fiboArr[n]\n}","probId":"12945","createdAt":1679394094353,"lang":"JavaScript"},{"id":"4DrrCFprxb0yTmo9JtSSy","author":"jaewon1676","code":"function solution(n) {\n let f_1 = 0;\n let f_2 = 1;\n \n for (let i=2; i<=n; i++) {\n let temp = (f_1 + f_2) % 1234567;\n f_1 = f_2;\n f_2 = temp;\n }\n \n return f_2;\n}","probId":"12945","createdAt":1679394094353,"lang":"JavaScript"},{"id":"Y7oLGRpRRd1_S1LWhiXZ8","author":"codeisneverodd","code":"function solution(n) {\n return move(1, 3, 2, n);\n}\nconst move = (departure, destination, waypoint, numberOfPlate) => {\n if (numberOfPlate === 1) return [[departure, destination]];\n return [\n ...move(departure, waypoint, destination, numberOfPlate - 1),\n ...move(departure, destination, waypoint, 1),\n ...move(waypoint, destination, departure, numberOfPlate - 1),\n ];\n};\n//재귀를 생각해보기에 좋은 문제입니다.\n//추천 레퍼런스 https://shoark7.github.io/programming/algorithm/tower-of-hanoi\n/*\nn개가 있다면\n1. 1->2로 n-1개를 옮김\n2. 1->3으로 가장 큰 1개를 옮김\n3. 2->1로 n-2개를 옮김\n4. 2->3으로 2번에 있는 것 중 가장 큰 1개를 옮김\n의 반복\n\n결국 무엇이든 a -> b 로 n 를 옮기는 동작의 반복이므로 이를 재귀로 표현하면 됨.\na->b 로 n 을 옮기는 것은 a->c로 n-1개를 옮겨놓고, a->b로 하나를 옮긴 후, c->b로 n-1개를 옮기는 것의 반복 \n함수에서 a는 depature(출발지), b는 destination(도착지), c는 waypoint(경유지)로 작성되어있음.\n*/","probId":"12946","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ekrHtfPyU_KAhsRjznZC_","author":"codeisneverodd","code":"function solution(rows, columns, queries) {\n var answer = [];\n let matrix = new Array(rows)\n for (let i = 0; i < rows; i++) matrix[i] = new Array(columns)\n for (let i = 0; i < rows; i++) for (let j = 0; j < columns; j++) matrix[i][j] = i * columns + j + 1\n for (const query of queries) {\n let order = []\n const [row1, col1, row2, col2] = [query[0] - 1, query[1] - 1, query[2] - 1, query[3] - 1]\n //fill order (row1->row2, col1->col2, row2->row2, col2->col1)\n for (let i = row1; i <= row2; i++) order.push(matrix[i][col1])\n for (let i = col1 + 1; i <= col2; i++) order.push(matrix[row2][i])\n for (let i = row2 - 1; i >= row1; i--) order.push(matrix[i][col2])\n for (let i = col2 - 1; i > col1; i--) order.push(matrix[row1][i])\n //rotate clockwise\n order.push(order.shift())\n answer.push(Math.min(...order))\n //change value in matrix\n for (let i = row1; i <= row2; i++) matrix[i][col1] = order.shift()\n for (let i = col1 + 1; i <= col2; i++) matrix[row2][i] = order.shift()\n for (let i = row2 - 1; i >= row1; i--) matrix[i][col2] = order.shift()\n for (let i = col2 - 1; i > col1; i--) matrix[row1][i] = order.shift()\n }\n return answer;\n}","probId":"77485","createdAt":1679394094353,"lang":"JavaScript"},{"id":"B3sjdQsVrwveW4L7oRxEt","author":"codeisneverodd","code":"function solution(arr1, arr2) {\n const [row, col] = [arr1.length, arr2[0].length]\n let answer = new Array(row);\n for (let i = 0; i < row; i++) answer[i] = new Array(col)\n //arr1의 열의 개수 = arr2의 행의 개수, arr1의 i번째 행과 arr2의 j번째 열의 원소들을 곱한 것들의 합이 answer[i][j] 값\n for (let i = 0; i < row; i++) {\n for (let j = 0; j < col; j++) {\n answer[i][j] = arr1[i].reduce((sum, arr1Value, rowIndex) => sum + arr1Value * arr2[rowIndex][j], 0)\n }\n }\n return answer;\n}","probId":"12949","createdAt":1679394094353,"lang":"JavaScript"},{"id":"iKL3fAei0gfK59hQFY4XZ","author":"prove-ability","code":"function solution(arr1, arr2) {\n var answer = [];\n // 행만큼 반복\n for(let i = 0, len = arr1.length; i < len; i++) {\n const arr = []\n // 열만큼 반복\n for(let j = 0, len = arr1[i].length; j < len; j++) {\n // 각의 배열에서 행을 더해서 arr push\n arr.push(arr1[i][j] + arr2[i][j])\n }\n // 열 만큼 추가된 arr 를 answer 가 추가\n answer.push(arr)\n }\n \n return answer;\n}","probId":"12949","createdAt":1679394094353,"lang":"JavaScript"},{"id":"ehCNYvlPKOQOovwHefyQa","author":"codeisneverodd","code":"function solution(relation) {\n //1. 가능한 조합을 1개~Attribute개수 만큼 찾는다.\n //2. 해당 개수의 조합이 키가 될 수 있는지 검사하고, 가능하면 후보키에 추가한다.\n //3. 단 추가하려고 할 때, 후보키에 있는 값이 자신의 부분 집합이 될 수 있으면 추가하지 않는다.\n const keys = []\n const totalAttrCount = relation[0].length\n const indexList = Array.from(Array(totalAttrCount), (x, index) => index) // [0,1,2,3 ... totalAttrCount-1]\n\n //Fn for 2. 해당 조합으로 각 row의 attribute를 모았을 때 중복이 있는지를 반환하는 함수\n const isUnique = (relation, attrIndexComb) => {\n let result = Array.from(Array(relation.length), x => '')\n for (const attrIndex of attrIndexComb) {\n relation.forEach((row, rowIndex) => result[rowIndex] += row[attrIndex]) //Set를 이용해 중복 검사를 하기 위해 result에 string으로 넣음.\n }\n return result.length === [...new Set(result)].length\n }\n\n //Fn for 3. keys에 현재 구한 검사할 조합의 부분집합이 존재하는지 반환, 단 keys에 들어있는 각 조합의 크기는 현재 검사할 조합의 크기보다 작다.\n const isMinimal = (attrComb) => {\n for (const key of keys) if (key.every(attr => attrComb.includes(attr))) return false\n return true\n }\n\n //가능한 모든 조합을 검사\n for (let attrCount = 1; attrCount <= totalAttrCount; attrCount++) {\n const combinations = getCombinations(indexList, attrCount)\n for (const attrComb of combinations) {\n if (isMinimal(attrComb) && isUnique(relation, attrComb)) keys.push(attrComb)\n }\n }\n\n return keys.length\n}\n\n//Fn for 1. 조합을 반환하는 함수\nconst getCombinations = (array, selectNumber) => {\n const result = [];\n if (selectNumber === 1) {\n return array.map((element) => [element]);\n }\n array.forEach((fixed, index, origin) => {\n const restCombinations = getCombinations(origin.slice(index + 1), selectNumber - 1);\n const attached = restCombinations.map((restCombination) => [fixed, ...restCombination]);\n result.push(...attached);\n });\n return result;\n}","probId":"42890","createdAt":1679394094353,"lang":"JavaScript"},{"id":"DfVmns6ufjgJmwcNV82zI","author":"codeisneverodd","code":"function solution(n, edge) {\n const graph = Array.from(Array(n + 1), () => [])\n for (const [src, dest] of edge) {\n graph[src].push(dest)\n graph[dest].push(src)\n }\n const distance = Array(n + 1).fill(0)\n distance[1] = 1\n const toBeSearched = [1]\n while (toBeSearched.length > 0) {\n const src = toBeSearched.shift()\n for (const dest of graph[src]) {\n if (distance[dest] === 0) {\n distance[dest] = distance[src] + 1\n toBeSearched.push(dest)\n }\n }\n }\n return distance.filter(x => x === Math.max(...distance)).length\n}","probId":"49189","createdAt":1679394094353,"lang":"JavaScript"},{"id":"4SAsYCuYpAaqiXVcDdgW2","author":"codeisneverodd","code":"function solution(n, computers) {\n let answer = 0\n const visited = new Array(n).fill(false)\n const newNetwork = (startComputer) => {\n //새로운 네트워크를 만들 시작 컴퓨터를 파라미터로 받는다.\n const toBeVisited = [startComputer]\n while (toBeVisited.length > 0) {\n //시작 컴퓨터로부터 방문 가능한 컴퓨터를 모두 방문하며 해당 컴퓨터의 visited를 true로 바꾼다\n const currentComputer = toBeVisited.pop()\n visited[currentComputer] = true\n for (let nextComputer = 0; nextComputer < n; nextComputer++) {\n if (!visited[nextComputer] && computers[currentComputer][nextComputer]) {\n toBeVisited.push(nextComputer)\n }\n }\n }\n }\n\n for (let startComputer = 0; startComputer < n; startComputer++) {\n if (!visited[startComputer]) {\n newNetwork(startComputer)\n //새로운 네트워크를 생성할 때마다 정답을 1 증가시킨다.\n answer++\n }\n }\n return answer\n}","probId":"43162","createdAt":1679394094353,"lang":"JavaScript"},{"id":"nKPtmI7XNC26XpIlYbbVA","author":"jaewon1676","code":"function solution(routes) {\n let cctv = 1; // cctv의 개수는 최소 1개\n routes.sort((a, b) => a[0] - b[0]); // 고속도로 진입 시점을 기준으로 오름차순 정렬\n // [ [ -20, -15 ], [ -18, -13 ], [ -14, -5 ], [ -5, -3 ] ]\n let out = routes[0][1]; // -15\n // 나간 시점(out)은 첫 차량의 나간시점으로 초기화\n \n for(let i = 1; i < routes.length; i++) {\n // 나간 시점(out)보다 현재 차량의 진입이 느리다면 카메라 추가 설치\n if(out < routes[i][0]) {\n cctv++;\n out = routes[i][1]; // out 시점 업데이트\n }\n \n // 나간 시점(out)이 현재 차량의 진출시점보다 큰 경우 \n if(out > routes[i][1]) {\n out = routes[i][1]; // out 시점 업데이트 \n }\n }\n \n return cctv;\n}\n// 그리디\n\n// 우리는 카메라를 최소로 설치 해야합니다. 그러기 위해서는 고속도로 진입 시점을 기준으로 오름차순 정렬을(빨리 진입한 순) 합니다.\n// 이렇게 되면 배열에 있는 모든 고속도로 진입 시점은 배열의 첫번째 고속도로 진입 시점보다 더 뒤에 있습니다. 그러므로 우리는 \n// 나간시점만 검사 해주면 됩니다.\n\n// 먼저 첫번째 routes의 고속도로를 빠져나간 시점을 out 변수에 담아줍니다.\n// 이 out 변수를 두번째 routes의 고속도로를 빠져나간 시점과 비교하여 out 변수보다 route[i][1]가 크면 ( 나간 시간이 느리면)\n// cctv를 하나 늘려줍니다. , out 변수를 갱신 하며 세번째, 네번째도 계속 비교해줍니다.","probId":"42884","createdAt":1679394094353,"lang":"JavaScript"},{"id":"FyidIwW1ocs08d8zOmC5U","author":"codeisneverodd","code":"//Map과 고차함수를 적극적으로 이용한 풀이\nfunction solution(genres, plays) {\n const genreMap = new Map(); // {genre:{totalPlay:number, songs:[{play:number, id:number}, ...]}\n genres\n .map((genre, id) => [genre, plays[id]])\n .forEach(([genre, play], id) => {\n const data = genreMap.get(genre) || {totalPlay: 0, songs: []}\n genreMap.set(genre, {\n totalPlay: data.totalPlay + play,\n songs: [...data.songs, {play: play, id: id}]\n .sort((a, b) => b.play - a.play)\n .slice(0, 2)\n })\n })\n\n return [...genreMap.entries()] //entries => [[genre, {totalPlay, songs}], ...]\n .sort((a, b) => b[1].totalPlay - a[1].totalPlay)\n .flatMap(item => item[1].songs) // [[songs], [songs]] => [songs, songs]\n .map(song => song.id)\n}","probId":"42579","createdAt":1679394094353,"lang":"JavaScript"},{"id":"0f66lOgRfqED_HCdCqEw_","author":"codeisneverodd","code":"function solution(tickets) {\n const routes = [] //최종 가능 루트들을 담을 배열\n const makeRoutes = (currentDepart, remainTickets, currentRoute) => {\n //현재 출발지, 남은 티켓들, 현재 까지 만든 루트를 기반으로 경로를 만들어 가는 재귀 함수\n if (remainTickets.length > 0) {\n remainTickets.forEach(([depart, nextDepart], index) => {\n if (depart === currentDepart)\n //현재 출발지와 같은 출발지를 가진 티켓이 있다면, 해당 티켓을 사용하고 해당 티켓의 도착지를 다음 출발지로 지정\n makeRoutes(\n nextDepart,\n [...remainTickets.slice(0, index), ...remainTickets.slice(index + 1)],\n [...currentRoute, currentDepart])\n })\n } else {\n //티켓을 모두 사용하면 최종 가능 루트에 포함\n routes.push([...currentRoute, currentDepart])\n }\n }\n makeRoutes(\"ICN\", tickets, [])\n return routes.sort()[0]\n}","probId":"43164","createdAt":1679394094353,"lang":"JavaScript"},{"id":"-Jf1bx2PH3d58y5kpI3HP","author":"jaewon1676","code":"function solution(operations) {\n var answer = [];\n for (let i = 0; i < operations.length; i++) {\n // 숫자 삽입\n if (operations[i][0] == 'I') {\n let m = operations[i].substring(2, operations[i].length);\n answer.push(m);\n }\n // if 최댓값 삭제\n else if (operations[i][0] == 'D' && operations[i][2] == '1' && operations.length > 0) {\n answer.pop();\n }\n // if 최솟값 삭제\n else if (operations[i][0] == 'D' && operations[i][2] == '-' && operations[i][3] == '1' && operations.length > 0) {\n answer.shift();\n }\n\n answer.sort((a, b) => {\n return a - b;\n });\n }\n if (answer.length == 0) return [0, 0];\n else {\n return [parseInt(answer.pop()), parseInt(answer.shift())];\n }\n}\n/* 풀이 과정\n1. 연산 처리를 구별하기 위해 배열의 0번째 자리, 2번째 자리에 있는 등을 비교하여 조건에 따른 명령을 실행한다.\n2. answer 배열을 정렬 해준다\n3. 큐가 비어있으면 ( length == 0 ) 0을 반환. , 그렇지 않으면 [최댓값, 최솟값]을 반환한다.\n*/","probId":"42628","createdAt":1679394094353,"lang":"JavaScript"},{"id":"gZxB5yD_He6RsHLSk2pdY","author":"codeisneverodd","code":"function solution(n, times) {\n //최소로 걸릴 수 있는 시간 left, 최대로 걸릴 수 있는 시간 right\n let [left, right] = [1, Math.max(...times) * n];\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const sum = times.reduce((acc, time) => acc + Math.floor(mid / time), 0);\n //sum은 mid 시간 동안 처리 할 수 있는 사람의 수\n if (sum < n) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n // left 가 right를 넘어갔다는 것은 left가 n보다 크거나 같아져서 n명을 수용할 수 최소값이 되있다는 것이다.\n return left;\n}","probId":"43238","createdAt":1679394094353,"lang":"JavaScript"},{"id":"qRYf80Us-O-lhErUFQ2mK","author":"ryong9rrr","code":"class Node {\n constructor(value = '') {\n this.value = value\n this.children = new Map()\n this.count = 0\n }\n}\n\nclass Trie {\n constructor() {\n this.root = new Node()\n }\n\n insert(string) {\n let currentNode = this.root\n for (const char of string) {\n if (!currentNode.children.has(char)) {\n currentNode.children.set(char, new Node(currentNode.value + char))\n }\n currentNode = currentNode.children.get(char)\n currentNode.count++\n }\n }\n\n startsWithCount(prefix) {\n let currentNode = this.root\n for (const char of prefix) {\n if (!currentNode.children.has(char)) {\n return 0\n }\n currentNode = currentNode.children.get(char)\n }\n return currentNode.count\n }\n}\n\nfunction reverseString(string) {\n return [...string].reverse().join('')\n}\n\nfunction solution(words, queries) {\n const table = {}\n const reverseTable = {}\n const counter = {}\n\n words.forEach((word) => {\n const key = word.length\n if (!table[key]) table[key] = new Trie()\n if (!reverseTable[key]) reverseTable[key] = new Trie()\n table[key].insert(word)\n reverseTable[key].insert(reverseString(word))\n if (counter[key] === undefined) counter[key] = 0\n counter[key]++\n })\n\n return queries.map((query) => {\n const key = query.length\n if (!table[key]) {\n return 0\n }\n const tQuery = query.replace(/\\?/g, '')\n if (!tQuery) {\n return counter[key]\n }\n if (query[query.length - 1] === '?') {\n return table[key].startsWithCount(tQuery)\n }\n return reverseTable[key].startsWithCount(reverseString(tQuery))\n })\n}","probId":"60060","createdAt":1679394094353,"lang":"JavaScript"},{"id":"PcDl6DL2PASDq1U6OtLKw","author":"codeisneverodd","code":"//코드 참고자료: https://velog.io/@longroadhome/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LV.4-%EB%8B%A8%EC%96%B4-%ED%8D%BC%EC%A6%90\nfunction solution(strs, t) {\n const tLength = t.length; //자주 쓰는 값 미리 계산\n //Infinity 로 선언을 해야 조합이 불가능한 영역의 값을 무한으로 두고, 그 영역에 하나를 더해도 불가능하다는 것을 Infinity로 표현할 수 있게 된다.\n const minCountToIndex = new Array(tLength).fill(Infinity);\n for (let currentIndex = 0; currentIndex < tLength; currentIndex++) {\n //내가 검사할 부분은 t의 0~currentIndex 영역\n const currentSlice = t.slice(0, currentIndex + 1);\n for (const str of strs) {\n //현재 영역이 strs에 있는 조각들 중 하나로 끝난다면\n if (currentSlice.endsWith(str)) {\n //frontLength 는 str 조각을 제외한 앞 쪽의 남은 조각의 길이\n const frontLength = currentIndex - str.length + 1;\n if (frontLength === 0) {\n //앞쪽에 남은 것이 없다면, 현재 검사중인 영역 = strs에 있는 조각\n minCountToIndex[currentIndex] = 1;\n } else {\n //앞쪽에 남은 것이 있다면, 현재 검사중이 영역까지 필요한 조각 수는, 지금까지 구한 최소 값과 지금 구한 값 중 최소값\n minCountToIndex[currentIndex] = Math.min(minCountToIndex[currentIndex], minCountToIndex[frontLength - 1] + 1);\n }\n }\n }\n }\n //마지막 영역이 Infinity 이면 만들기 불가능한 단어, 아니라면 마지막 영역의 값을 리턴\n return minCountToIndex[tLength - 1] === Infinity ? -1 : minCountToIndex[tLength - 1];\n}\n\n//리드미 테스트용 코멘트","probId":"12983","createdAt":1679394094353,"lang":"JavaScript"},{"id":"l5j723vS_BE1IKwxV_QEr","author":"ryong9rrr","code":"function solution(food_times, k) {\n const total = food_times.reduce((a, b) => a + b)\n if (total <= k) {\n return -1\n }\n\n // stack으로 풀기\n const stack = food_times.map((time, i) => [time, i + 1]).sort(([timeA], [timeB]) => timeB - timeA)\n\n let prev = 0\n while (stack.length > 0 && k >= 0) {\n const [time] = stack[stack.length - 1]\n const acc = (time - prev) * stack.length\n if (k < acc) {\n break\n }\n stack.pop()\n k -= acc\n prev = time\n }\n\n const result = stack\n .reverse()\n .map(([_, order]) => order)\n .sort((orderA, orderB) => orderA - orderB)\n return result[k % result.length]\n}","probId":"42891","createdAt":1679394094353,"lang":"JavaScript"},{"id":"_IJtm5VqJrpQBeBjgqmqR","author":"cg10036","code":"function solution(n) {\n const fact = n => n ? BigInt(n) * fact(n - 1) : 1n;\n return fact(n * 2) / (fact(n) * fact(n + 1));\n}","probId":"12929","createdAt":1679394094353,"lang":"JavaScript"},{"id":"BTdcGyOdhPdWZDIfAuU6m","author":"codeisneverodd","code":"function solution(key, lock) {\n const N = lock.length;\n const M = key.length;\n const extendedLock = (() => {\n const arr = Array.from({ length: N + 2 * M }, () =>\n Array(N + 2 * M).fill(0)\n );\n for (let i = 0; i < N; i++) {\n for (let j = 0; j < N; j++) {\n arr[M + i][M + j] = lock[i][j];\n }\n }\n return arr;\n })();\n\n const keys = (() => {\n const rotate = (arr) =>\n arr[0].map((_, colI) => arr.map((row) => row[colI]).reverse());\n\n const M = key.length;\n let result = [key];\n for (let i = 0; i < 3; i++) {\n result.push(rotate(result[result.length - 1]));\n }\n return result;\n })();\n\n const check = (key, startIndex) => {\n const result = JSON.parse(JSON.stringify(extendedLock));\n const [x, y] = startIndex;\n for (let i = 0; i < M; i++) {\n for (let j = 0; j < M; j++) {\n result[x + i][y + j] += key[i][j];\n }\n }\n\n for (let i = M; i < M + N; i++) {\n for (let j = M; j < M + N; j++) {\n if (result[i][j] !== 1) return false;\n }\n }\n return true;\n };\n\n for (let i = 0; i < N + M; i++) {\n for (let j = 0; j < N + M; j++) {\n if (keys.some((k) => check(k, [i, j]))) return true;\n }\n }\n\n return false;\n}\n","probId":"60059","createdAt":1679422464406,"lang":"JavaScript"}] \ No newline at end of file diff --git "a/level-0/2\354\260\250\354\233\220\354\234\274\353\241\234-\353\247\214\353\223\244\352\270\260&120842&.js" "b/level-0/2\354\260\250\354\233\220\354\234\274\353\241\234-\353\247\214\353\223\244\352\270\260&120842&.js" deleted file mode 100644 index 24affdc..0000000 --- "a/level-0/2\354\260\250\354\233\220\354\234\274\353\241\234-\353\247\214\353\223\244\352\270\260&120842&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num_list, n) { - let result = []; - for (let i = 0; i < num_list.length / n; i++) { - result = [...result, num_list.slice(i * n, i * n + n)]; - } - return result; -} diff --git "a/level-0/369\352\262\214\354\236\204&120891&.js" "b/level-0/369\352\262\214\354\236\204&120891&.js" deleted file mode 100644 index 4e4415e..0000000 --- "a/level-0/369\352\262\214\354\236\204&120891&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(order) { - return [...('' + order)].filter(num => num === '3' || num === '6' || num === '9').length; -} diff --git "a/level-0/7\354\235\230-\352\260\234\354\210\230&120912&.js" "b/level-0/7\354\235\230-\352\260\234\354\210\230&120912&.js" deleted file mode 100644 index 873de1e..0000000 --- "a/level-0/7\354\235\230-\352\260\234\354\210\230&120912&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(array) { - return [...array.join('')].filter(a => a === '7').length; -} diff --git "a/level-0/A\353\241\234-B-\353\247\214\353\223\244\352\270\260&120886&.js" "b/level-0/A\353\241\234-B-\353\247\214\353\223\244\352\270\260&120886&.js" deleted file mode 100644 index 2077ea2..0000000 --- "a/level-0/A\353\241\234-B-\353\247\214\353\223\244\352\270\260&120886&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(before, after) { - const sort = str => [...str].sort((a, b) => (a < b ? -1 : a !== b ? 1 : 0)).join(''); - return sort(before) === sort(after) ? 1 : 0; -} diff --git "a/level-0/OX\355\200\264\354\246\210&120907&.js" "b/level-0/OX\355\200\264\354\246\210&120907&.js" deleted file mode 100644 index f28d23e..0000000 --- "a/level-0/OX\355\200\264\354\246\210&120907&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(quiz) { - return quiz.map(q => { - const [formula, answer] = q.split('='); - return eval(formula) === +answer ? 'O' : 'X'; - }); -} diff --git "a/level-0/k\354\235\230-\352\260\234\354\210\230&120887&.js" "b/level-0/k\354\235\230-\352\260\234\354\210\230&120887&.js" deleted file mode 100644 index cebb90d..0000000 --- "a/level-0/k\354\235\230-\352\260\234\354\210\230&120887&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(i, j, k) { - let count = 0; - for (let num = i; num <= j; num++) { - count += [...('' + num)].filter(n => +n === k).length; - } - return count; -} diff --git "a/level-0/n\354\235\230-\353\260\260\354\210\230-\352\263\240\353\245\264\352\270\260&120905&.js" "b/level-0/n\354\235\230-\353\260\260\354\210\230-\352\263\240\353\245\264\352\270\260&120905&.js" deleted file mode 100644 index 9d44755..0000000 --- "a/level-0/n\354\235\230-\353\260\260\354\210\230-\352\263\240\353\245\264\352\270\260&120905&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n, numlist) { - return numlist.filter(num => num % n === 0); -} diff --git "a/level-0/\352\260\200\352\271\214\354\232\264-\354\210\230&120890&.js" "b/level-0/\352\260\200\352\271\214\354\232\264-\354\210\230&120890&.js" deleted file mode 100644 index ee4c433..0000000 --- "a/level-0/\352\260\200\352\271\214\354\232\264-\354\210\230&120890&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(array, n) { - const minDiff = Math.min(...array.map(a => Math.abs(a - n))); - return array.sort((a, b) => a - b).find(a => Math.abs(a - n) === minDiff); -} diff --git "a/level-0/\352\260\200\354\234\204-\353\260\224\354\234\204-\353\263\264&120839&.js" "b/level-0/\352\260\200\354\234\204-\353\260\224\354\234\204-\353\263\264&120839&.js" deleted file mode 100644 index 94afcdf..0000000 --- "a/level-0/\352\260\200\354\234\204-\353\260\224\354\234\204-\353\263\264&120839&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(rsp) { - const win = { 0: 5, 2: 0, 5: 2 }; - return [...rsp].map(num => win[num]).join(''); -} diff --git "a/level-0/\352\260\200\354\236\245-\355\201\260-\354\210\230-\354\260\276\352\270\260&120899&.js" "b/level-0/\352\260\200\354\236\245-\355\201\260-\354\210\230-\354\260\276\352\270\260&120899&.js" deleted file mode 100644 index a861b97..0000000 --- "a/level-0/\352\260\200\354\236\245-\355\201\260-\354\210\230-\354\260\276\352\270\260&120899&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(array) { - const max = Math.max(...array); - return [max, array.indexOf(max)]; -} diff --git "a/level-0/\352\260\201\353\217\204\352\270\260&120829&.js" "b/level-0/\352\260\201\353\217\204\352\270\260&120829&.js" deleted file mode 100644 index e21ec41..0000000 --- "a/level-0/\352\260\201\353\217\204\352\270\260&120829&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(angle) { - if (angle === 180) return 4; - if (angle > 90) return 3; - if (angle === 90) return 2; - return 1; -} diff --git "a/level-0/\352\260\234\353\257\270-\352\265\260\353\213\250&120837&.js" "b/level-0/\352\260\234\353\257\270-\352\265\260\353\213\250&120837&.js" deleted file mode 100644 index 9624393..0000000 --- "a/level-0/\352\260\234\353\257\270-\352\265\260\353\213\250&120837&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(hp) { - const first = Math.floor(hp / 5); - const second = Math.floor((hp - first * 5) / 3); - const third = hp - first * 5 - second * 3; - return first + second + third; -} diff --git "a/level-0/\352\262\271\354\271\230\353\212\224-\354\204\240\353\266\204\354\235\230-\352\270\270\354\235\264&120876&.js" "b/level-0/\352\262\271\354\271\230\353\212\224-\354\204\240\353\266\204\354\235\230-\352\270\270\354\235\264&120876&.js" deleted file mode 100644 index df5f34e..0000000 --- "a/level-0/\352\262\271\354\271\230\353\212\224-\354\204\240\353\266\204\354\235\230-\352\270\270\354\235\264&120876&.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(lines) { - const visited = lines.reduce((a, [x, y]) => { - for (let i = Math.min(x, y) + 1; i <= Math.max(x, y); i++) a[i] = a[i] ? a[i] + 1 : 1; - return a; - }, {}); - - return Object.values(visited).filter(v => v > 1).length; -} diff --git "a/level-0/\352\263\265-\353\215\230\354\247\200\352\270\260&120843&.js" "b/level-0/\352\263\265-\353\215\230\354\247\200\352\270\260&120843&.js" deleted file mode 100644 index ecb6380..0000000 --- "a/level-0/\352\263\265-\353\215\230\354\247\200\352\270\260&120843&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers, k) { - const goNext = current => (current + 2) % numbers.length; - let current = 0; - for (let i = 0; i < k - 1; i++) current = goNext(current); - return numbers[current]; -} diff --git "a/level-0/\352\265\254\354\212\254\354\235\204-\353\202\230\353\210\204\353\212\224-\352\262\275\354\232\260\354\235\230-\354\210\230&120840&.js" "b/level-0/\352\265\254\354\212\254\354\235\204-\353\202\230\353\210\204\353\212\224-\352\262\275\354\232\260\354\235\230-\354\210\230&120840&.js" deleted file mode 100644 index bdcfcf3..0000000 --- "a/level-0/\352\265\254\354\212\254\354\235\204-\353\202\230\353\210\204\353\212\224-\352\262\275\354\232\260\354\235\230-\354\210\230&120840&.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(balls, share) { - const [n, m] = [balls, share]; - const fact = [BigInt(1), BigInt(1)]; - - for (let i = 2; i <= n; i++) fact[i] = fact[i - 1] * BigInt(i); - - return Number(fact[n] / (fact[n - m] * fact[m])); -} diff --git "a/level-0/\353\202\230\353\250\270\354\247\200-\352\265\254\355\225\230\352\270\260&120810&.js" "b/level-0/\353\202\230\353\250\270\354\247\200-\352\265\254\355\225\230\352\270\260&120810&.js" deleted file mode 100644 index dc0a2c4..0000000 --- "a/level-0/\353\202\230\353\250\270\354\247\200-\352\265\254\355\225\230\352\270\260&120810&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num1, num2) { - return num1 % num2; -} diff --git "a/level-0/\353\202\230\354\235\264-\354\266\234\353\240\245&120820&.js" "b/level-0/\353\202\230\354\235\264-\354\266\234\353\240\245&120820&.js" deleted file mode 100644 index 26db990..0000000 --- "a/level-0/\353\202\230\354\235\264-\354\266\234\353\240\245&120820&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(age) { - return 2022 - age + 1; -} diff --git "a/level-0/\353\213\244\354\235\214\354\227\220-\354\230\254-\354\210\253\354\236\220&120924&.js" "b/level-0/\353\213\244\354\235\214\354\227\220-\354\230\254-\354\210\253\354\236\220&120924&.js" deleted file mode 100644 index 9c6f012..0000000 --- "a/level-0/\353\213\244\354\235\214\354\227\220-\354\230\254-\354\210\253\354\236\220&120924&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(common) { - const isAP = arr => arr[2] - arr[1] === arr[1] - arr[0]; - return isAP(common) - ? common[common.length - 1] + common[1] - common[0] - : common[common.length - 1] * (common[1] / common[0]); -} diff --git "a/level-0/\353\213\244\355\225\255\354\213\235-\353\215\224\355\225\230\352\270\260&120863&.js" "b/level-0/\353\213\244\355\225\255\354\213\235-\353\215\224\355\225\230\352\270\260&120863&.js" deleted file mode 100644 index f243aef..0000000 --- "a/level-0/\353\213\244\355\225\255\354\213\235-\353\215\224\355\225\230\352\270\260&120863&.js" +++ /dev/null @@ -1,22 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(polynomial) { - const countX = x => { - const count = x.replaceAll('x', ''); - return count === '' ? 1 : +count; - }; - - const count = polynomial - .split(' + ') - .reduce((a, c) => (c.includes('x') ? { ...a, x: a.x + countX(c) } : { ...a, num: a.num + +c }), { - x: 0, - num: 0, - }); - - const x = count.x > 0 ? `${count.x > 1 ? count.x : ''}x` : ''; - const num = count.num > 0 ? '' + count.num : ''; - const plus = x !== '' && num !== '' ? ' + ' : ''; - - return x + plus + num; -} diff --git "a/level-0/\353\214\200\353\254\270\354\236\220\354\231\200-\354\206\214\353\254\270\354\236\220&120893&.js" "b/level-0/\353\214\200\353\254\270\354\236\220\354\231\200-\354\206\214\353\254\270\354\236\220&120893&.js" deleted file mode 100644 index b7c8a5c..0000000 --- "a/level-0/\353\214\200\353\254\270\354\236\220\354\231\200-\354\206\214\353\254\270\354\236\220&120893&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - return [...my_string].map(char => (char === char.toUpperCase() ? char.toLowerCase() : char.toUpperCase())).join(''); -} \ No newline at end of file diff --git "a/level-0/\353\221\220-\354\210\230\354\235\230-\352\263\261&120804&.js" "b/level-0/\353\221\220-\354\210\230\354\235\230-\352\263\261&120804&.js" deleted file mode 100644 index 99e32c9..0000000 --- "a/level-0/\353\221\220-\354\210\230\354\235\230-\352\263\261&120804&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num1, num2) { - return num1 * num2; -} diff --git "a/level-0/\353\221\220-\354\210\230\354\235\230-\353\202\230\353\210\227\354\205\210&120806&.js" "b/level-0/\353\221\220-\354\210\230\354\235\230-\353\202\230\353\210\227\354\205\210&120806&.js" deleted file mode 100644 index 3f9065f..0000000 --- "a/level-0/\353\221\220-\354\210\230\354\235\230-\353\202\230\353\210\227\354\205\210&120806&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num1, num2) { - return Math.floor((num1 / num2) * 1000); -} diff --git "a/level-0/\353\221\220-\354\210\230\354\235\230-\354\260\250&120803&.js" "b/level-0/\353\221\220-\354\210\230\354\235\230-\354\260\250&120803&.js" deleted file mode 100644 index 48d89cb..0000000 --- "a/level-0/\353\221\220-\354\210\230\354\235\230-\354\260\250&120803&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num1, num2) { - return num1 - num2; -} diff --git "a/level-0/\353\221\220-\354\210\230\354\235\230-\355\225\251&120802&.js" "b/level-0/\353\221\220-\354\210\230\354\235\230-\355\225\251&120802&.js" deleted file mode 100644 index 514526e..0000000 --- "a/level-0/\353\221\220-\354\210\230\354\235\230-\355\225\251&120802&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num1, num2) { - return num1 + num2 -} \ No newline at end of file diff --git "a/level-0/\353\223\261\354\210\230-\353\247\244\352\270\260\352\270\260&120882&.js" "b/level-0/\353\223\261\354\210\230-\353\247\244\352\270\260\352\270\260&120882&.js" deleted file mode 100644 index 5c01af3..0000000 --- "a/level-0/\353\223\261\354\210\230-\353\247\244\352\270\260\352\270\260&120882&.js" +++ /dev/null @@ -1,12 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(score) { - const avgs = score.map(([a, b]) => (a + b) / 2); - const avgRank = [...avgs] - .sort((a, b) => b - a) - .map((avg, i) => ({ avg, rank: i + 1 })) - .map((a, i, arr) => (i > 0 && a.avg === arr[i - 1].avg ? { ...a, rank: arr[i - 1].rank } : a)); - - return avgs.map(_avg => avgRank.find(({ avg }) => _avg === avg).rank); -} diff --git "a/level-0/\353\241\234\352\267\270\354\235\270-\354\204\261\352\263\265?&120883&.js" "b/level-0/\353\241\234\352\267\270\354\235\270-\354\204\261\352\263\265?&120883&.js" deleted file mode 100644 index 82f42d8..0000000 --- "a/level-0/\353\241\234\352\267\270\354\235\270-\354\204\261\352\263\265?&120883&.js" +++ /dev/null @@ -1,8 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(id_pw, db) { - const [id, pw] = id_pw; - if (!db.find(([_id]) => _id === id)) return 'fail'; - return db.find(([_id, _pw]) => _id === id && _pw === pw) ? 'login' : 'wrong pw'; -} diff --git "a/level-0/\353\250\270\354\223\261\354\235\264\353\263\264\353\213\244-\355\202\244-\355\201\260-\354\202\254\353\236\214&120585&.js" "b/level-0/\353\250\270\354\223\261\354\235\264\353\263\264\353\213\244-\355\202\244-\355\201\260-\354\202\254\353\236\214&120585&.js" deleted file mode 100644 index 0a70867..0000000 --- "a/level-0/\353\250\270\354\223\261\354\235\264\353\263\264\353\213\244-\355\202\244-\355\201\260-\354\202\254\353\236\214&120585&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(array, height) { - return array.filter(a => a > height).length; -} diff --git "a/level-0/\353\252\250\354\212\244\353\266\200\355\230\270-(1)&120838&.js" "b/level-0/\353\252\250\354\212\244\353\266\200\355\230\270-(1)&120838&.js" deleted file mode 100644 index 032c628..0000000 --- "a/level-0/\353\252\250\354\212\244\353\266\200\355\230\270-(1)&120838&.js" +++ /dev/null @@ -1,16 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(letter) { - const morse = { - '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f', - '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l', - '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r', - '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x', - '-.--':'y','--..':'z' - } - return letter - .split(' ') - .map(l => morse[l]) - .join(''); -} diff --git "a/level-0/\353\252\250\354\235\214-\354\240\234\352\261\260&120849&.js" "b/level-0/\353\252\250\354\235\214-\354\240\234\352\261\260&120849&.js" deleted file mode 100644 index 9781d17..0000000 --- "a/level-0/\353\252\250\354\235\214-\354\240\234\352\261\260&120849&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - return my_string.replace(/[aeiou]/g, ''); -} diff --git "a/level-0/\353\252\253-\352\265\254\355\225\230\352\270\260&120805&.js" "b/level-0/\353\252\253-\352\265\254\355\225\230\352\270\260&120805&.js" deleted file mode 100644 index d199103..0000000 --- "a/level-0/\353\252\253-\352\265\254\355\225\230\352\270\260&120805&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num1, num2) { - return Math.floor(num1 / num2); -} diff --git "a/level-0/\353\254\270\354\236\220-\353\260\230\353\263\265-\354\266\234\353\240\245\355\225\230\352\270\260&120825&.js" "b/level-0/\353\254\270\354\236\220-\353\260\230\353\263\265-\354\266\234\353\240\245\355\225\230\352\270\260&120825&.js" deleted file mode 100644 index 16b267b..0000000 --- "a/level-0/\353\254\270\354\236\220-\353\260\230\353\263\265-\354\266\234\353\240\245\355\225\230\352\270\260&120825&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string, n) { - return [...my_string].map(char => char.repeat(n)).join(''); -} diff --git "a/level-0/\353\254\270\354\236\220\354\227\264-\352\263\204\354\202\260\355\225\230\352\270\260&120902&.js" "b/level-0/\353\254\270\354\236\220\354\227\264-\352\263\204\354\202\260\355\225\230\352\270\260&120902&.js" deleted file mode 100644 index d0c4618..0000000 --- "a/level-0/\353\254\270\354\236\220\354\227\264-\352\263\204\354\202\260\355\225\230\352\270\260&120902&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - return eval(my_string); -} diff --git "a/level-0/\353\254\270\354\236\220\354\227\264-\353\222\244\354\247\221\352\270\260&120822&.js" "b/level-0/\353\254\270\354\236\220\354\227\264-\353\222\244\354\247\221\352\270\260&120822&.js" deleted file mode 100644 index e728b21..0000000 --- "a/level-0/\353\254\270\354\236\220\354\227\264-\353\222\244\354\247\221\352\270\260&120822&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - return [...my_string].reverse().join(''); -} diff --git "a/level-0/\353\254\270\354\236\220\354\227\264-\353\260\200\352\270\260&120921&.js" "b/level-0/\353\254\270\354\236\220\354\227\264-\353\260\200\352\270\260&120921&.js" deleted file mode 100644 index 03a03b5..0000000 --- "a/level-0/\353\254\270\354\236\220\354\227\264-\353\260\200\352\270\260&120921&.js" +++ /dev/null @@ -1,12 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(A, B) { - const pushRight = str => [str[str.length - 1], ...str.slice(0, str.length - 1)].join(''); - for (let i = 0; i <= A.length; i++) { - if (A === B) return i; - A = pushRight(A); - } - - return -1; -} diff --git "a/level-0/\353\254\270\354\236\220\354\227\264-\354\240\225\353\240\254\355\225\230\352\270\260-(1)&120850&.js" "b/level-0/\353\254\270\354\236\220\354\227\264-\354\240\225\353\240\254\355\225\230\352\270\260-(1)&120850&.js" deleted file mode 100644 index 61a3f82..0000000 --- "a/level-0/\353\254\270\354\236\220\354\227\264-\354\240\225\353\240\254\355\225\230\352\270\260-(1)&120850&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - return my_string - .match(/[0-9]/g) - .map(str => +str) - .sort((a, b) => a - b); -} diff --git "a/level-0/\353\254\270\354\236\220\354\227\264-\354\240\225\353\240\254\355\225\230\352\270\260-(2)&120911&.js" "b/level-0/\353\254\270\354\236\220\354\227\264-\354\240\225\353\240\254\355\225\230\352\270\260-(2)&120911&.js" deleted file mode 100644 index ac952aa..0000000 --- "a/level-0/\353\254\270\354\236\220\354\227\264-\354\240\225\353\240\254\355\225\230\352\270\260-(2)&120911&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - return [...my_string] - .map(char => char.toLowerCase()) - .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)) - .join(''); -} diff --git "a/level-0/\353\254\270\354\236\220\354\227\264\354\225\210\354\227\220-\353\254\270\354\236\220\354\227\264&120908&.js" "b/level-0/\353\254\270\354\236\220\354\227\264\354\225\210\354\227\220-\353\254\270\354\236\220\354\227\264&120908&.js" deleted file mode 100644 index 09dea0e..0000000 --- "a/level-0/\353\254\270\354\236\220\354\227\264\354\225\210\354\227\220-\353\254\270\354\236\220\354\227\264&120908&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(str1, str2) { - return str1.includes(str2) ? 1 : 2; -} diff --git "a/level-0/\353\260\260\354\227\264-\353\221\220-\353\260\260-\353\247\214\353\223\244\352\270\260&120809&.js" "b/level-0/\353\260\260\354\227\264-\353\221\220-\353\260\260-\353\247\214\353\223\244\352\270\260&120809&.js" deleted file mode 100644 index 7637b49..0000000 --- "a/level-0/\353\260\260\354\227\264-\353\221\220-\353\260\260-\353\247\214\353\223\244\352\270\260&120809&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers) { - return numbers.map(n => n * 2); -} diff --git "a/level-0/\353\260\260\354\227\264-\353\222\244\354\247\221\352\270\260&120821&.js" "b/level-0/\353\260\260\354\227\264-\353\222\244\354\247\221\352\270\260&120821&.js" deleted file mode 100644 index d6d4759..0000000 --- "a/level-0/\353\260\260\354\227\264-\353\222\244\354\247\221\352\270\260&120821&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num_list) { - return num_list.reverse(); -} diff --git "a/level-0/\353\260\260\354\227\264-\354\233\220\354\206\214\354\235\230-\352\270\270\354\235\264&120854&.js" "b/level-0/\353\260\260\354\227\264-\354\233\220\354\206\214\354\235\230-\352\270\270\354\235\264&120854&.js" deleted file mode 100644 index 32ac56e..0000000 --- "a/level-0/\353\260\260\354\227\264-\354\233\220\354\206\214\354\235\230-\352\270\270\354\235\264&120854&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(strlist) { - return strlist.map(s => s.length); -} diff --git "a/level-0/\353\260\260\354\227\264-\354\236\220\353\245\264\352\270\260&120833&.js" "b/level-0/\353\260\260\354\227\264-\354\236\220\353\245\264\352\270\260&120833&.js" deleted file mode 100644 index c04d4df..0000000 --- "a/level-0/\353\260\260\354\227\264-\354\236\220\353\245\264\352\270\260&120833&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers, num1, num2) { - return numbers.slice(num1, num2 + 1); -} diff --git "a/level-0/\353\260\260\354\227\264-\355\232\214\354\240\204\354\213\234\355\202\244\352\270\260&120844&.js" "b/level-0/\353\260\260\354\227\264-\355\232\214\354\240\204\354\213\234\355\202\244\352\270\260&120844&.js" deleted file mode 100644 index 711d42b..0000000 --- "a/level-0/\353\260\260\354\227\264-\355\232\214\354\240\204\354\213\234\355\202\244\352\270\260&120844&.js" +++ /dev/null @@ -1,8 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers, direction) { - return direction === 'right' - ? [numbers[numbers.length - 1], ...numbers.slice(0, numbers.length - 1)] - : [...numbers.slice(1), numbers[0]]; -} diff --git "a/level-0/\353\260\260\354\227\264\354\235\230-\354\234\240\354\202\254\353\217\204&120903&.js" "b/level-0/\353\260\260\354\227\264\354\235\230-\354\234\240\354\202\254\353\217\204&120903&.js" deleted file mode 100644 index fa9550c..0000000 --- "a/level-0/\353\260\260\354\227\264\354\235\230-\354\234\240\354\202\254\353\217\204&120903&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(s1, s2) { - return s1.filter(s => s2.includes(s)).length; -} diff --git "a/level-0/\353\260\260\354\227\264\354\235\230-\355\217\211\352\267\240\352\260\222&120817&.js" "b/level-0/\353\260\260\354\227\264\354\235\230-\355\217\211\352\267\240\352\260\222&120817&.js" deleted file mode 100644 index c97a515..0000000 --- "a/level-0/\353\260\260\354\227\264\354\235\230-\355\217\211\352\267\240\352\260\222&120817&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers) { - return numbers.reduce((a, c) => a + c, 0) / numbers.length; -} diff --git "a/level-0/\353\266\204\354\210\230\354\235\230-\353\215\247\354\205\210&120808&.js" "b/level-0/\353\266\204\354\210\230\354\235\230-\353\215\247\354\205\210&120808&.js" deleted file mode 100644 index 1b66e1a..0000000 --- "a/level-0/\353\266\204\354\210\230\354\235\230-\353\215\247\354\205\210&120808&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(denum1, num1, denum2, num2) { - const denum = denum2 * num1 + denum1 * num2; - const num = num1 * num2; - const getGCD = (a, b) => (b === 0 ? a : getGCD(b, a % b)); - const gcd = getGCD(denum, num); - return [denum / gcd, num / gcd]; -} diff --git "a/level-0/\354\202\274\352\260\201\355\230\225\354\235\230-\354\231\204\354\204\261\354\241\260\352\261\264-(1)&120889&.js" "b/level-0/\354\202\274\352\260\201\355\230\225\354\235\230-\354\231\204\354\204\261\354\241\260\352\261\264-(1)&120889&.js" deleted file mode 100644 index 17ff2b2..0000000 --- "a/level-0/\354\202\274\352\260\201\355\230\225\354\235\230-\354\231\204\354\204\261\354\241\260\352\261\264-(1)&120889&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(sides) { - const max = Math.max(...sides); - return max < sides.reduce((a, c) => a + c, 0) - max ? 1 : 2; -} diff --git "a/level-0/\354\202\274\352\260\201\355\230\225\354\235\230-\354\231\204\354\204\261\354\241\260\352\261\264-(2)&120868&.js" "b/level-0/\354\202\274\352\260\201\355\230\225\354\235\230-\354\231\204\354\204\261\354\241\260\352\261\264-(2)&120868&.js" deleted file mode 100644 index a4e0b37..0000000 --- "a/level-0/\354\202\274\352\260\201\355\230\225\354\235\230-\354\231\204\354\204\261\354\241\260\352\261\264-(2)&120868&.js" +++ /dev/null @@ -1,14 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(sides) { - const min = Math.min(...sides); - const max1 = Math.max(...sides); - const max2 = min + max1 - 1; - return max2 - (max1 - min); -} - -//정답 2 - codeisneverodd -function solution(sides) { - return Math.min(...sides) * 2 - 1; -} diff --git "a/level-0/\354\204\270\352\267\240-\354\246\235\354\213\235&120910&.js" "b/level-0/\354\204\270\352\267\240-\354\246\235\354\213\235&120910&.js" deleted file mode 100644 index 0dffb96..0000000 --- "a/level-0/\354\204\270\352\267\240-\354\246\235\354\213\235&120910&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n, t) { - return n * 2 ** t; -} diff --git "a/level-0/\354\206\214\354\235\270\354\210\230\353\266\204\355\225\264&120852&.js" "b/level-0/\354\206\214\354\235\270\354\210\230\353\266\204\355\225\264&120852&.js" deleted file mode 100644 index 7540490..0000000 --- "a/level-0/\354\206\214\354\235\270\354\210\230\353\266\204\355\225\264&120852&.js" +++ /dev/null @@ -1,29 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - let pFactors = []; - for (let i = 2; i <= Math.sqrt(n); i++) { - while (n % i === 0) { - pFactors = [...pFactors, i]; - n /= i; - } - } - if (n >= 2) pFactors = [...pFactors, n]; - return [...new Set(pFactors)].sort((a, b) => a - b); -} - -const funcB = () => { - return new Promise(resolve => { - setTimeout(resolve('guys'), 1000); - }); -}; - -const funcC = async () => { - const m = 1; - const res = await funcB(); - return res; -}; -window.addEventListener('DOMContentLoaded', async () => { - console.log(await funcC()); -}); diff --git "a/level-0/\354\210\234\354\204\234\354\214\215\354\235\230-\352\260\234\354\210\230&120836&.js" "b/level-0/\354\210\234\354\204\234\354\214\215\354\235\230-\352\260\234\354\210\230&120836&.js" deleted file mode 100644 index 99ee6e6..0000000 --- "a/level-0/\354\210\234\354\204\234\354\214\215\354\235\230-\352\260\234\354\210\230&120836&.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - let count = 0; - for (let i = 1; i < Math.sqrt(n); i++) { - if (n % i === 0) count += 2; - } - if (n % Math.sqrt(n) === 0) count += 1; - return count; -} diff --git "a/level-0/\354\210\250\354\226\264\354\236\210\353\212\224-\354\210\253\354\236\220\354\235\230-\353\215\247\354\205\210-(1)&120851&.js" "b/level-0/\354\210\250\354\226\264\354\236\210\353\212\224-\354\210\253\354\236\220\354\235\230-\353\215\247\354\205\210-(1)&120851&.js" deleted file mode 100644 index 08f71f5..0000000 --- "a/level-0/\354\210\250\354\226\264\354\236\210\353\212\224-\354\210\253\354\236\220\354\235\230-\353\215\247\354\205\210-(1)&120851&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - return my_string.match(/[0-9]/g).reduce((a, c) => a + +c, 0); -} diff --git "a/level-0/\354\210\250\354\226\264\354\236\210\353\212\224-\354\210\253\354\236\220\354\235\230-\353\215\247\354\205\210-(2)&120864&.js" "b/level-0/\354\210\250\354\226\264\354\236\210\353\212\224-\354\210\253\354\236\220\354\235\230-\353\215\247\354\205\210-(2)&120864&.js" deleted file mode 100644 index 8efbb5a..0000000 --- "a/level-0/\354\210\250\354\226\264\354\236\210\353\212\224-\354\210\253\354\236\220\354\235\230-\353\215\247\354\205\210-(2)&120864&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - const nums = my_string.match(/[0-9]+/g); - return nums ? nums.map(num => +num).reduce((a, c) => a + c, 0) : 0; -} diff --git "a/level-0/\354\210\253\354\236\220-\353\271\204\352\265\220\355\225\230\352\270\260&120807&.js" "b/level-0/\354\210\253\354\236\220-\353\271\204\352\265\220\355\225\230\352\270\260&120807&.js" deleted file mode 100644 index 3e9246a..0000000 --- "a/level-0/\354\210\253\354\236\220-\353\271\204\352\265\220\355\225\230\352\270\260&120807&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num1, num2) { - return num1 === num2 ? 1 : -1; -} diff --git "a/level-0/\354\210\253\354\236\220-\354\260\276\352\270\260&120904&.js" "b/level-0/\354\210\253\354\236\220-\354\260\276\352\270\260&120904&.js" deleted file mode 100644 index 6a64cfe..0000000 --- "a/level-0/\354\210\253\354\236\220-\354\260\276\352\270\260&120904&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num, k) { - const index = [...('' + num)].findIndex(n => +n === k); - return index === -1 ? -1 : index + 1; -} diff --git "a/level-0/\354\225\204\354\235\264\354\212\244-\354\225\204\353\251\224\353\246\254\354\271\264\353\205\270&120819&.js" "b/level-0/\354\225\204\354\235\264\354\212\244-\354\225\204\353\251\224\353\246\254\354\271\264\353\205\270&120819&.js" deleted file mode 100644 index 1d3b080..0000000 --- "a/level-0/\354\225\204\354\235\264\354\212\244-\354\225\204\353\251\224\353\246\254\354\271\264\353\205\270&120819&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(money) { - return [Math.floor(money / 5500), money % 5500]; -} diff --git "a/level-0/\354\225\210\354\240\204\354\247\200\353\214\200&120866&.js" "b/level-0/\354\225\210\354\240\204\354\247\200\353\214\200&120866&.js" deleted file mode 100644 index b675974..0000000 --- "a/level-0/\354\225\210\354\240\204\354\247\200\353\214\200&120866&.js" +++ /dev/null @@ -1,30 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(board) { - const isBombNearby = (r, c) => { - const nearby = [ - [-1, -1], - [-1, 0], - [-1, 1], - [0, -1], - [0, 1], - [1, -1], - [1, 0], - [1, 1], - ]; - - const isInBoard = (r, c) => r >= 0 && r < board.length && c >= 0 && c < board.length; - - return nearby.some(([dR, dC]) => isInBoard(r + dR, c + dC) && board[r + dR][c + dC] === 1); - }; - - let count = 0; - - for (let r = 0; r < board.length; r++) { - for (let c = 0; c < board.length; c++) { - if (board[r][c] !== 1 && !isBombNearby(r, c)) count += 1; - } - } - return count; -} diff --git "a/level-0/\354\225\224\355\230\270-\355\225\264\353\217\205&120892&.js" "b/level-0/\354\225\224\355\230\270-\355\225\264\353\217\205&120892&.js" deleted file mode 100644 index 960f78a..0000000 --- "a/level-0/\354\225\224\355\230\270-\355\225\264\353\217\205&120892&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(cipher, code) { - return [...cipher].reduce((a, c, i) => ((i + 1) % code === 0 ? a + c : a), ''); -} diff --git "a/level-0/\354\225\275\354\210\230-\352\265\254\355\225\230\352\270\260&120897&.js" "b/level-0/\354\225\275\354\210\230-\352\265\254\355\225\230\352\270\260&120897&.js" deleted file mode 100644 index 4cbd275..0000000 --- "a/level-0/\354\225\275\354\210\230-\352\265\254\355\225\230\352\270\260&120897&.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - let answer = []; - for (let i = 1; i < Math.sqrt(n); i++) { - if (n % i === 0) answer = [...answer, i, n / i]; - } - if (Number.isInteger(Math.sqrt(n))) answer = [...answer, Math.sqrt(n)]; - return answer.sort((a, b) => a - b); -} diff --git "a/level-0/\354\226\221\352\274\254\354\271\230&120830&.js" "b/level-0/\354\226\221\352\274\254\354\271\230&120830&.js" deleted file mode 100644 index 81b2485..0000000 --- "a/level-0/\354\226\221\352\274\254\354\271\230&120830&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n, k) { - return n * 12000 + (k - Math.floor(n / 10)) * 2000; -} diff --git "a/level-0/\354\227\260\354\206\215\353\220\234-\354\210\230\354\235\230-\355\225\251&120923&.js" "b/level-0/\354\227\260\354\206\215\353\220\234-\354\210\230\354\235\230-\355\225\251&120923&.js" deleted file mode 100644 index f67702e..0000000 --- "a/level-0/\354\227\260\354\206\215\353\220\234-\354\210\230\354\235\230-\355\225\251&120923&.js" +++ /dev/null @@ -1,8 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num, total) { - const numArr = Array.from({ length: num }, (_, i) => i); - const sum = numArr.reduce((a, c) => a + c); - return numArr.map(n => n - (sum - total) / num); -} diff --git "a/level-0/\354\230\201\354\226\264\352\260\200-\354\213\253\354\226\264\354\232\224&120894&.js" "b/level-0/\354\230\201\354\226\264\352\260\200-\354\213\253\354\226\264\354\232\224&120894&.js" deleted file mode 100644 index eb1f8c6..0000000 --- "a/level-0/\354\230\201\354\226\264\352\260\200-\354\213\253\354\226\264\354\232\224&120894&.js" +++ /dev/null @@ -1,8 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers) { - const nums = { zero: 0, one: 1, two: 2, three: 3, four: 4, five: 5, six: 6, seven: 7, eight: 8, nine: 9 }; - const regex = new RegExp(Object.keys(nums).join('|'), 'g'); - return +numbers.replace(regex, key => nums[key]); -} diff --git "a/level-0/\354\230\267\352\260\200\352\262\214-\355\225\240\354\235\270-\353\260\233\352\270\260&120818&.js" "b/level-0/\354\230\267\352\260\200\352\262\214-\355\225\240\354\235\270-\353\260\233\352\270\260&120818&.js" deleted file mode 100644 index 0fbd920..0000000 --- "a/level-0/\354\230\267\352\260\200\352\262\214-\355\225\240\354\235\270-\353\260\233\352\270\260&120818&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(price) { - if (price >= 500000) return Math.floor(price * 0.8); - if (price >= 300000) return Math.floor(price * 0.9); - if (price >= 100000) return Math.floor(price * 0.95); - return price; -} diff --git "a/level-0/\354\230\271\354\225\214\354\235\264&120956&.js" "b/level-0/\354\230\271\354\225\214\354\235\264&120956&.js" deleted file mode 100644 index a8bfecb..0000000 --- "a/level-0/\354\230\271\354\225\214\354\235\264&120956&.js" +++ /dev/null @@ -1,15 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(babbling) { - const convertPWordsToNum = word => { - const pWords = ['aya', 'ye', 'woo', 'ma']; - return pWords.reduce((result, pWord, i) => result.replaceAll(pWord, i), word); - }; - const canPronounce = word => { - const result = convertPWordsToNum(word); - return !/[^\d]/.test(result) && [...result].every((num, i) => i + 1 > result.length || num !== result[i + 1]); - }; - - return babbling.filter(b => canPronounce(b)).length; -} diff --git "a/level-0/\354\231\270\352\263\204\354\226\264-\354\202\254\354\240\204&120869&.js" "b/level-0/\354\231\270\352\263\204\354\226\264-\354\202\254\354\240\204&120869&.js" deleted file mode 100644 index 505e556..0000000 --- "a/level-0/\354\231\270\352\263\204\354\226\264-\354\202\254\354\240\204&120869&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(spell, dic) { - const sort = str => [...str].sort((a, b) => (a < b ? -1 : a !== b ? 1 : 0)).join(''); - return dic.find(dic => sort(dic) === sort(spell.join(''))) ? 1 : 2; -} diff --git "a/level-0/\354\231\270\352\263\204\355\226\211\354\204\261\354\235\230-\353\202\230\354\235\264&120834&.js" "b/level-0/\354\231\270\352\263\204\355\226\211\354\204\261\354\235\230-\353\202\230\354\235\264&120834&.js" deleted file mode 100644 index 996b91b..0000000 --- "a/level-0/\354\231\270\352\263\204\355\226\211\354\204\261\354\235\230-\353\202\230\354\235\264&120834&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(age) { - return [...('' + age)].map(num => String.fromCharCode('a'.charCodeAt(0) + +num)).join(''); -} \ No newline at end of file diff --git "a/level-0/\354\234\240\355\225\234\354\206\214\354\210\230-\355\214\220\353\263\204\355\225\230\352\270\260&120878&.js" "b/level-0/\354\234\240\355\225\234\354\206\214\354\210\230-\355\214\220\353\263\204\355\225\230\352\270\260&120878&.js" deleted file mode 100644 index fe8b4f7..0000000 --- "a/level-0/\354\234\240\355\225\234\354\206\214\354\210\230-\355\214\220\353\263\204\355\225\230\352\270\260&120878&.js" +++ /dev/null @@ -1,26 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(a, b) { - const getGCD = (a, b) => { - let gcd = 1; - for (let i = 1; i <= Math.min(a, b); i++) { - if (a % i === 0 && b % i === 0) gcd = i; - } - return gcd; - }; - - const getPrimeFactors = num => { - let pFactors = []; - for (let i = 2; i <= Math.sqrt(num); i++) { - while (num % i === 0) { - pFactors = [...pFactors, i]; - num /= i; - } - } - if (num > 2) pFactors = [...pFactors, num]; - return pFactors; - }; - - return getPrimeFactors(b / getGCD(a, b)).find(n => n !== 2 && n !== 5) ? 2 : 1; -} diff --git "a/level-0/\354\235\264\354\247\204\354\210\230-\353\215\224\355\225\230\352\270\260&120885&.js" "b/level-0/\354\235\264\354\247\204\354\210\230-\353\215\224\355\225\230\352\270\260&120885&.js" deleted file mode 100644 index ea257ef..0000000 --- "a/level-0/\354\235\264\354\247\204\354\210\230-\353\215\224\355\225\230\352\270\260&120885&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(bin1, bin2) { - return (parseInt(bin1, 2) + parseInt(bin2, 2)).toString(2); -} diff --git "a/level-0/\354\235\270\353\215\261\354\212\244-\353\260\224\352\276\270\352\270\260&120895&.js" "b/level-0/\354\235\270\353\215\261\354\212\244-\353\260\224\352\276\270\352\270\260&120895&.js" deleted file mode 100644 index 176b728..0000000 --- "a/level-0/\354\235\270\353\215\261\354\212\244-\353\260\224\352\276\270\352\270\260&120895&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string, num1, num2) { - const str = [...my_string]; - - [str[num1], str[num2]] = [str[num2], str[num1]]; - - return str.join(''); -} diff --git "a/level-0/\354\236\220\353\246\277\354\210\230-\353\215\224\355\225\230\352\270\260&120906&.js" "b/level-0/\354\236\220\353\246\277\354\210\230-\353\215\224\355\225\230\352\270\260&120906&.js" deleted file mode 100644 index 0b60127..0000000 --- "a/level-0/\354\236\220\353\246\277\354\210\230-\353\215\224\355\225\230\352\270\260&120906&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - return [...('' + n)].map(num => +num).reduce((a, c) => a + c, 0); -} diff --git "a/level-0/\354\236\230\353\235\274\354\204\234-\353\260\260\354\227\264\353\241\234-\354\240\200\354\236\245\355\225\230\352\270\260&120913&.js" "b/level-0/\354\236\230\353\235\274\354\204\234-\353\260\260\354\227\264\353\241\234-\354\240\200\354\236\245\355\225\230\352\270\260&120913&.js" deleted file mode 100644 index a854dc6..0000000 --- "a/level-0/\354\236\230\353\235\274\354\204\234-\353\260\260\354\227\264\353\241\234-\354\240\200\354\236\245\355\225\230\352\270\260&120913&.js" +++ /dev/null @@ -1,8 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_str, n) { - let result = []; - for (let i = 0; i < my_str.length / n; i++) result = [...result, my_str.slice(i * n, i * n + n)]; - return result; -} diff --git "a/level-0/\354\240\200\354\243\274\354\235\230-\354\210\253\354\236\220-3&120871&.js" "b/level-0/\354\240\200\354\243\274\354\235\230-\354\210\253\354\236\220-3&120871&.js" deleted file mode 100644 index 8e1f33a..0000000 --- "a/level-0/\354\240\200\354\243\274\354\235\230-\354\210\253\354\236\220-3&120871&.js" +++ /dev/null @@ -1,14 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - let num = 0; - let count = 0; - - while (count < n) { - num += 1; - if (!('' + num).includes('3') && num % 3 !== 0) count += 1; - } - - return num; -} diff --git "a/level-0/\354\240\220\354\235\230-\354\234\204\354\271\230-\352\265\254\355\225\230\352\270\260&120841&.js" "b/level-0/\354\240\220\354\235\230-\354\234\204\354\271\230-\352\265\254\355\225\230\352\270\260&120841&.js" deleted file mode 100644 index b84f0fd..0000000 --- "a/level-0/\354\240\220\354\235\230-\354\234\204\354\271\230-\352\265\254\355\225\230\352\270\260&120841&.js" +++ /dev/null @@ -1,8 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(dot) { - const [x, y] = dot; - if (y > 0) return x > 0 ? 1 : 2; - return x < 0 ? 3 : 4; -} diff --git "a/level-0/\354\240\234\352\263\261\354\210\230-\355\214\220\353\263\204\355\225\230\352\270\260&120909&.js" "b/level-0/\354\240\234\352\263\261\354\210\230-\355\214\220\353\263\204\355\225\230\352\270\260&120909&.js" deleted file mode 100644 index 5c55144..0000000 --- "a/level-0/\354\240\234\352\263\261\354\210\230-\355\214\220\353\263\204\355\225\230\352\270\260&120909&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - return Number.isInteger(Math.sqrt(n)) ? 1 : 2; -} diff --git "a/level-0/\354\242\205\354\235\264-\354\236\220\353\245\264\352\270\260&120922&.js" "b/level-0/\354\242\205\354\235\264-\354\236\220\353\245\264\352\270\260&120922&.js" deleted file mode 100644 index 9ec19bc..0000000 --- "a/level-0/\354\242\205\354\235\264-\354\236\220\353\245\264\352\270\260&120922&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(M, N) { - return M * N - 1; -} diff --git "a/level-0/\354\243\274\354\202\254\354\234\204\354\235\230-\352\260\234\354\210\230&120845&.js" "b/level-0/\354\243\274\354\202\254\354\234\204\354\235\230-\352\260\234\354\210\230&120845&.js" deleted file mode 100644 index ba6a201..0000000 --- "a/level-0/\354\243\274\354\202\254\354\234\204\354\235\230-\352\260\234\354\210\230&120845&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(box, n) { - return Math.floor(box[0] / n) * Math.floor(box[1] / n) * Math.floor(box[2] / n); -} diff --git "a/level-0/\354\244\221\353\263\265\353\220\234-\353\254\270\354\236\220-\354\240\234\352\261\260&120888&.js" "b/level-0/\354\244\221\353\263\265\353\220\234-\353\254\270\354\236\220-\354\240\234\352\261\260&120888&.js" deleted file mode 100644 index f2e5f0e..0000000 --- "a/level-0/\354\244\221\353\263\265\353\220\234-\353\254\270\354\236\220-\354\240\234\352\261\260&120888&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string) { - return [...new Set(my_string)].join(''); -} diff --git "a/level-0/\354\244\221\353\263\265\353\220\234-\354\210\253\354\236\220-\352\260\234\354\210\230&120583&.js" "b/level-0/\354\244\221\353\263\265\353\220\234-\354\210\253\354\236\220-\352\260\234\354\210\230&120583&.js" deleted file mode 100644 index 4428b1a..0000000 --- "a/level-0/\354\244\221\353\263\265\353\220\234-\354\210\253\354\236\220-\352\260\234\354\210\230&120583&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(array, n) { - return array.filter(a => a === n).length; -} diff --git "a/level-0/\354\244\221\354\225\231\352\260\222-\352\265\254\355\225\230\352\270\260&120811&.js" "b/level-0/\354\244\221\354\225\231\352\260\222-\352\265\254\355\225\230\352\270\260&120811&.js" deleted file mode 100644 index ed158ed..0000000 --- "a/level-0/\354\244\221\354\225\231\352\260\222-\352\265\254\355\225\230\352\270\260&120811&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(array) { - return array.sort((a, b) => a - b)[Math.floor(array.length / 2)]; -} diff --git "a/level-0/\354\247\201\352\260\201\354\202\274\352\260\201\355\230\225-\354\266\234\353\240\245\355\225\230\352\270\260&120823&.js" "b/level-0/\354\247\201\352\260\201\354\202\274\352\260\201\355\230\225-\354\266\234\353\240\245\355\225\230\352\270\260&120823&.js" deleted file mode 100644 index 9563816..0000000 --- "a/level-0/\354\247\201\352\260\201\354\202\274\352\260\201\355\230\225-\354\266\234\353\240\245\355\225\230\352\270\260&120823&.js" +++ /dev/null @@ -1,16 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -const readline = require('readline'); -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, -}); - -let input = []; - -rl.on('line', function (line) { - input = line.split(' '); -}).on('close', function () { - for (let i = 1; i <= +input[0]; i++) console.log('*'.repeat(i)); -}); diff --git "a/level-0/\354\247\201\354\202\254\352\260\201\355\230\225-\353\204\223\354\235\264-\352\265\254\355\225\230\352\270\260&120860&.js" "b/level-0/\354\247\201\354\202\254\352\260\201\355\230\225-\353\204\223\354\235\264-\352\265\254\355\225\230\352\270\260&120860&.js" deleted file mode 100644 index dc022c9..0000000 --- "a/level-0/\354\247\201\354\202\254\352\260\201\355\230\225-\353\204\223\354\235\264-\352\265\254\355\225\230\352\270\260&120860&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(dots) { - const xDots = dots.flatMap(([x, y]) => x); - const yDots = dots.flatMap(([x, y]) => y); - const width = Math.max(...xDots) - Math.min(...xDots); - const height = Math.max(...yDots) - Math.min(...yDots); - return width * height; -} diff --git "a/level-0/\354\247\204\353\243\214\354\210\234\354\204\234-\354\240\225\355\225\230\352\270\260&120835&.js" "b/level-0/\354\247\204\353\243\214\354\210\234\354\204\234-\354\240\225\355\225\230\352\270\260&120835&.js" deleted file mode 100644 index 6efc72e..0000000 --- "a/level-0/\354\247\204\353\243\214\354\210\234\354\204\234-\354\240\225\355\225\230\352\270\260&120835&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(emergency) { - const sorted = [...emergency].sort((a, b) => b - a); - return emergency.map(e => sorted.findIndex(s => s === e) + 1); -} diff --git "a/level-0/\354\247\235\354\210\230-\355\231\200\354\210\230-\352\260\234\354\210\230&120824&.js" "b/level-0/\354\247\235\354\210\230-\355\231\200\354\210\230-\352\260\234\354\210\230&120824&.js" deleted file mode 100644 index 3312f99..0000000 --- "a/level-0/\354\247\235\354\210\230-\355\231\200\354\210\230-\352\260\234\354\210\230&120824&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(num_list) { - const evenLength = num_list.filter(n => n % 2 === 0).length; - return [evenLength, num_list.length - evenLength]; -} diff --git "a/level-0/\354\247\235\354\210\230\353\212\224-\354\213\253\354\226\264\354\232\224&120813&.js" "b/level-0/\354\247\235\354\210\230\353\212\224-\354\213\253\354\226\264\354\232\224&120813&.js" deleted file mode 100644 index e308d35..0000000 --- "a/level-0/\354\247\235\354\210\230\353\212\224-\354\213\253\354\226\264\354\232\224&120813&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - let nums = []; - for (let i = 0; i <= n; i++) { - if (i % 2 === 1) nums = [...nums, i]; - } - return nums; -} diff --git "a/level-0/\354\247\235\354\210\230\354\235\230-\355\225\251&120831&.js" "b/level-0/\354\247\235\354\210\230\354\235\230-\355\225\251&120831&.js" deleted file mode 100644 index 8c6c310..0000000 --- "a/level-0/\354\247\235\354\210\230\354\235\230-\355\225\251&120831&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - let answer = 0; - for (let i = 0; i <= n; i++) { - if (i % 2 === 0) answer += i; - } - return answer; -} diff --git "a/level-0/\354\265\234\353\214\223\352\260\222-\353\247\214\353\223\244\352\270\260(1)&120847&.js" "b/level-0/\354\265\234\353\214\223\352\260\222-\353\247\214\353\223\244\352\270\260(1)&120847&.js" deleted file mode 100644 index bcd34e7..0000000 --- "a/level-0/\354\265\234\353\214\223\352\260\222-\353\247\214\353\223\244\352\270\260(1)&120847&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers) { - const [first, second, ...rest] = numbers.sort((a, b) => b - a); - return first * second; -} diff --git "a/level-0/\354\265\234\353\214\223\352\260\222-\353\247\214\353\223\244\352\270\260-(2)&120862&.js" "b/level-0/\354\265\234\353\214\223\352\260\222-\353\247\214\353\223\244\352\270\260-(2)&120862&.js" deleted file mode 100644 index 62a9b75..0000000 --- "a/level-0/\354\265\234\353\214\223\352\260\222-\353\247\214\353\223\244\352\270\260-(2)&120862&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers) { - const sorted = numbers.sort((a, b) => a - b); - return Math.max(sorted[0] * sorted[1], sorted[sorted.length - 1] * sorted[sorted.length - 2]); -} diff --git "a/level-0/\354\265\234\353\271\210\352\260\222-\352\265\254\355\225\230\352\270\260&120812&.js" "b/level-0/\354\265\234\353\271\210\352\260\222-\352\265\254\355\225\230\352\270\260&120812&.js" deleted file mode 100644 index 5682839..0000000 --- "a/level-0/\354\265\234\353\271\210\352\260\222-\352\265\254\355\225\230\352\270\260&120812&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(array) { - const counts = array.reduce((a, c) => (a[c] ? { ...a, [c]: a[c] + 1 } : { ...a, [c]: 1 }), {}); - const max = Math.max(...Object.values(counts)); - const modes = Object.keys(counts).filter(key => counts[key] === max); - return modes.length === 1 ? +modes[0] : -1; -} diff --git "a/level-0/\354\271\230\355\202\250-\354\277\240\355\217\260&120884&.js" "b/level-0/\354\271\230\355\202\250-\354\277\240\355\217\260&120884&.js" deleted file mode 100644 index 52ed4f4..0000000 --- "a/level-0/\354\271\230\355\202\250-\354\277\240\355\217\260&120884&.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(chicken) { - const order = coupons => { - if (coupons < 10) return 0; - const service = Math.floor(coupons / 10); - return service + order(service + (coupons % 10)); - }; - return order(chicken); -} diff --git "a/level-0/\354\272\220\353\246\255\355\204\260\354\235\230-\354\242\214\355\221\234&120861&.js" "b/level-0/\354\272\220\353\246\255\355\204\260\354\235\230-\354\242\214\355\221\234&120861&.js" deleted file mode 100644 index 32889ce..0000000 --- "a/level-0/\354\272\220\353\246\255\355\204\260\354\235\230-\354\242\214\355\221\234&120861&.js" +++ /dev/null @@ -1,43 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(keyinput, board) { - const moves = { - up: [0, 1], - down: [0, -1], - left: [-1, 0], - right: [1, 0], - }; - const [rangeX, rangeY] = [Math.floor(board[0] / 2), Math.floor(board[1] / 2)]; - - return keyinput - .map(key => moves[key]) - .reduce( - ([x, y], [mX, mY]) => (Math.abs(x + mX) > rangeX || Math.abs(y + mY) > rangeY ? [x, y] : [x + mX, y + mY]), - [0, 0] - ); -} - -//정답 2 - codeisneverodd -//명령형 -function solution(keyinput, board) { - const moves = { - up: [0, 1], - down: [0, -1], - left: [-1, 0], - right: [1, 0], - }; - const [rangeX, rangeY] = [Math.floor(board[0] / 2), Math.floor(board[1] / 2)]; - - let pos = [0, 0]; - - keyinput - .map(key => moves[key]) - .forEach(move => { - if (Math.abs(move[0] + pos[0]) > rangeX || Math.abs(move[1] + pos[1]) > rangeY) return; - pos[0] += move[0]; - pos[1] += move[1]; - }); - - return pos; -} diff --git "a/level-0/\354\273\250\355\212\270\353\241\244-\354\240\234\355\212\270&120853&.js" "b/level-0/\354\273\250\355\212\270\353\241\244-\354\240\234\355\212\270&120853&.js" deleted file mode 100644 index eb35f6f..0000000 --- "a/level-0/\354\273\250\355\212\270\353\241\244-\354\240\234\355\212\270&120853&.js" +++ /dev/null @@ -1,8 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(s) { - const arr = s.split(' '); - while (arr.includes('Z')) arr.splice(arr.indexOf('Z') - 1, 2); - return arr.map(n => +n).reduce((a, c) => a + c, 0); -} diff --git "a/level-0/\355\212\271\354\235\264\355\225\234-\354\240\225\353\240\254&120880&.js" "b/level-0/\355\212\271\354\235\264\355\225\234-\354\240\225\353\240\254&120880&.js" deleted file mode 100644 index 8422a58..0000000 --- "a/level-0/\355\212\271\354\235\264\355\225\234-\354\240\225\353\240\254&120880&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numlist, n) { - return numlist.sort((a, b) => { - const [aDiff, bDiff] = [Math.abs(a - n), Math.abs(b - n)]; - if (aDiff === bDiff) return b - a; - return aDiff - bDiff; - }); -} diff --git "a/level-0/\355\212\271\354\240\225-\353\254\270\354\236\220-\354\240\234\352\261\260\355\225\230\352\270\260&120826&.js" "b/level-0/\355\212\271\354\240\225-\353\254\270\354\236\220-\354\240\234\352\261\260\355\225\230\352\270\260&120826&.js" deleted file mode 100644 index bb9f820..0000000 --- "a/level-0/\355\212\271\354\240\225-\353\254\270\354\236\220-\354\240\234\352\261\260\355\225\230\352\270\260&120826&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(my_string, letter) { - return my_string.replaceAll(letter, ''); -} diff --git "a/level-0/\355\214\251\355\206\240\353\246\254\354\226\274&120848&.js" "b/level-0/\355\214\251\355\206\240\353\246\254\354\226\274&120848&.js" deleted file mode 100644 index d888302..0000000 --- "a/level-0/\355\214\251\355\206\240\353\246\254\354\226\274&120848&.js" +++ /dev/null @@ -1,9 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - let factorial = [1, 1]; - for (let i = 2; n > factorial[i - 1]; i++) factorial[i] = factorial[i - 1] * i; - - return factorial[factorial.length - 1] === n ? factorial.length - 1 : factorial.length - 2; -} diff --git "a/level-0/\355\216\270\354\247\200&120898&.js" "b/level-0/\355\216\270\354\247\200&120898&.js" deleted file mode 100644 index a146a61..0000000 --- "a/level-0/\355\216\270\354\247\200&120898&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(message) { - return message.length * 2; -} diff --git "a/level-0/\355\217\211\355\226\211&120875&.js" "b/level-0/\355\217\211\355\226\211&120875&.js" deleted file mode 100644 index b8a3f33..0000000 --- "a/level-0/\355\217\211\355\226\211&120875&.js" +++ /dev/null @@ -1,15 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(dots) { - const getInclination = ([[x1, y1], [x2, y2]]) => (x2 !== x1 ? (y2 - y1) / (x2 - x1) : Infinity); - const isParallel = (line1, line2) => getInclination(line1) === getInclination(line2); - - return dots.some(dot => { - const line1 = [dots[0], dot]; - const line2 = dots.filter(dot => !line1.includes(dot)); - return isParallel(line1, line2); - }) - ? 1 - : 0; -} diff --git "a/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(1)&120814&.js" "b/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(1)&120814&.js" deleted file mode 100644 index 06cac15..0000000 --- "a/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(1)&120814&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - return Math.floor((n - 1) / 7) + 1; -} diff --git "a/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(2)&120815&.js" "b/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(2)&120815&.js" deleted file mode 100644 index a0a72c7..0000000 --- "a/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(2)&120815&.js" +++ /dev/null @@ -1,12 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - const getLCM = (a, b) => { - let lcm = 1; - while ((lcm % a !== 0 || lcm % b !== 0) && lcm < a * b) lcm += 1; - return lcm; - }; - - return getLCM(n, 6) / 6; -} diff --git "a/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(3)&120816&.js" "b/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(3)&120816&.js" deleted file mode 100644 index f37f5b7..0000000 --- "a/level-0/\355\224\274\354\236\220-\353\202\230\353\210\240-\353\250\271\352\270\260-(3)&120816&.js" +++ /dev/null @@ -1,6 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(slice, n) { - return Math.floor((n - 1) / slice) + 1; -} diff --git "a/level-0/\355\225\234-\353\262\210\353\247\214-\353\223\261\354\236\245\355\225\234-\353\254\270\354\236\220&120896&.js" "b/level-0/\355\225\234-\353\262\210\353\247\214-\353\223\261\354\236\245\355\225\234-\353\254\270\354\236\220&120896&.js" deleted file mode 100644 index c22230e..0000000 --- "a/level-0/\355\225\234-\353\262\210\353\247\214-\353\223\261\354\236\245\355\225\234-\353\254\270\354\236\220&120896&.js" +++ /dev/null @@ -1,10 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(s) { - const count = [...s].reduce((a, c) => (a[c] ? { ...a, [c]: a[c] + 1 } : { ...a, [c]: 1 }), {}); - return Object.keys(count) - .filter(key => count[key] === 1) - .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0)) - .join(''); -} diff --git "a/level-0/\355\225\251\354\204\261\354\210\230-\354\260\276\352\270\260&120846&.js" "b/level-0/\355\225\251\354\204\261\354\210\230-\354\260\276\352\270\260&120846&.js" deleted file mode 100644 index 7a9cf4f..0000000 --- "a/level-0/\355\225\251\354\204\261\354\210\230-\354\260\276\352\270\260&120846&.js" +++ /dev/null @@ -1,19 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - const isPrime = num => { - for (let i = 2; i <= Math.sqrt(num); i++) { - if (num % i === 0) return true; - } - return false; - }; - - let count = 0; - - for (let i = 1; i <= n; i++) { - if (isPrime(i)) count += 1; - } - - return count; -} diff --git "a/level-1/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" "b/level-1/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" deleted file mode 100644 index 86a6c59..0000000 --- "a/level-1/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - 본인의 깃허브 아이디 -function solution(n) { - //프로그래머스에 제출하여 통과된 함수를 복사 붙여넣기 해주세요! -} - -//정답 2 - 본인의 깃허브 아이디 -function solution(n) { - //정답을 다른 방법으로도 작성했다면 추가해 주세요! -} diff --git "a/level-1/2016\353\205\204&12901&.js" "b/level-1/2016\353\205\204&12901&.js" deleted file mode 100644 index 64caabd..0000000 --- "a/level-1/2016\353\205\204&12901&.js" +++ /dev/null @@ -1,65 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(a, b) { - let count = 0; - const day = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]; - const month = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - for (let i = 1; i < a; i++) count += month[i]; - count += b; - return day[(count + 4) % 7]; // 금요일 부터 1일 이므로 -} - -//정답 2 - yongchanson -function solution(a, b) { - const month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - const week = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]; - - let sum = b; - for ( - let i = 0; - i < a - 1; - i++ //ex)5월인 경우 1~4월까지 더해준다. - ) - sum += month[i]; - - return week[sum % 7]; //1일이 금요일이므로, 0이면 목요일이 출력되어야 한다. -} - -//정답 3 - chaerin-dev -function solution(a, b) { - let week = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]; - let dateStr = "2016-" + a + "- " + b; - let date = new Date(dateStr); - return week[date.getDay()]; -} - -//정답 4 - chaerin-dev -function solution(a, b) { - let arr = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - let week = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]; - // 1월 1일부터 a월 b일까지 며칠 차이인지 저장할 변수 - let passedDays = 0; - // a달 전까지의 모든 달에 대해 각 달의 날짜 수 더해줌 - for (let i = 1; i < a; i++) passedDays += arr[i]; - // b일 더해주고 1월 0일이 아닌 1월 1일부터 시작하므로 1 빼줌 - passedDays += b - 1; - return week[(5 + passedDays) % 7]; -} - -//정답 5 - prove-ability -function solution(a, b) { - var answer = ""; - // 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? - const days = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]; - const daysOfMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - // 2016년 1월 1일은 금요일로 4를 더해준다 - let totalDays = 4; - // a 이전 모든 달의 일 수를 더한다 - for (let i = 0, len = a - 1; i < len; i++) { - totalDays += daysOfMonth[i]; - } - // totalDays 와 해당 일을 더해주고 7로 나눈 나머지 - const dayIndex = (totalDays + b) % 7; - return days[dayIndex]; -} diff --git "a/level-1/3\354\247\204\353\262\225-\353\222\244\354\247\221\352\270\260&68935&.js" "b/level-1/3\354\247\204\353\262\225-\353\222\244\354\247\221\352\270\260&68935&.js" deleted file mode 100644 index cd1e85a..0000000 --- "a/level-1/3\354\247\204\353\262\225-\353\222\244\354\247\221\352\270\260&68935&.js" +++ /dev/null @@ -1,37 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n) { - return parseInt(n.toString(3).split("").reverse().join(""), 3); -} - -//정답 2 - codeisneverodd -function solution(n) { - var answer = 0; - const ternaryReversed = decimalToTernaryReversed(n); - answer = parseInt(ternaryReversed, 3); - return answer; -} - -const decimalToTernaryReversed = (num) => { - let ternary = ""; - while (num >= 3) { - ternary += (num % 3).toString(); - num = Math.floor(num / 3); - } - ternary += num.toString(); - return ternary; -}; - -//정답 3 - jaewon1676 -function solution(n) { - var answer = n.toString(3).split("").reverse().join(""); - - return parseInt(answer, 3); -} - - -//정답 4 - prove-ability -function solution(n) { - return parseInt(n.toString(3).split("").reverse().join(""), 3) -} diff --git "a/level-1/K\353\262\210\354\247\270\354\210\230&42748&.js" "b/level-1/K\353\262\210\354\247\270\354\210\230&42748&.js" deleted file mode 100644 index b843b25..0000000 --- "a/level-1/K\353\262\210\354\247\270\354\210\230&42748&.js" +++ /dev/null @@ -1,60 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(array, commands) { - return commands.map((cmd) => { - const arrCmd = array.slice(cmd[0] - 1, cmd[1]).sort((a, b) => a - b); - return arrCmd[cmd[2] - 1]; - }); -} - -//정답 2 - jaewon1676 -function solution(array, commands) { - var result = []; - var temp = []; - for (var i = 0; i < commands.length; i++) { - temp = array.slice(commands[i][0] - 1, commands[i][1]).sort((a, b) => { - return a - b; - }); - console.log(temp); - result.push(temp[commands[i][2] - 1]); - } - return result; -} - -// 정답 3 - prove-ability -function solution(array, commands) { - var answer = []; - commands.forEach(([i, j, k]) => { - const su = array.slice(i - 1, j).sort((a, b) => a - b)[k - 1]; - answer.push(su); - }); - return answer; -} - -//정답 4 - createhb21 - -function solution(array, commands) { - let answer = []; - for (let i = 0; i < commands.length; i++) { - let eachCommand = commands[i]; - let slice = array.slice(eachCommand[0] - 1, eachCommand[1]); - answer.push(slice.sort((a, b) => a - b)[eachCommand[2] - 1]); - } - return answer; -} - -// 정답 5 - chaerin-dev -function solution(array, commands) { - let t = commands.length; - let answer = []; - while (t--) { - let command = commands.shift(); - answer.push( - array.slice(command[0] - 1, command[1]).sort((a, b) => a - b)[ - command[2] - 1 - ] - ); - } - return answer; -} diff --git "a/level-1/[1\354\260\250]-\353\213\244\355\212\270-\352\262\214\354\236\204&17682&.js" "b/level-1/[1\354\260\250]-\353\213\244\355\212\270-\352\262\214\354\236\204&17682&.js" deleted file mode 100644 index 92a9564..0000000 --- "a/level-1/[1\354\260\250]-\353\213\244\355\212\270-\352\262\214\354\236\204&17682&.js" +++ /dev/null @@ -1,60 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(dartResult) { - const regex = /\d{1,2}[SDT]{1}[*|#]?/g; - let result = []; - for (const dart of dartResult.match(regex)) { - const game = [...dart.split(/([SDT]{1})/)]; - const score = game[0]; - let bonus = 1; - let option = 1; - if (game[1] === "S") bonus = 1; - if (game[1] === "D") bonus = 2; - if (game[1] === "T") bonus = 3; - - if (game[2] === "*") { - if (result.length !== 0) result[result.length - 1] *= 2; - option = 2; - } - if (game[2] === "#") option = -1; - - result.push(score ** bonus * option); - } - - return result.reduce((a, b) => a + b); -} - -//정답 2 - jaewon1676 -function solution(dartResult) { - var answer = 0; - let score = 0; - let cnt = []; - - for (let i = 0; i < dartResult.length; i++) { - //점수가 주어질때 - if (!isNaN(dartResult[i])) { - // i가 1인 경우는 10점, 그외에는 점수 - score = Number(dartResult[i - 1]) === 1 ? 10 : Number(dartResult[i]); - //보너스 S일때 - } else if (dartResult[i] === "S") { - cnt.push(score); - //보너스 D일때 - } else if (dartResult[i] === "D") { - cnt.push(Math.pow(score, 2)); - //보너스 T일때 - } else if (dartResult[i] === "T") { - cnt.push(Math.pow(score, 3)); - //옵션 *일떄 - } else if (dartResult[i] === "*") { - cnt[cnt.length - 2] = cnt[cnt.length - 2] * 2; - cnt[cnt.length - 1] = cnt[cnt.length - 1] * 2; - //옵션 #일때 - } else if (dartResult[i] === "#") { - cnt[cnt.length - 1] = -1 * cnt[cnt.length - 1]; - } - } - //3개의 점수 합산 - answer = cnt.reduce((acc, cur) => acc + cur, 0); - return answer; -} diff --git "a/level-1/[1\354\260\250]-\353\271\204\353\260\200\354\247\200\353\217\204&17681&.js" "b/level-1/[1\354\260\250]-\353\271\204\353\260\200\354\247\200\353\217\204&17681&.js" deleted file mode 100644 index 572270d..0000000 --- "a/level-1/[1\354\260\250]-\353\271\204\353\260\200\354\247\200\353\217\204&17681&.js" +++ /dev/null @@ -1,62 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n, arr1, arr2) { - const answer = []; - for (let i = 0; i < n; i++) { - let row = (arr1[i] | arr2[i]).toString(2); //Bitwise - row = "0".repeat(n - row.length) + row; - row = row.replace(/[10]/g, (a) => (+a ? "#" : " ")); - answer.push(row); - } - return answer; -} - -//정답 2 - codeisneverodd -function solution(n, arr1, arr2) { - var answer = []; - let mapA = []; - let mapB = []; - for (let i = 0; i < n; i++) { - let rowArrA = arr1[i].toString(2).split(""); - let rowArrB = arr2[i].toString(2).split(""); - for (let j = 0, len = rowArrA.length; j < n - len; j++) - rowArrA.unshift("0"); - for (let j = 0, len = rowArrB.length; j < n - len; j++) - rowArrB.unshift("0"); - mapA.push(rowArrA); - mapB.push(rowArrB); - } - let answer2D = mapA.slice(); - for (let i = 0; i < n; i++) { - for (let j = 0; j < n; j++) { - answer2D[i][j] = mapA[i][j] === "0" && mapB[i][j] === "0" ? " " : "#"; - } - } - answer = answer2D.map((row) => row.join("")); - return answer; -} - -//정답 3 - jaewon1676 -function solution(n, arr1, arr2) { - let answer = []; - for (let i = 0; i < n; i++) { - let temp = (arr1[i] | arr2[i]).toString(2); - let line = []; // 한 행의 모든 2진수 보관 - - for (let j = temp.length - n; j < temp.length; j++) { - if (temp[j] == 1) { - line.push("#"); - } else { - line.push(" "); - } - } - answer.push(line.join("")); - } - return answer; -} - -/* 풀이 과정 -1. 배열 arr1, arr2 을 2진수로 변한한다. 이 때, 하나라도 1일 시에는 1로 변환하고, 그렇지 않으면 0을 반환한다. -2. 9번의 반복문을 행의 길이만큼 돌려 1이면 #, 그렇지 않으면 띄어쓰기를 push 해준다. -3. 행의 배열의 원소를 join 메서드를 사용하여 문자열로 합친다.*/ diff --git "a/level-1/x\353\247\214\355\201\274-\352\260\204\352\262\251\354\235\264-\354\236\210\353\212\224-n\352\260\234\354\235\230-\354\210\253\354\236\220&12954&.js" "b/level-1/x\353\247\214\355\201\274-\352\260\204\352\262\251\354\235\264-\354\236\210\353\212\224-n\352\260\234\354\235\230-\354\210\253\354\236\220&12954&.js" deleted file mode 100644 index 6cd7f95..0000000 --- "a/level-1/x\353\247\214\355\201\274-\352\260\204\352\262\251\354\235\264-\354\236\210\353\212\224-n\352\260\234\354\235\230-\354\210\253\354\236\220&12954&.js" +++ /dev/null @@ -1,41 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(x, n) { - return Array.from(Array(n), (_, index) => x * (index + 1)); -} - -//정답 2 - chaerin-dev -function solution(x, n) { - var answer = []; - let add_gap = x; - // n번 반복 - for (let i = 0; i < n; i++) { - answer.push(x); // 처음 배열에 넣을 x - x += add_gap; // x를 배열에 넣은 후 x값을 add_gap만큼 증가 - } - return answer; -} - -//정답 3 - jaewon1676 -function solution(n) { - let str = ""; - for (let i = 0; i < n; i++) { - // 삼항 연산자와 +로 문자열을 붙여주어 추가. - i % 2 == 0 ? (str = str + "수") : (str = str + "박"); - } - return str; -} - -// 정답 4 - prove-ability -function solution(x, n) { - var answer = []; - let i = 1; - // n개 지니는 리스트를 리턴해야 합니다 - while (answer.length !== n) { - // x부터 시작해 x씩 증가하는 숫자 - answer.push(x * i); - i++; - } - return answer; -} diff --git "a/level-1/\352\260\200\354\232\264\353\215\260-\352\270\200\354\236\220-\352\260\200\354\240\270\354\230\244\352\270\260&12903&.js" "b/level-1/\352\260\200\354\232\264\353\215\260-\352\270\200\354\236\220-\352\260\200\354\240\270\354\230\244\352\270\260&12903&.js" deleted file mode 100644 index 9422925..0000000 --- "a/level-1/\352\260\200\354\232\264\353\215\260-\352\270\200\354\236\220-\352\260\200\354\240\270\354\230\244\352\270\260&12903&.js" +++ /dev/null @@ -1,50 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s) { - return s.length % 2 !== 0 - ? s[Math.floor(s.length / 2)] - : s.slice(s.length / 2 - 1, s.length / 2 + 1); -} - -//정답 2 - yongchanson -function solution(s) { - var answer = ""; - let L2 = s.length / 2; - - answer = - s.length % 2 == 0 ? s[L2 - 1] + s[L2] : (answer = s[Math.ceil(L2 - 1)]); - - return answer; -} - -//정답 3 - prove-ability -function solution(s) { - var answer = ''; - // 중간 지점 찾기 - const point = Math.floor(s.length / 2); - // 짝수인 경우 - (중간지점 - 1) + 중간지점 - if(s.length % 2 ===0) answer = s[point - 1] + s[point]; - // 홀수인 경우 - 중간지점 - else answer = s[point]; - return answer; -} - -// 정답 4 - chaerin-dev -function solution(s) { - return s.length % 2 - ? s[parseInt(s.length / 2)] - : s[s.length / 2 - 1] + s[s.length / 2]; -} - -// 정답 5 - jaewon1676 -function solution(s) { - var answer = ''; - - if (s.length % 2 == 0 ) { // 짝수일 경우, - answer = s[s.length / 2 - 1] + s[s.length / 2]; - } else { - answer = s[parseInt(s.length / 2)]; // 홀수일 경우 - } - return answer; -} diff --git "a/level-1/\352\260\231\354\235\200-\354\210\253\354\236\220\353\212\224-\354\213\253\354\226\264&12906&.js" "b/level-1/\352\260\231\354\235\200-\354\210\253\354\236\220\353\212\224-\354\213\253\354\226\264&12906&.js" deleted file mode 100644 index bdf875e..0000000 --- "a/level-1/\352\260\231\354\235\200-\354\210\253\354\236\220\353\212\224-\354\213\253\354\226\264&12906&.js" +++ /dev/null @@ -1,43 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(arr) { - return arr.filter((element, index) => element !== arr[index + 1]); -} - -//정답 2 - codeisneverodd -function solution(arr) { - var answer = [arr[0]]; - for (let i = 1; i < arr.length; i++) { - //arr를 수정하면(shift해서 사용하면) 효율성 테스트에서 미통과됩니다. - answer[answer.length - 1] !== arr[i] ? answer.push(arr[i]) : null; - } - return answer; -} - -//정답 3 - chaerin-dev -function solution(arr) { - // 콜백함수의 조건을 만족하는 '모든' 값을 배열로 반환하고, - // 조건을 만족하는 값이 없으면 빈 배열을 반환하는 filter 메서드 활용 - // 첫 번째 요소의 경우 undefined와 비교 - return arr.filter((item, index) => item !== arr[index - 1]); -} - -// 정답 4 - prove-ability -function solution(arr) { - let answer = []; - // 이중 배열을 사용해서 포인터?를 두 개를 사용한다 - for (let i = 0, len = arr.length - 1; i < len; i++) { - // i 의 다음수를 비교하기 위해 j = (i + 1) - for (let j = i + 1, len = arr.length; j < len; j++) { - // i 와 j 번째 값이 같이 않다면 - if (arr[i] !== arr[j]) { - answer.push(arr[i]); - i = j - 1; - break; - } - } - } - answer.push(arr[arr.length - 1]); - return answer; -} diff --git "a/level-1/\353\202\230\353\210\204\354\226\264-\353\226\250\354\226\264\354\247\200\353\212\224-\354\210\253\354\236\220-\353\260\260\354\227\264&12910&.js" "b/level-1/\353\202\230\353\210\204\354\226\264-\353\226\250\354\226\264\354\247\200\353\212\224-\354\210\253\354\236\220-\353\260\260\354\227\264&12910&.js" deleted file mode 100644 index f79492e..0000000 --- "a/level-1/\353\202\230\353\210\204\354\226\264-\353\226\250\354\226\264\354\247\200\353\212\224-\354\210\253\354\236\220-\353\260\260\354\227\264&12910&.js" +++ /dev/null @@ -1,35 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(arr, divisor) { - const answer = arr.filter((element) => element % divisor === 0); - answer.length === 0 ? answer.push(-1) : answer.sort((a, b) => a - b); - return answer; -} - -//정답 2 - codeisneverodd -function solution(arr, divisor) { - var answer = []; - arr.forEach((element) => { - element % divisor === 0 ? answer.push(element) : null; - }); - answer.length === 0 ? answer.push(-1) : null; - answer.sort((a, b) => a - b); - return answer; -} - -//정답 3. chaerin-dev -function solution(arr, divisor) { - let answer = []; - arr.forEach((e) => { - if (e % divisor === 0) answer.push(e); - }); - return answer.length ? answer.sort((a, b) => a - b) : [-1]; -} - -//정답 4 - prove-ailbity -function solution(arr, divisor) { - var answer = []; - arr.forEach((v) => v % divisor === 0 && answer.push(v)) - return answer.length === 0 ? [-1] : answer.sort((a, b) => a - b); -} diff --git "a/level-1/\353\202\230\353\250\270\354\247\200\352\260\200-1\354\235\264-\353\220\230\353\212\224-\354\210\230-\354\260\276\352\270\260&87389&.js" "b/level-1/\353\202\230\353\250\270\354\247\200\352\260\200-1\354\235\264-\353\220\230\353\212\224-\354\210\230-\354\260\276\352\270\260&87389&.js" deleted file mode 100644 index 56d4913..0000000 --- "a/level-1/\353\202\230\353\250\270\354\247\200\352\260\200-1\354\235\264-\353\220\230\353\212\224-\354\210\230-\354\260\276\352\270\260&87389&.js" +++ /dev/null @@ -1,36 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n) { - - let answer = 0; - for (let divisor = n - 1; divisor >= 2; divisor--) { - if (n % divisor === 1) answer = divisor; - } - return answer; -} - -//정답 2 - prove-ability -function solution(n) { - var answer = 0; - let i = 0; - while(true) { - if(n % i === 1) { - answer = i; - break; - } - i++; - } - return answer; -} - -//정답 3 - jaewon1676 -function solution(n) { - var answer = 0; - for (let i=1; i x + y * b[i], 0); -} - -//정답 2 - yongchanson -function solution(a, b) { - var answer = 0; - - for (i = 0; i < a.length; i++) { - answer += a[i] * b[i]; - } - return answer; -} - -//정답 3 - prove-ability -function solution(a, b) { - var answer = 0; - - for (let i = 0, len = a.length; i < len; i++) { - answer += a[i] * b[i]; - } - - return answer; -} - -//정답 4 - jaewon1676 -function solution(a, b) { - let answer = 0; - for (let i=0; i acc + e * b[i], 0); -} diff --git "a/level-1/\353\221\220-\352\260\234-\353\275\221\354\225\204\354\204\234-\353\215\224\355\225\230\352\270\260&68644&.js" "b/level-1/\353\221\220-\352\260\234-\353\275\221\354\225\204\354\204\234-\353\215\224\355\225\230\352\270\260&68644&.js" deleted file mode 100644 index 2c079cd..0000000 --- "a/level-1/\353\221\220-\352\260\234-\353\275\221\354\225\204\354\204\234-\353\215\224\355\225\230\352\270\260&68644&.js" +++ /dev/null @@ -1,26 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(numbers) { - const answer = []; - for (let i = 0; i < numbers.length; i++) { - for (let j = i + 1; j < numbers.length; j++) { - answer.push(numbers[i] + numbers[j]); - } - } - return [...new Set(answer)].sort((a, b) => a - b); -} - -//정답 2 - prove-ability -function solution(numbers) { - const answer = []; - - for(let i = 0, len = numbers.length; i < len; i++) { - for(let j = i + 1, len = numbers.length; j < len; j++) { - if(!answer.includes(numbers[i] + numbers[j])) answer.push(numbers[i] + numbers[j]) - } - } - - return answer.sort((a, b) => a - b); -} - diff --git "a/level-1/\353\221\220-\354\240\225\354\210\230-\354\202\254\354\235\264\354\235\230-\355\225\251&12912&.js" "b/level-1/\353\221\220-\354\240\225\354\210\230-\354\202\254\354\235\264\354\235\230-\355\225\251&12912&.js" deleted file mode 100644 index 618db2f..0000000 --- "a/level-1/\353\221\220-\354\240\225\354\210\230-\354\202\254\354\235\264\354\235\230-\355\225\251&12912&.js" +++ /dev/null @@ -1,47 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(a, b) { - let answer = 0; - for (let i = Math.min(a, b); i <= Math.max(a, b); i++) { - answer += i; - } - return answer; -} - -//정답 2 - chaerin-dev -function solution(a, b) { - let answer = 0; - for (let i = Math.min(a, b); i <= Math.max(a, b); i++) { - answer += i; - } - return answer; -} - -//정답 3 - prove-ability -function solution(a, b) { - let answer = 0; - for(let i = Math.min(a, b), len = Math.max(a, b); i <= len; i++) { - answer += i; - } - return answer; -} - -//정답 4 - prove-ability -function solution(a, b) { - return Array.from({length: Math.max(a, b) - Math.min(a, b) + 1}, (_, i) => i + Math.min(a, b)).reduce((a, b) => a + b, 0); -} - -//정답 5 - jaewon1676 -function solution(a, b) { - if (b < a){ // b가 a보다 큰 수가 되도록 해준다. - let c = b - b = a - a = c - } - let sum = 0; // 합을 구할 변수 - for (let i=a; i<=b; i++){ - sum += i - } - return sum; -} diff --git "a/level-1/\353\241\234\353\230\220\354\235\230-\354\265\234\352\263\240-\354\210\234\354\234\204\354\231\200-\354\265\234\354\240\200-\354\210\234\354\234\204&77484&.js" "b/level-1/\353\241\234\353\230\220\354\235\230-\354\265\234\352\263\240-\354\210\234\354\234\204\354\231\200-\354\265\234\354\240\200-\354\210\234\354\234\204&77484&.js" deleted file mode 100644 index c4166f3..0000000 --- "a/level-1/\353\241\234\353\230\220\354\235\230-\354\265\234\352\263\240-\354\210\234\354\234\204\354\231\200-\354\265\234\354\240\200-\354\210\234\354\234\204&77484&.js" +++ /dev/null @@ -1,151 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(lottos, win_nums) { - const zeroCount = lottos.filter((e) => e === 0).length; - const matchCount = win_nums.filter((e) => lottos.includes(e)).length; - const matchToRank = [6, 6, 5, 4, 3, 2, 1]; - const lowRank = matchToRank[matchCount]; - const highRank = zeroCount === 6 ? 1 : matchToRank[matchCount + zeroCount]; - - return [highRank, lowRank]; -} - -//정답 2 - codeisneverodd -function solution(lottos, win_nums) { - // 0이 없는 경우 > 최저 순위 == 최고 순위 - // 0이 있는 경우 > 모두 0인경우 > 1위 - // > 0이 아닌 수가 있는 경우 > 최저 순위 - (0의 개수) = 최고순위 - // 0이 있는 경우 0만 중복이 가능하므로, 0의 개수를 (배열 길이 - 집합 길이 + 1)를 통해 구함. - // 순위는 7 - hit - // 최종적으로 7위인 경우 6위로 변경 - var answer = []; - if (lottos.indexOf(0) === -1) { - answer[0] = answer[1] = 7 - hit(lottos, win_nums); - } else { - const zeroCount = lottos.length - [...new Set(lottos)].length + 1; - answer[1] = 7 - hit(lottos, win_nums); - zeroCount === 6 ? (answer[0] = 1) : (answer[0] = answer[1] - zeroCount); - } - for (let i = 0; i < 2; i++) { - answer[i] >= 7 ? (answer[i] = 6) : null; - } - return answer; -} - -function hit(lottos, win_nums) { - let result = 0; - lottos.forEach((element) => { - win_nums.indexOf(element) === -1 ? null : (result += 1); - }); - return result; -} - -// 정답 3 - jaewon1676 -function solution(lottos, win_nums) { - var answer = []; - const correct = lottos.filter((lotto) => win_nums.includes(lotto)).length; - // lottos배열을 순회하며 당첨배열에 있는 수를 return 하고 총 개수를 correct에 저장 - - const zeros = lottos.filter((lotto) => lotto === 0).length; - // lottos배열을 순회하며 0인 총 개수를 zeros에 저장 - - let min = 7 - correct >= 6 ? 6 : 7 - correct; - - let max = min - zeros < 1 ? 1 : min - zeros; - - answer = [max, min]; - - return answer; -} - -// 정답 4 - jaewon1676 -function solution(lottos, win_nums) { - var answer = []; - let max = 7; - let min = 7; - console.log(lottos); - console.log(win_nums); - for (let i = 0; i < 6; i++) { - if (lottos.includes(win_nums[i])) { - max--; - } - } - min = max; - for (let i = 0; i < 6; i++) { - if (lottos[i] == 0) min--; - } - if (max == 7) max = 6; - if (min == 7) min = 6; - answer = [min, max]; - return answer; -} - -//정답 5 - yongchanson -function solution(lottos, win_nums) { - //최고당첨개수 : maxPoint + basicPoint - //최저당첨개수 : basicPoint - - let basicPoint = 0; - let maxPoint = 0; - let answer = []; - - lottos.forEach(function (lottos_item) { - win_nums.forEach(function (win_nums_item) { - if (lottos_item == win_nums_item) { - basicPoint++; - } - }); - }); - - lottos.forEach(function (item) { - if (item == 0) { - maxPoint++; - } - }); - - maxPoint + basicPoint >= 2 - ? answer.push(7 - maxPoint - basicPoint) - : answer.push(6); - basicPoint >= 2 ? answer.push(7 - basicPoint) : answer.push(6); - - return answer; -} - -//정답 6 - prove-ability -function solution(lottos, win_nums) { - // 맞춘 수와 0의 갯수 활용할 변수 0으로 초기화 - let winCount = 0; - let zeroCount = 0; - // 내 로또 번호 하니씩 접근 - lottos.forEach((num) => { - // 번호가 0이 아니고 당첨 번호라면 - if (num !== 0 && win_nums.includes(num)) { - winCount++; - // 번호가 0이라면 - } else if (num === 0) { - zeroCount++; - } - }); - // 일치한 수와 등수는 반비례하기 때문에 빼기 7 - // 이때 등수를 벗어나면 낙첨(6) 으로 고정 - let max = 7 - (winCount + zeroCount); - if (max > 5) max = 6; - let min = 7 - winCount; - if (min > 5) min = 6; - - return [max, min]; -} - -//정답 7 - chaerin-dev -function solution(lottos, win_nums) { - let zeroCount = 0; - let winCount = 0; - lottos.forEach((item) => { - if (item === 0) zeroCount++; - else if (win_nums.includes(item)) winCount++; - }); - let maxRank = Math.min(7 - (winCount + zeroCount), 6); - let minRank = Math.min(7 - winCount, 6); - return [maxRank, minRank]; -} diff --git "a/level-1/\353\252\250\354\235\230\352\263\240\354\202\254&42840&.js" "b/level-1/\353\252\250\354\235\230\352\263\240\354\202\254&42840&.js" deleted file mode 100644 index c91c3b1..0000000 --- "a/level-1/\353\252\250\354\235\230\352\263\240\354\202\254&42840&.js" +++ /dev/null @@ -1,135 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(answers) { - const answer = []; - const firstPattern = [1, 2, 3, 4, 5]; - const firstPLength = firstPattern.length; - const secondPattern = [2, 1, 2, 3, 2, 4, 2, 5]; - const secondPLength = secondPattern.length; - const thirdPattern = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]; - const thirdLength = thirdPattern.length; - let correctCount = [0, 0, 0]; - - for (let i = 0, len = answers.length; i < len; i++) { - if (answers[i] === firstPattern[i % firstPLength]) correctCount[0] += 1; - if (answers[i] === secondPattern[i % secondPLength]) correctCount[1] += 1; - if (answers[i] === thirdPattern[i % thirdLength]) correctCount[2] += 1; - } - - const maxScore = Math.max(...correctCount); - for (let i = 0; i < 3; i++) { - if (correctCount[i] === maxScore) answer.push(i + 1); - } - - return answer; -} - -// 완벽한 정답이 아닙니다. -// 정답 2 - prove-ability -function solution(answers) { - let result = []; - - let players = { - 1: { - pattern: [1, 2, 3, 4, 5], - count: 0, - }, - 2: { - pattern: [2, 1, 2, 3, 2, 4, 2, 5], - count: 0, - }, - 3: { - pattern: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5], - count: 0, - }, - }; - let max = 0; - answers.forEach((answer, index) => { - for (let [key, { pattern }] of Object.entries(players)) { - // 조정된 index 의 값과 답이 맞다면 해당 플레이어 count 증가 - if (pattern[index % pattern.length] === answer) { - players[key].count++; - // 제일 높은 count 구하기 - if (max < players[key].count) max = players[key].count; - } - } - }); - // players 중에 count 가 max 와 값이 같다면 result 추가 - for (let [key, { count }] of Object.entries(players)) { - if (count === max) result.push(parseInt(key, 10)); - } - - return result; -} - -//정답 3 - yongchanson -function solution(answers) { - let score = []; - let answer = []; - let a1 = [1, 2, 3, 4, 5]; - let a2 = [2, 1, 2, 3, 2, 4, 2, 5]; - let a3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]; - - score.push(answers.filter((a, i) => a === a1[i % a1.length]).length); - score.push(answers.filter((a, i) => a === a2[i % a2.length]).length); - score.push(answers.filter((a, i) => a === a3[i % a3.length]).length); - - for (let i = 0; i < score.length; i++) { - const max = Math.max(...score); - if (score[i] === max) { - answer.push(i + 1); - } - } - - return answer; -} - -//정답 4 - jaewon1676 -function solution(answers) { - let arr1 = [1,2,3,4,5] - let arr2 = [2,1,2,3,2,4,2,5] - let arr3 = [3,3,1,1,2,2,4,4,5,5] - - let score = [0, 0, 0] - for (let i=0; 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 diff --git "a/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264-p\354\231\200-y\354\235\230-\352\260\234\354\210\230&12916&.js" "b/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264-p\354\231\200-y\354\235\230-\352\260\234\354\210\230&12916&.js" deleted file mode 100644 index 098a7aa..0000000 --- "a/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264-p\354\231\200-y\354\235\230-\352\260\234\354\210\230&12916&.js" +++ /dev/null @@ -1,36 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s) { - const countP = [...s.matchAll(/p/gi)].length; - const countY = [...s.matchAll(/y/gi)].length; - return countP === countY; -} - -//정답 2 - yongchanson -function solution(s) { - p = s.toLowerCase().split("p").length; - y = s.toLowerCase().split("y").length; - - return p == y ? true : false; -} - -//정답 3 - chaerin-dev -function solution(s) { - let pCount = s.split(/p/i).length - 1; - let yCount = s.split(/y/i).length - 1; - return pCount === yCount; -} -// 문자열에서 특정 문자의 개수를 구하려면 split을 사용하면 된다. -// Ex. "ababb".split("a") 의 결과는 ["", "b", "bb"] -// => 즉, "a"의 갯수는 3에서 1을 뺀 2 - -// 정답 4 - prove-ability -function solution(s){ - // 배열로 변환 - s = s.split(""); - // filter 를 사용해 갯수 추출 - const pCount = s.filter((v) => v === "p" || v === "P").length; - const yCount = s.filter((v) => v === "y" || v === "Y").length; - return pCount === yCount; -} \ No newline at end of file diff --git "a/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264-\353\247\210\354\235\214\353\214\200\353\241\234-\354\240\225\353\240\254\355\225\230\352\270\260&12915&.js" "b/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264-\353\247\210\354\235\214\353\214\200\353\241\234-\354\240\225\353\240\254\355\225\230\352\270\260&12915&.js" deleted file mode 100644 index 0353a7c..0000000 --- "a/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264-\353\247\210\354\235\214\353\214\200\353\241\234-\354\240\225\353\240\254\355\225\230\352\270\260&12915&.js" +++ /dev/null @@ -1,35 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(strings, n) { - return strings.sort((a, b) => { - if (a[n] < b[n]) return -1; - if (a[n] > b[n]) return 1; - if (a[n] === b[n]) return a < b ? -1 : 1; - return 0; - }); -} - -//정답 2 - chaerin-dev -function solution(strings, n) { - return strings.sort((a, b) => { - // 인덱스 n번째 글자를 기준으로 오름차순 정렬 - if (a[n] > b[n]) return 1; - else if (a[n] < b[n]) return -1; - // 인덱스 n번째 글자가 같으면 사전순 정렬 - else return a > b ? 1 : -1; - }); -} - -// 정답 3 - prove-ability -function solution(strings, n) { - // 정렬 - strings.sort((a, b) => { - // n번째 클자가 같다면 사전순 - if(a[n].charCodeAt() === b[n].charCodeAt()) { - return a > b ? 1 : -1; - } else return a[n].charCodeAt() - b[n].charCodeAt(); - }); - - return strings; -} diff --git "a/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234-\353\260\260\354\271\230\355\225\230\352\270\260&12917&.js" "b/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234-\353\260\260\354\271\230\355\225\230\352\270\260&12917&.js" deleted file mode 100644 index 3d0a5fa..0000000 --- "a/level-1/\353\254\270\354\236\220\354\227\264-\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234-\353\260\260\354\271\230\355\225\230\352\270\260&12917&.js" +++ /dev/null @@ -1,39 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s) { - return s - .split("") - .sort((a, b) => { - if (a < b) return 1; - if (a > b) return -1; - return 0; - }) - .join(""); -} - -//정답 2 - chaerin-dev -function solution(s) { - // 문자열 -> 배열 -> 정렬 -> 순서뒤집기 -> 문자열 - return s.split("").sort().reverse().join(""); -} - -//정답 3 - chaerin-dev -function solution(s) { - return s.split("").sort((a, b) => (a < b ? 1 : -1)).join(""); -} - - -//정답 4 - prove-ability -function solution(s) { - return s.split("").sort().reverse().join("") -} - -//정답 5 - jaewon1676 -function solution(s) { - return s.split('').sort().reverse().join('') -} -// split('')은 문자열을 하나씩 쪼개주면서 타입을 배열로 변환시켜줍니다. -// 그러면 문자열 타입이 배열이 되므로 정렬을 할 수 있습니다. -// sort()는 오름차순이기때문에 다시 뒤집어서 합쳐줍니다. - diff --git "a/level-1/\353\254\270\354\236\220\354\227\264-\353\213\244\353\243\250\352\270\260-\352\270\260\353\263\270&12918&.js" "b/level-1/\353\254\270\354\236\220\354\227\264-\353\213\244\353\243\250\352\270\260-\352\270\260\353\263\270&12918&.js" deleted file mode 100644 index 0849d59..0000000 --- "a/level-1/\353\254\270\354\236\220\354\227\264-\353\213\244\353\243\250\352\270\260-\352\270\260\353\263\270&12918&.js" +++ /dev/null @@ -1,54 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s) { - return s.search(/\D/g) < 0 && (s.length === 4 || s.length === 6); -} - -//정답 2 - yongchanson -function solution(s) { - let parseInts = parseInt(s); - if (s.length == 6 || s.length == 4) { - if (s == parseInts) { - return true; - } - } - - return false; -} - -//정답 3 - prove-ability -function solution(s) { - var answer = true; - // 문자열 s의 길이가 4 혹은 6이고 - if (s.length === 4 || s.length === 6) { - for (let i = 0, len = s.length; i < len; i++) { - // 숫자로만 구성돼있는지 확인 - if (!Number.isInteger(parseInt(s[i], 10))) return false; - } - // 문자열 s의 길이가 4 혹은 6 가 아니라면 false - } else return false; - - return answer; -} - -//정답 4 - chaerin-dev -function solution(s) { - // 길이가 4 혹은 6이 아니면 false 반환 - if (s.length !== 4 && s.length !== 6) return false; - // 각 자리중에 숫자가 아닌 것이 하나라도 있으면 false 반환 - for (let i = 0; i < s.length; i++) { - if (isNaN(Number(s[i]))) return false; - } - // 위의 모든 조건에 포함되지 않으면 - // (길이가 4 혹은 6이고, 숫자로만 구성되어 있으면) true 반환 - return true; -} - -//정답 5 - soulhn -function solution(s) { - if (s.length !== 4 && s.length !== 6) return false; - return !s.split("").some((i) => isNaN(parseInt(i, 10))); - //early return 제외사항 먼저 처리 - //.split 문자열 배열로 변환, .some을 이용하여 isNaN인지 판별, ! 사용하여 문제 조건에 맞게 반환 -} diff --git "a/level-1/\353\254\270\354\236\220\354\227\264\354\235\204-\354\240\225\354\210\230\353\241\234-\353\260\224\352\276\270\352\270\260&12925&.js" "b/level-1/\353\254\270\354\236\220\354\227\264\354\235\204-\354\240\225\354\210\230\353\241\234-\353\260\224\352\276\270\352\270\260&12925&.js" deleted file mode 100644 index f21b1f4..0000000 --- "a/level-1/\353\254\270\354\236\220\354\227\264\354\235\204-\354\240\225\354\210\230\353\241\234-\353\260\224\352\276\270\352\270\260&12925&.js" +++ /dev/null @@ -1,22 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s) { - return parseInt(s); -} - -//정답 2 - chaerin-dev -function solution(s) { - return Number(s); -} - -//정답 3 - prove-ability -function solution(s) { - return parseInt(s, 10); -} - - -//정답 4 - jaewon1676 -function solution(s) { - return parseInt(s); -} diff --git "a/level-1/\353\266\200\354\241\261\355\225\234-\352\270\210\354\225\241-\352\263\204\354\202\260\355\225\230\352\270\260&82612&.js" "b/level-1/\353\266\200\354\241\261\355\225\234-\352\270\210\354\225\241-\352\263\204\354\202\260\355\225\230\352\270\260&82612&.js" deleted file mode 100644 index 04bfabb..0000000 --- "a/level-1/\353\266\200\354\241\261\355\225\234-\352\270\210\354\225\241-\352\263\204\354\202\260\355\225\230\352\270\260&82612&.js" +++ /dev/null @@ -1,57 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(price, money, count) { - let totalCost = 0; - for (let i = 1; i <= count; i++) totalCost += price * i; - return totalCost <= money ? 0 : totalCost - money; -} - -//정답 2 - yongchanson -function solution(price, money, count) { - var answer = 0; - let sum = price; - - for (i = 2; i <= count; i++) { - sum += price * i; - } - - if (sum <= money) { - answer = 0; - } else { - answer = sum - money; - } - return answer; -} - -//정답 3 - jaewon1676 -function solution(price, money, count) { - let sum_price = 0; // 놀이기구의 이용료의 합 - for (let i = 1; i <= count; i++) { - sum_price += i * price; // 이용료의 N배 만큼 곱해서 더해준다. - } - if (sum_price <= money) { - return 0; - } - return sum_price - money; -} - -//정답 4 - prove-ability -function solution(price, money, count) { - let sum = 0; - for(let i = 1; i <= count; i++) { - sum += (i * price) - } - - return sum < money ? 0 : sum - money; -} - -//정답 5 - chaerin-dev -function solution(price, money, count) { - let totalPrice = 0; - for(let i=1; i<=count; i++){ - totalPrice += i * price; - } - return money > totalPrice ? 0 : totalPrice-money; -} - diff --git "a/level-1/\354\204\234\354\232\270\354\227\220\354\204\234-\352\271\200\354\204\234\353\260\251-\354\260\276\352\270\260&12919&.js" "b/level-1/\354\204\234\354\232\270\354\227\220\354\204\234-\352\271\200\354\204\234\353\260\251-\354\260\276\352\270\260&12919&.js" deleted file mode 100644 index 945278e..0000000 --- "a/level-1/\354\204\234\354\232\270\354\227\220\354\204\234-\352\271\200\354\204\234\353\260\251-\354\260\276\352\270\260&12919&.js" +++ /dev/null @@ -1,25 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(seoul) { - return `김서방은 ${seoul.indexOf("Kim")}에 있다`; -} - -//정답 2 - chaerin-dev -function solution(seoul) { - return `김서방은 ${seoul.indexOf("Kim")}에 있다`; -} - -//정답 3 - prove-ability -function solution(seoul) { - return `김서방은 ${seoul.findIndex(v => v === "Kim")}에 있다`; -} - -//정답 4 - jaewon1676 -function solution(seoul) { - var answer = ''; - for (let i=0; i<1000; i++){ - if (seoul[i] === 'Kim') return '김서방은 ' + i + '에 있다'; - } - return 1; -} \ No newline at end of file diff --git "a/level-1/\354\204\261\352\262\251-\354\234\240\355\230\225-\352\262\200\354\202\254\355\225\230\352\270\260&118666&.js" "b/level-1/\354\204\261\352\262\251-\354\234\240\355\230\225-\352\262\200\354\202\254\355\225\230\352\270\260&118666&.js" deleted file mode 100644 index a5787d6..0000000 --- "a/level-1/\354\204\261\352\262\251-\354\234\240\355\230\225-\352\262\200\354\202\254\355\225\230\352\270\260&118666&.js" +++ /dev/null @@ -1,72 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - ssi02014 -function solution(survey, choices) { - const points = [3, 2, 1, 0, 1, 2, 3]; - const pointBoard = { - R: 0, - T: 0, - C: 0, - F: 0, - J: 0, - M: 0, - A: 0, - N: 0, - }; - let result = ""; - - // 카테고리 별 점수 추가 - for (let i = 0; i < survey.length; i++) { - const categories = survey[i]; - - if (choices[i] < 4) { - pointBoard[categories[0]] += points[choices[i] - 1]; - } else if (choices[i] > 4) { - pointBoard[categories[1]] += points[choices[i] - 1]; - } - } - - const pointBoardEntries = Object.entries(pointBoard); - - // 지표에 맞게 결과 값 도출 - for (let i = 0; i < pointBoardEntries.length; i += 2) { - const [curCategory, curValue] = pointBoardEntries[i]; - const [nextCategory, nextValue] = pointBoardEntries[i + 1]; - - if (curValue < nextValue) { - result += nextCategory; - } else { - result += curCategory; - } - } - - return result; -} - -//정답 2 - codeisneverodd -function solution(survey, choices) { - const points = [-3, -2, -1, 0, 1, 2, 3]; - const types = ['RT', 'CF', 'JM', 'AN']; - const pointBoard = types.reduce((a, key) => ({ ...a, [key]: 0 }), {}); - survey.forEach((key, i) => { - const point = points[choices[i] - 1]; - Object.keys(pointBoard).includes(key) ? (pointBoard[key] += point) : (pointBoard[key[1] + key[0]] -= point); - }); - return types.map(type => (pointBoard[type] <= 0 ? type[0] : type[1])).join(''); -} - -//정답 3 - codisneverodd -function solution(survey, choices) { - const points = [-3, -2, -1, 0, 1, 2, 3]; - const types = ['RT', 'CF', 'JM', 'AN']; - const pointBoard = survey.reduce((a, key, i) => { - if (types.includes(key)) { - a[key] = (a[key] || 0) + points[choices[i] - 1]; - return a; - } - const rKey = key[1] + key[0]; - a[rKey] = (a[rKey] || 0) - points[choices[i] - 1]; - return a; - }, {}); - return types.map(type => (pointBoard[type] <= 0 || !pointBoard[type] ? type[0] : type[1])).join(''); -} diff --git "a/level-1/\354\206\214\354\210\230-\353\247\214\353\223\244\352\270\260&12977&.js" "b/level-1/\354\206\214\354\210\230-\353\247\214\353\223\244\352\270\260&12977&.js" deleted file mode 100644 index 15a504d..0000000 --- "a/level-1/\354\206\214\354\210\230-\353\247\214\353\223\244\352\270\260&12977&.js" +++ /dev/null @@ -1,85 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(nums) { - let answer = 0; - const length = nums.length; - for (let i = 0; i < length; i++) { - for (let j = i + 1; j < length; j++) { - for (let k = j + 1; k < length; k++) { - const sum = nums[i] + nums[j] + nums[k]; - if (isPrime(sum)) answer += 1; - } - } - } - - return answer; -} - -function isPrime(num) { - for (let i = 2; i <= Math.sqrt(num); i++) { - if (num % i === 0) return false; - } - return num >= 2; -} - -//정답 2 - jaewon1676 -// https://programmers.co.kr/learn/courses/30/lessons/12977?language=javascript - -function solution(nums) { - let len = nums.length, answer = 0; - - for (let i = 0; i < len - 2; i++) { - for (let j = i + 1; j < len - 1; j++) { - for (let k = j + 1; k < len; k++) { - if (isPrime(nums[i] + nums[j] + nums[k])) { - answer++; - } - } - } - } - return answer; -} - -const isPrime = (n) => { - for (let i = 2; i <= Math.sqrt(n); i++) { //n의 제곱근까지 순회 - if (n % i === 0) { // 나머지가 0이 나오면 소수가 아니다. - return false; - } - } - return true; -} -// 세개의 수를 더해야 하기때문에 수 for문 하나당 수 하나를 넣어서 순회하였다. - -//정답 3 - chaerin-dev -// arr배열에서 selectNumber개의 요소를 뽑는 모든 경우를 배열로 반환하는 함수 -const getCombinations = function (arr, selectNumber) { - const results = []; - if (selectNumber === 1) return arr.map((el) => [el]); - arr.forEach((fixed, index, origin) => { - const rest = origin.slice(index + 1); - const combinations = getCombinations(rest, selectNumber - 1); - const attached = combinations.map((el) => [fixed, ...el]); - results.push(...attached); - }); - return results; -}; - -// num이 소수인지 여부를 반환하는 함수 -function isPrime(num) { - if (num === 1) return false; - for (let i = 2; i <= Math.sqrt(num); i++) { - if (num % i === 0) return false; - } - return true; -} - -function solution(nums) { - const combinationResult = getCombinations(nums, 3); - let answer = 0; - combinationResult.forEach((e) => { - const sum = e[0] + e[1] + e[2]; - if (isPrime(sum)) answer++; - }); - return answer; -} diff --git "a/level-1/\354\206\214\354\210\230-\354\260\276\352\270\260&42839&.js" "b/level-1/\354\206\214\354\210\230-\354\260\276\352\270\260&42839&.js" deleted file mode 100644 index 1774ae6..0000000 --- "a/level-1/\354\206\214\354\210\230-\354\260\276\352\270\260&42839&.js" +++ /dev/null @@ -1,100 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(numbers) { - let answer = 0; - const numArr = numbers.split(""); - const permutationAll = []; - for (let r = 1; r <= numbers.length; r++) { - const permutationR = Permutation(numArr, r).map((arr) => - parseInt(arr.join("")) - ); - for (let i = 0; i < permutationR.length; i++) - permutationAll.push(permutationR[i]); - } - const permutationSet = [...new Set(permutationAll)]; - for (const number of permutationSet) { - if (isPrime(number)) answer += 1; - } - return answer; -} - -function Permutation(arr, r) { - const result = []; - if (r === 1) return arr.map((num) => [num]); - arr.forEach((fixed, index, org) => { - const rest = [...org.slice(0, index), ...org.slice(index + 1)]; - const permutation = Permutation(rest, r - 1); - const attached = permutation.map((numbers) => [fixed, ...numbers]); - result.push(...attached); - }); - return result; -} - -function isPrime(num) { - for (let i = 2; i <= Math.sqrt(num); i++) { - if (num % i === 0) return false; - } - return num >= 2; -} - - -//정답 2 - chaerin-dev -// 소수인지 판별하는 함수 -function isPrime(x) { - for (let i = 2; i <= Math.sqrt(x); i++) { - if (x % i === 0) return false; - } - return true; -} -function solution(n) { - // 소수의 개수를 저장할 변수 - let answer = 0; - // 1은 소수가 아니므로 2부터 n까지 모든 수에 대해 - for (let i = 2; i <= n; i++) { - // 소수이면 소수의 개수에 1 추가 - if (isPrime(i)) answer++; - } - return answer; -} - -//정답 3 - prove-ability -// 소수 판별 로직 -function isPrime(n) { - // n 제곱근 후 올림 - for (let i = 2, len = Math.ceil(Math.sqrt(n)); i <= len; i++) { - if (n % i === 0) return false; - } - return true; -} - -function solution(n) { - let count = 0; - // 1부터 n까지 반복적으로 접근 - i - for(let i = 1; i <= n; i++) { - // i 가 소수인지 확인 후 count++ - if(isPrime(i)) count++; - } - - return count; -} - -//정답 4 - jaewon1676 -function solution(n) { - let arr = []; - - // 0과 1을 제외한 2부터 n까지 배열에 담아줍니다. - for(let i=2; i<=n; i++) { - arr[i] = i; - } - for(let i=2; i<=n; i++) { // 인덱스 2부터 반복문 돌면서 0이면 다시 다음 반복문을 돕니다. - if (arr[i] === 0) continue; - - for(let j=i*2; j<=n; j+=i) { // 각 인덱스(i)의 배수들을 0으로 지정해줍니다. - arr[j] = 0; - } - } - - // filter를 이용해 0이아닌 수들의 개수를 return합니다. - return arr.filter(v => v!==0).length; -} diff --git "a/level-1/\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230?&12922&.js" "b/level-1/\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230?&12922&.js" deleted file mode 100644 index aa3682c..0000000 --- "a/level-1/\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230\353\260\225\354\210\230?&12922&.js" +++ /dev/null @@ -1,39 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n) { - let answer = ''; - for (let i = 0; i < n; i++) { - answer += i % 2 === 0 ? '수' : '박'; - } - return answer; -} - -//정답 2 - chaerin-dev -function solution(n) { - // "수박"을 n번 반복한 문자열의 0번 인덱스부터 n만큼 추출해서 반환 - return '수박'.repeat(n).substr(0, n); -} - -//정답 3 - jaewon1676 -function solution(n) { - let str = ''; - for (let i = 0; i < n; i++) { - // 삼항 연산자와 +로 문자열을 붙여주어 추가. - i % 2 == 0 ? (str = str + '수') : (str = str + '박'); - } - return str; -} - -//정답 4 - prove-ability -function solution(n) { - let answer = ''; - answer = '수박'.repeat(n / 2); - if (n % 2 !== 0) answer += '수'; - return answer; -} - -//정답 5 - yongchanson -function solution(n) { - return '수박'.repeat(n / 2) + '수'.repeat(n % 2); -} diff --git "a/level-1/\354\210\253\354\236\220-\353\254\270\354\236\220\354\227\264\352\263\274-\354\230\201\353\213\250\354\226\264&81301&.js" "b/level-1/\354\210\253\354\236\220-\353\254\270\354\236\220\354\227\264\352\263\274-\354\230\201\353\213\250\354\226\264&81301&.js" deleted file mode 100644 index f78f6bf..0000000 --- "a/level-1/\354\210\253\354\236\220-\353\254\270\354\236\220\354\227\264\352\263\274-\354\230\201\353\213\250\354\226\264&81301&.js" +++ /dev/null @@ -1,102 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s) { - const stringToNum = [ - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - ]; - for (let i = 0; i < 10; i++) { - s = s.split(stringToNum[i]).join(i); - } - return parseInt(s); -} - -//정답 2 - codeisneverodd -function solution(s) { - var answer = 0; - let answerString = s; - const stringToNum = [ - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - ]; - for (let i = 0; i < 10; i++) { - const regex = new RegExp(stringToNum[i], "g"); - answerString = answerString.replace(regex, i); - } - answer = Number(answerString); - return answer; -} - -//정답 3 - jaewon1676 -function solution(s) { - let answer = 0; - - s = s.replace(/zero/g, 0); - s = s.replace(/one/g, 1); - s = s.replace(/two/g, 2); - s = s.replace(/three/g, 3); - s = s.replace(/four/g, 4); - s = s.replace(/five/g, 5); - s = s.replace(/six/g, 6); - s = s.replace(/seven/g, 7); - s = s.replace(/eight/g, 8); - s = s.replace(/nine/g, 9); - - answer = Number(s); - return answer; -} - -//정답 4 - chaerin-dev -function solution(s) { - s = s - .replace(/zero/g, 0) - .replace(/one/g, 1) - .replace(/two/g, 2) - .replace(/three/g, 3) - .replace(/four/g, 4) - .replace(/five/g, 5) - .replace(/six/g, 6) - .replace(/seven/g, 7) - .replace(/eight/g, 8) - .replace(/nine/g, 9); - return parseInt(s); -} - -//정답 5 - yongchanson -function solution(s) { - let en = [ - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - ]; - - for (let i = 0; i < s.length * 2; i++) { - let p = i % en.length; - s = s.replace(en[p], p); - } - return Number(s); -} diff --git "a/level-1/\354\210\253\354\236\220-\354\247\235\352\277\215&131128&.js" "b/level-1/\354\210\253\354\236\220-\354\247\235\352\277\215&131128&.js" deleted file mode 100644 index 4c6e7a3..0000000 --- "a/level-1/\354\210\253\354\236\220-\354\247\235\352\277\215&131128&.js" +++ /dev/null @@ -1,30 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - ssi02014 - -/** - * X, Y의 길이가 굉장히 길어서 공통 숫자를 뽑아낼 때 객체를 이용해 연산 횟수 최적화 - * X, Y를 배열로 변환 후에 배열 메서드를 사용해도 되지만, for of문보다 효율성 떨어짐 - * (테스트 케이스 11 ~ 15 100ms~200ms 차이) - */ -function solution(X, Y) { - const commons = []; - const obj = {}; - - for (const el of X) { - obj[el] = (obj[el] || 0) + 1; - } - - for (const el of Y) { - if (obj[el]) { - commons.push(el); - obj[el]--; - } - } - - commons.sort((a, b) => b - a); - - if (!commons.length) return "-1"; - else if (commons[0] === "0") return "0"; - return commons.join(""); -} \ No newline at end of file diff --git "a/level-1/\354\213\234\354\240\200-\354\225\224\355\230\270&12926&.js" "b/level-1/\354\213\234\354\240\200-\354\225\224\355\230\270&12926&.js" deleted file mode 100644 index 8667845..0000000 --- "a/level-1/\354\213\234\354\240\200-\354\225\224\355\230\270&12926&.js" +++ /dev/null @@ -1,88 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s, n) { - return s - .split("") - .map((element) => { - if (element === " ") return " "; - const code = element.charCodeAt(0); - if ((code + n > 90 && code <= 90) || code + n > 122) { - return String.fromCharCode(code + n - 26); - } else { - return String.fromCharCode(code + n); - } - }) - .join(""); -} - -//정답 2 - jaewon1676 -function solution(s, n) { - return s - .split("") - .map((el) => { - if (el == " ") return el; - let tmp = el.charCodeAt(); - return el.toLowerCase().charCodeAt() + n > 122 - ? String.fromCharCode(tmp + n - 26) - : String.fromCharCode(tmp + n); - }) - .join(""); -} - -/* 문자열 -> 아스키코드 : s.charCodeAt() -아스키코드 -> 문자열 : String.fromCharCode() -풀이과정 -1. 배열을 문자열로 쪼개서 map 메서드로 하나씩 순회한다., 문자열이 비어있으면 리턴한다. -2. 알파벳을 통일 하기 위해 소문자 아스키코드로 변환한다. - 대문자 아스키코드는 65가 A, 90이 Z이다. - 소문자 아스키코드는 97이 a, 122가 z이다. -3. 변환한 아스키코드 + n이 122이상이면 알파벳 단어 길이 25 + 알파벳 앞으로 이동 1만큼 뺴준고 - 그렇지 않으면 그대로 더한 후 해당 아스키코드의 알파벳으로 변환해준다. -*/ - -//정답 3 - chaerin-dev -function solution(s, n) { - let result = ""; - for (let i = 0; i < s.length; i++) { - if (s[i] === " ") result += " "; - else { - let charCode = s.charCodeAt(i); - // 원래 대문자였는데 - if (charCode <= 90) { - charCode += n; - // 변경 후 아스키코드값이 90보다 크다면 - if (charCode > 90) charCode -= 26; - } - // 원래 소문자였는데 - else { - charCode += n; - // 변경 후 아스키코드값이 122보다 크다면 - if (charCode > 122) charCode -= 26; - } - result += String.fromCharCode(charCode); - } - } - return result; -} - - -//정답 4 - prove-ability -function solution(s, n) { - var answer = ''; - for(let i = 0, len = s.length; i < len; i++) { - if(s[i] === " ") { - answer += " "; - continue; - } - let index = s[i].charCodeAt(); - // 65 - 90 - // 97 - 122 - if(index <= 90 && index + n > 90) index -= 26; - else if (index + n > 122) index -= 26; - - answer += String.fromCharCode(index + n) - } - return answer; -} - diff --git "a/level-1/\354\213\240\352\263\240-\352\262\260\352\263\274-\353\260\233\352\270\260&92334&.js" "b/level-1/\354\213\240\352\263\240-\352\262\260\352\263\274-\353\260\233\352\270\260&92334&.js" deleted file mode 100644 index 466f362..0000000 --- "a/level-1/\354\213\240\352\263\240-\352\262\260\352\263\274-\353\260\233\352\270\260&92334&.js" +++ /dev/null @@ -1,167 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220830) - codeisneverodd -function solution(id_list, report, k) { - const reportResult = report.reduce((a, c) => { - const [user, reported] = c.split(' '); - a[reported] = a[reported] ? a[reported].add(user) : new Set().add(user); - return a; - }, {}); - - const mailed = Object.values(reportResult) - .filter(set => set.size >= k) - .flatMap(set => [...set]); - return id_list.map(id => mailed.filter(user => user === id).length); -} - -//정답 2 - jaewon1676 -function solution(id_list, report, k) { - let answer = new Array(id_list.length).fill(0); - let report_list = {}; // 신고당한 ID - - // key, value 형식의 report_list 객체를 만든다. - id_list.map(user => { - report_list[user] = []; //key = userid , value = 빈 배열을 가지는 객체 - }); - // report_list { muzi: [], frodo: [], apeach: [], neo: [] } - - // 유저가 신고한 ID를 report_list 객체에 넣어주기 위해 순회한다. - report.map(user => { - const [user_id, report_id] = user.split(' '); - // report 값에서 띄어쓰기로 구분된 문자열을 자르고 user_id, report_id로 각각 넣어준다. - if (!report_list[report_id].includes(user_id)) { - report_list[report_id].push(user_id); - // 배열에 포함하는지 여부를 확인하여 포함하지 않을때 신고자의 이름을 추가하였다. - } - }); - for (const key in report_list) { - // report_list의 index 순회 - if (report_list[key].length >= k) { - report_list[key].map(user => { - answer[id_list.indexOf(user)] += 1; - }); - } - } - return answer; -} - -//정답 3 - prove-ability -function solution(id_list, report, k) { - // 사용자 길이의 빈 배열을 만든다 0 - var answer = new Array(id_list.length).fill(0); - // 신고된 내용 정리할 객체 선언 - const obj = {}; - // 신고된 내용 정리할 객체 사용자 아이디로 초기화 - id_list.forEach(id => { - obj[id] = new Set(); - }); - // 신고 리스트를 조회하며 신고 내용 객체에 정리 - // set.add 를 활용해 같은 사용자의 중복 신고 제거 - report.forEach(str => { - const [reporter, target] = str.split(' '); - obj[target].add(reporter); - }); - // obj value 하나씩 접근 - for (const value of Object.values(obj)) { - // 신고당한 횟수가 정지 기준에 적합하다면 - if (value.size >= k) { - // 해당 유저를 신고한 사람들 - for (let item of value) { - // 인덱스 구해서 증가 - let index = id_list.indexOf(item); - answer[index]++; - } - } - } - - return answer; -} - -//정답 4 - prove-ability -function solution(id_list, report, k) { - // 사원 리스트 0으로 초기화 - 받은 메일 숫자 세기 - var answer = Array.from({ length: id_list.length }).fill(0); - // 신고 내용 객체 초기화 - 신고된 내용 정리 - const reportObj = {}; - // 신고건 반복문으로 하나씩 접근 - for (let i = 0, len = report.length; i < len; i++) { - const [userId, reportUserId] = report[i].split(' '); - // 신고 내용 객체에 신고당한 사람이 있고 이전에 신고하지 않았다면 추가 - if (reportObj[reportUserId]) { - if (!reportObj[reportUserId].includes(userId)) { - reportObj[reportUserId] = [...reportObj[reportUserId], userId]; - } - // 신고 내용 객체에 신고당한 사람이 없다면 추가 - } else reportObj[reportUserId] = [userId]; - } - // 만들어진 신고 내용 객체로 반복적으로 접근 - for (const item of Object.values(reportObj) - .filter(v => v.length >= k) - .flatMap(v => v)) { - // 인덱스로 접근해 메일 카운트 증가 - const index = id_list.findIndex(v => v === item); - answer[index]++; - } - - return answer; -} - -//정답 5 - chaerin-dev -function solution(id_list, report, k) { - // 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리 - let set = new Set(report); - report = Array.from(set); - - // 1. report를 2차원배열로 변형 - // 2. 각 유저가 신고당한 횟수 cnt에 저장 - // 3. 각 유저를 신고한 유저 who에 저장 - let cnt = Array.from({ length: id_list.length }, i => 0); - let who = Array.from({ length: id_list.length }, i => []); - for (let i = 0; i < report.length; i++) { - report[i] = report[i].split(' '); - cnt[id_list.indexOf(report[i][1])]++; - who[id_list.indexOf(report[i][1])].push(report[i][0]); - } - - // k회 이상 신고당한 유저 확인 및 각 유저가 받은 메일 개수 mail에 저장 - let mail = Array.from({ length: id_list.length }, i => 0); - for (let i = 0; i < cnt.length; i++) { - if (cnt[i] < k) continue; - for (let j = 0; j < who[i].length; j++) { - mail[id_list.indexOf(who[i][j])]++; - } - } - return mail; -} -//정답 6(🎩 refactor 220425) - codeisneverodd -function solution(id_list, report, k) { - //report를 set을 이용하여 중복제거, 각 id 당 신고당한 횟수 reportedCount에 저장, - //각 id를 신고한 사람 array를 reportedBy에 저장, - //k번 이상 신고당한 id를 신고한 id가 받을 메일 수를 mailCount에 저장 - //answer에 mailCount에 저장된 값을 id_list와 같은 id 순서로 저장. - const reportSet = new Set(report); - const reportedCount = {}; //{"id": Number(count)} - const reportedBy = {}; //{"id":[]} - const mailCount = {}; //{"id":Number(count)} - - id_list.forEach(element => { - reportedCount[element] = 0; - mailCount[element] = 0; - reportedBy[element] = []; - }); - - reportSet.forEach(element => { - const [id, reported] = element.split(' '); - reportedCount[reported] += 1; - reportedBy[reported].push(id); - }); - - for (const reportedId in reportedCount) { - if (reportedCount[reportedId] >= k) { - reportedBy[reportedId].forEach(reporter => { - mailCount[reporter] += 1; - }); - } - } - return id_list.map(id => mailCount[id]); -} diff --git "a/level-1/\354\213\240\352\267\234-\354\225\204\354\235\264\353\224\224-\354\266\224\354\262\234&72410&.js" "b/level-1/\354\213\240\352\267\234-\354\225\204\354\235\264\353\224\224-\354\266\224\354\262\234&72410&.js" deleted file mode 100644 index 4c4e506..0000000 --- "a/level-1/\354\213\240\352\267\234-\354\225\204\354\235\264\353\224\224-\354\266\224\354\262\234&72410&.js" +++ /dev/null @@ -1,123 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220830) - codeisneverodd -function solution(new_id) { - const newId = new_id - .toLowerCase() - .replace(/[^\w_.-]/g, '') - .replace(/[.]{2,}/g, '.') - .replace(/^[.]+/, '') - .replace(/[.]+$/, '') - .replace(/^$/, 'a') - .substring(0, 15) - .replace(/[.]+$/, ''); - - return newId.padEnd(3, newId[newId.length - 1]); -} - -//정답 2 - codeisneverodd -function solution(new_id) { - let answer = ''; - answer = new_id.toLowerCase(); // step1 - const step2 = /[^0-9a-z._-]/g; - const step3 = /[.]+/g; - const step4_1 = /^\./; - const step4_2 = /\.$/; - answer = answer.replace(step2, ''); - answer = answer.replace(step3, '.'); - answer = answer.replace(step4_1, ''); - answer = answer.replace(step4_2, ''); - answer = answer === '' ? 'a' : answer; // step5 - answer = answer.length >= 16 ? answer.slice(0, 15) : answer; //step6 - answer = answer.replace(step4_2, ''); - switch ( - answer.length // step7 - ) { - case 1: - answer = answer + answer[0] + answer[0]; - break; - case 2: - answer = answer + answer[1]; - break; - } - return answer; -} - -//정답 3 - jaewon1676 -function solution(new_id) { - // 1 소문자로 치환 - let answer = new_id - .toLowerCase() - - // 2 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 문자 제거. - .replace(/[^a-z0-9-_.]/gi, '') - - // 3 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환 - .replace(/[.]{2,}/gi, '.') - - // 4 마침표(.)가 처음이나 끝에 위치하면 제거 - .replace(/^[.]|[.]$/gi, ''); - - // 5 빈 문자열이면 a 대입 - if (answer === '') answer = 'a'; - - // 6 length > 15이면 그 뒤의 문자들은 제거 - if (answer.length > 15) { - answer = answer.substring(0, 15); - // 마침표(.)가 끝에 위치하면 마침표(.)제거 - answer = answer.replace(/[.]$/gi, ''); - } - - // 7 length < 3이면 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임 - while (answer.length < 3) { - answer += answer[answer.length - 1]; - } - return answer; -} - -//정답 4 - chaerin-dev -function solution(new_id) { - // 1단계: 모든 대문자를 소문자로 - new_id = new_id.toLowerCase(); - - // 2단계: 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자 제거 - new_id = new_id.replace(/[^\w\-\.]/g, ''); - - // 3단계: 연속되는 마침표는 마침표 하나로 - new_id = new_id.replace(/\.{2,}/g, '.'); - - // 4단계: 처음이나 끝에 마침표가 있으면 제거 - new_id = new_id.replace(/^\.|\.$/, ''); - - // 5단계: new_id가 빈 문자열이면 "a" 대입 - if (new_id.length === 0) new_id = 'a'; - - // 6단계: new_id의 길이가 16자 이상이면, - // new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거 - // 제거 후 끝에 마침표가 있으면 제거 - if (new_id.length >= 16) new_id = new_id.slice(0, 15); - new_id = new_id.replace(/\.$/, ''); - - // 7단계: new_id의 길이가 2자 이하이면, - // new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 이어붙임 - let len = new_id.length; - if (len <= 2) new_id = new_id + new_id[len - 1].repeat(3 - len); - - return new_id; -} -//정답 5(🎩 refactor 220425) - codeisneverodd -function solution(new_id) { - let answer = new_id - .toLowerCase() //step 1 - .replace(/[^0-9a-z._-]/g, '') // step 2 - .replace(/\.+/g, '.') //step 3 - .replace(/^\.|\.$/g, '') //step 4 - .replace(/^$/, 'a') //step 5 - .slice(0, 15) - .replace(/\.$/, ''); //step 6 - // step7 - if (answer.length === 1) answer = answer[0].repeat(3); - if (answer.length === 2) answer = answer + answer[1]; - - return answer; -} diff --git "a/level-1/\354\213\244\355\214\250\354\234\250&42889&.js" "b/level-1/\354\213\244\355\214\250\354\234\250&42889&.js" deleted file mode 100644 index dbf3b99..0000000 --- "a/level-1/\354\213\244\355\214\250\354\234\250&42889&.js" +++ /dev/null @@ -1,79 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(N, stages) { - let stageNFailRate = []; - for (let stage = 1; stage <= N; stage++) { - const playerReached = stages.filter((player) => player >= stage).length; - const playerChallenging = stages.filter( - (player) => player === stage - ).length; - stageNFailRate.push([stage, playerChallenging / playerReached]); - } - stageNFailRate.sort((a, b) => b[1] - a[1]); - return stageNFailRate.map((stage) => stage[0]); -} - -//정답 2 - codeisneverodd -function solution(N, stages) { - var answer = []; - let failRate = new Array(N + 2).fill(0); - let playerChallenging = new Array(N + 2).fill(0); - let playerReached = new Array(N + 2).fill(0); - - for (const stage of stages) { - for (let i = 1; i <= stage; i++) playerReached[i] += 1; - playerChallenging[stage] += 1; - } - for (let i = 1; i <= N + 1; i++) - failRate[i] = - playerReached[i] === 0 ? 0 : playerChallenging[i] / playerReached[i]; - const rateNIndex = failRate - .slice(1, N + 1) - .map((rate, stage) => [rate, stage + 1]); - const sortedRate = rateNIndex.sort((a, b) => b[0] - a[0]); - answer = sortedRate.map((stage) => stage[1]); - return answer; -} - -//정답 3 - jaewon1676 -function solution(N, stages) { - let map = Array.from(Array(N), () => Array(2).fill(0)); - let answer = Array(N).fill(0, 0, N); // 스테이지별 탈락자 수 - let rate = Array(N).fill(0, 0, N); // 스테이지별 실패율 - let count = 0; - - stages.sort(function (a, b) { - return a - b; - }); // 난이도 오름차순 정렬 - for (let i = 1; i <= N; i++) { - while (1) { - // i 스테이지의 실패율 계산 - if (stages[0] == i) { - answer[i - 1] += 1; - count += 1; - stages.shift(); - } else break; - } - rate[i - 1] += answer[i - 1] / (stages.length + count); // 실패율 계산 - - count = 0; - - map[i - 1][0] = i; - map[i - 1][1] = rate[i - 1]; - } - map.sort((a, b) => b[1] - a[1]); // value값(실패율) 기준 내림차순정렬 - let stack = []; // 답 - for (let i = 0; i < map.length; i++) { - stack.push(map[i][0]); - } - - return stack; -} - -/* 풀이 과정 -1. 스테이지를 정렬 후 난이도 N과 같은 스테이지가 맨 앞에 있는지 찾아 찾으면 shift, 찾지 못하면 다음 난이도로 넘어간다. -2. 실패율을 계산해주기 위해, 스테이지별 탈락자 수,스테이지별 실패율 배열을 생성하여 각각, 계산해준다. -3. 계산 해준 값들을 2차원 배열 map 객체에 넣어준다. 2차원으로 한 이유는 index값과, 실패율 값을 같이 넣어 정렬 시에도 index값을 유지 하기 위해서. -4. 실패율을 내림차순(같으면 스테이지가 낮은거부터 오름차순)으로 정렬하여 출력해준다. -*/ diff --git "a/level-1/\354\225\275\354\210\230\354\235\230-\352\260\234\354\210\230\354\231\200-\353\215\247\354\205\210&77884&.js" "b/level-1/\354\225\275\354\210\230\354\235\230-\352\260\234\354\210\230\354\231\200-\353\215\247\354\205\210&77884&.js" deleted file mode 100644 index 097e9e9..0000000 --- "a/level-1/\354\225\275\354\210\230\354\235\230-\352\260\234\354\210\230\354\231\200-\353\215\247\354\205\210&77884&.js" +++ /dev/null @@ -1,60 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(left, right) { - let answer = 0; - for (let num = left; num <= right; num++) { - answer = Number.isInteger(Math.sqrt(num)) ? answer - num : answer + num; - } - return answer; -} - -//정답 2 - codeisneverodd -function solution(left, right) { - var answer = 0; - for (let num = left; num <= right; num++) { - divisorCounter(num) % 2 === 0 ? (answer += num) : (answer -= num); - } - return answer; -} - -const divisorCounter = (num) => { - let count = 0; - const sqrt = Math.sqrt(num); - for (let i = 1; i <= sqrt; i++) if (num % i === 0) count += 1; - return Number.isInteger(sqrt) ? (count - 1) * 2 + 1 : count * 2; -}; - -//정답 3 - jaewon1676 -function solution(left, right) { - var answer = 0; - - for (left; left <= right; left++) { - // left의 제곱근이 정수면 약수의 개수는 홀수 - if (Number.isInteger(Math.sqrt(left))) { - answer -= left; - } else { - answer += left; - } - } - return answer; -} - -// 정답 4 - prove-bility -function getDivisorCount(i) { - let count = 0; - for(let j = 1; j <= i; j++) { - if(i % j === 0) count++; - } - return count; -} - -function solution(left, right) { - let answer = 0; - for(let i = left; i <= right; i++) { - let count = getDivisorCount(i); - if(count % 2 === 0) answer += i; - else answer -= i; - } - return answer; -} diff --git "a/level-1/\354\225\275\354\210\230\354\235\230-\355\225\251&12928&.js" "b/level-1/\354\225\275\354\210\230\354\235\230-\355\225\251&12928&.js" deleted file mode 100644 index db732a8..0000000 --- "a/level-1/\354\225\275\354\210\230\354\235\230-\355\225\251&12928&.js" +++ /dev/null @@ -1,69 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n) { - let answer = 0; - for (let divisor = 1; divisor <= n; divisor++) { - if (n % divisor === 0) answer += divisor; - } - return answer; -} - -//정답 2 - yongchanson -function solution(n) { - var answer = 0; - let i; - for (i = 1; i <= Math.sqrt(n); i++) { - if (n % i == 0) { - if (i * i == n) { - //i의 제곱이 n인경우 처리 - answer += i; - } else { - answer += i; - answer += n / i; - } - } - } - - return answer; -} - -//정답 3 - chaerin-dev -function solution(n) { - let result = 0; - let sqrtN = Math.sqrt(n); - // 효율성을 위해 1부터 n의 제곱근-1까지만 순회 - for (let i = 1; i < sqrtN; i++) { - if (n % i === 0) result += i + n / i; - } - // n의 제곱근이 정수인 경우 n의 제곱근도 더해줌 - if (Number.isInteger(sqrtN)) result += sqrtN; - return result; -} - -//정답 4 - jaewon1676 -function solution(n) { - var answer = 0; - for (let i = 1; i <= n; i++) { - if (n % i == 0) { - // n으로 i를 나눴을 때, 나머지가 0이면 약수이다. - answer += i; - } - } - return answer; -} - -// 약수란 어떤 수를 나누었을 때 나머지 없이 나누어 떨어지게 하는 그 수입니다. -// 10을 예로 들면, 10은 1, 2, 5, 10 이 나누었을 때 나머지가 없으므로 약수입니다. -// 3, 4, 6, 7, 8, 9 는 나누었을 때 나머지가 남기때문에 약수가 아닙니다. - - -//정답 4 - prove-ability -function solution(n) { - let answer = 0; - for(let i = 1; i <= n; i++) { - if(n % i === 0) answer += i; - } - return answer; -} - diff --git "a/level-1/\354\227\206\353\212\224-\354\210\253\354\236\220-\353\215\224\355\225\230\352\270\260&86051&.js" "b/level-1/\354\227\206\353\212\224-\354\210\253\354\236\220-\353\215\224\355\225\230\352\270\260&86051&.js" deleted file mode 100644 index 0e5fcff..0000000 --- "a/level-1/\354\227\206\353\212\224-\354\210\253\354\236\220-\353\215\224\355\225\230\352\270\260&86051&.js" +++ /dev/null @@ -1,59 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(numbers) { - return 45 - numbers.reduce((a, b) => a + b); -} - -//정답 2 - codeisneverodd -function solution(numbers) { - var answer = 0; - for (let i = 0; i < 10; i++) { - answer += numbers.includes(i) ? 0 : i; - } - return answer; -} - -//정답 3 - yongchanson -function solution(numbers) { - var answer = -1; - - let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; - let arr_sum = 0; - let numbers_sum = 0; - - for (i = 0; i < arr.length / 2; i++) { - if (arr[i] == arr[arr.length - 1 - i]) { - arr_sum += arr[i]; - } else { - arr_sum += arr[i] + arr[arr.length - 1 - i]; - } - } - - for (i = 0; i < numbers.length; i++) { - numbers_sum += numbers[i]; - } - - answer = arr_sum - numbers_sum; - return answer; -} - -//정답 4 - prove-ability -function solution(numbers) { - var answer = 0; - - for (let i = 0; i < 10; i++) { - if (!numbers.includes(i)) answer += i; - } - - return answer; -} - -//정답 5 - chaerin-dev -function solution(numbers) { - let answer = 0; - for (let i = 0; i <= 9; i++) { - if (!numbers.includes(i)) answer += i; - } - return answer; -} \ No newline at end of file diff --git "a/level-1/\354\230\210\354\202\260&12982&.js" "b/level-1/\354\230\210\354\202\260&12982&.js" deleted file mode 100644 index c774802..0000000 --- "a/level-1/\354\230\210\354\202\260&12982&.js" +++ /dev/null @@ -1,48 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(d, budget) { - let answer = 0; - d.sort((a, b) => a - b); - for (const department of d) { - if (budget < department) break; - answer += 1; - budget -= department; - } - return answer; -} - - -//정답 2 - prove-ability -function solution(d, budget) { - let sum = 0; - let count = 0; - // 오름차순 정렬 - d.sort((a, b) => a - b); - for(let i = 0, len = d.length; i < len; i++) { - // 작은 수 부터 하나씩 더해준다 - sum += d[i]; - // 더한 수가 정해진 예산과 같다면 이전까지 센 카운트 반환 - if(sum > budget) return count; - count++; - } - - return count; -} - -//정답 3 - jaewon1676 -function solution(d, budget) { - let count = 0; // 최대 물품 지원 할 수 있는 부서 수 - d.sort((a, b) => a - b) // 오름차순 정렬 - for (let i=0; i (v === participant[i] ? a + 1 : a), - 0 - ); - // 해당 값이 참가자 그룹 내 2명 이상이고 이전 최대 동명이인 참가자보다 많다면 - // 해당 로직을 반복하면 제일 많은 동명이인을 알 수 있다 - if (count > 1 && max < count) { - answer = participant[i]; - // 조건에 맞는 동명이인 수 저장 - max = count; - } - } - return answer; -} - -//완벽한 정답이 아닙니다. -//정답 4 - chaerin-dev -function solution(participant, completion) { - var answer = ""; - // 두 배열을 정렬한다! - participant.sort(); - completion.sort(); - // 앞에서부터 차례로 비교하다가 값이 다를 때 participant의 요소가 완주하지 못한 선수!! - // if (participant[i] != completion[i] || i == participant.length - 1) 이런 식으로 - // 완주하지 못한 선수의 이름이 마지막에 있을 경우도 고려해야 하나..? 라고 생각했지만 - // 그 때는 completion[i]의 값이 undefined가 되므로 괜찮음! - for (let i = 0; i < participant.length; i++) { - if (participant[i] != completion[i]) { - answer = participant[i]; - break; - } - } - return answer; -} diff --git "a/level-1/\354\235\214\354\226\221-\353\215\224\355\225\230\352\270\260&76501&.js" "b/level-1/\354\235\214\354\226\221-\353\215\224\355\225\230\352\270\260&76501&.js" deleted file mode 100644 index 59dc770..0000000 --- "a/level-1/\354\235\214\354\226\221-\353\215\224\355\225\230\352\270\260&76501&.js" +++ /dev/null @@ -1,69 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(absolutes, signs) { - return absolutes.reduce( - (acc, curr, i) => acc + curr * (signs[i] ? 1 : -1), - 0 - ); -} - -//정답 2 - codeisneverod -function solution(absolutes, signs) { - var answer = 0; - for (let i = 0; i < absolutes.length; i++) { - answer += signs[i] ? absolutes[i] : -1 * absolutes[i]; - } - return answer; -} - -//정답 3 - jaewon1676 -function solution(absolutes, signs) { - var answer = 0; - for (var i = 0; i < absolutes.length; i++) { - if (signs[i] === false) { - answer = answer - absolutes[i]; - } else { - answer = answer + absolutes[i]; - } - } - - return answer; -} - -// 정답 4 - prove-ability -function solution(absolutes, signs) { - var answer = 0; - - for (let i = 0, len = absolutes.length; i < len; i++) { - if (!signs[i]) answer += absolutes[i] * -1; - else answer += absolutes[i]; - } - - return answer; -} - -// 정답 5 - prove-ability -function solution(absolutes, signs) { - let answer = 0; - absolutes.forEach((absolute, i) => { - if(!signs[i]) absolute *= -1; - answer += absolute; - }) - return answer; -} - -// 정답 6 - chaerin-dev -function solution(absolutes, signs) { - // 연산 결과를 저장할 변수 - let result = 0; - // signs의 각 요소에 대해 - signs.forEach((e, i) => { - // 요소가 true이면 result값에 같은 인덱스의 absolutes 요소를 더해줌 - if (e) result += absolutes[i]; - // 요소가 false이면 result값에 같은 인덱스의 absolutes 요소를 빼줌 - else result -= absolutes[i]; - }); - // result 반환 - return result; -} \ No newline at end of file diff --git "a/level-1/\354\235\264\354\203\201\355\225\234-\353\254\270\354\236\220-\353\247\214\353\223\244\352\270\260&12930&.js" "b/level-1/\354\235\264\354\203\201\355\225\234-\353\254\270\354\236\220-\353\247\214\353\223\244\352\270\260&12930&.js" deleted file mode 100644 index 565d4f4..0000000 --- "a/level-1/\354\235\264\354\203\201\355\225\234-\353\254\270\354\236\220-\353\247\214\353\223\244\352\270\260&12930&.js" +++ /dev/null @@ -1,87 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s) { - return s - .split(" ") - .map((word) => - word - .split("") - .map((char, index) => - index % 2 === 0 - ? word[index].toUpperCase() - : word[index].toLowerCase() - ) - .join("") - ) - .join(" "); -} - -//정답 2 - chaerin-dev -// 원래 문자가 모두 소문자여야 할 이유는 없다는 사실, 공백이 하나 이상일 수 있다는 사실을 빠뜨려서 조금 오래 생각한 문제..! -function solution(s) { - let result = ""; - let flag = true; - for (let i = 0; i < s.length; i++) { - if (s[i] === " ") { - flag = false; - result += s[i]; - } else if (flag) { - result += s[i].toUpperCase(); - } else { - result += s[i].toLowerCase(); - } - flag = !flag; - } - return result; -} - -//정답 3 - jaewon1676 -function solution(s) { - return s - .split(" ") - .map((el) => - el - .split("") - .map((el, index) => - index % 2 == 0 ? el.toUpperCase() : el.toLowerCase() - ) - .join("") - ) - .join(" "); -} - -/* s.split(' ') // 띄어쓰기를 기준으로 나눕니다. [ 'try', 'hello', 'world' ] - -.map(el => el.split('')) 나눈것을 기준으로 요소 하나 하나씩 나눠줍니다 -[[ 't', 'r', 'y' ], [ 'h', 'e', 'l', 'l', 'o' ], [ 'w', 'o', 'r', 'l', 'd' ]] - -.map((el, index) => index % 2 == 0 ? el.toUpperCase() : el.toLowerCase()) -//map에서 첫번째는 앞에서 가져온 요소, 두번째는 index를 반환 합니다! -//map의 index를 기준으로 짝수인지 홀수인지 판별하여 대문자, 소문자로 변환 해줍니다. -[[ 'T', 'r', 'Y' ], [ 'H', 'e', 'L', 'l', 'O' ], [ 'W', 'o', 'R', 'l', 'D' ]] - -.join('') 작은 배열들을 합쳐줍니다. -['TrY', 'HeLlO', 'WoRlD'] - -.join(' ') 큰 배열들을 합쳐줍니다. -"TrY HeLlO WoRlD" - -대, 소문자 변환, split, reverse, join, map 등등을 활용 해야 하므로 -문자열을 연습하는데 좋은 문제입니다. -*/ - - -//정답 4 - prove-ability -function solution(s) { - let answer = ''; - s.split(" ").forEach((word) => { - for(let i = 0, len = word.length; i < len; i++) { - if(i % 2 === 0) answer+=word[i].toUpperCase(); - else answer+=word[i].toLowerCase(); - } - answer += " "; - }) - answer = answer.slice(0, answer.length - 1) - return answer; -} diff --git "a/level-1/\354\236\220\353\246\277\354\210\230-\353\215\224\355\225\230\352\270\260&12931&.js" "b/level-1/\354\236\220\353\246\277\354\210\230-\353\215\224\355\225\230\352\270\260&12931&.js" deleted file mode 100644 index 920c207..0000000 --- "a/level-1/\354\236\220\353\246\277\354\210\230-\353\215\224\355\225\230\352\270\260&12931&.js" +++ /dev/null @@ -1,39 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n) { - return n - .toString() - .split("") - .map((x) => parseInt(x)) - .reduce((acc, curr) => acc + curr, 0); -} - -//정답 2 - chaerin-dev -function solution(n) { - // 숫자 -> 문자열 -> 배열 -> 각 요소를 정수로 변환한 후 더한 누적 결과값 반환 - return String(n) - .split("") - .reduce((acc, item) => (acc += parseInt(item)), 0); -} - -//정답 3 - chaerin-dev -function solution(n) { - let result = 0; - while (n > 0) { - result += n % 10; - n = Math.floor(n / 10); - } - return result; -} - -// 정답 4 - prove-ability -function solution(n) { - var answer = 0; - n.toString() - .split("") - .forEach((v) => { - answer += parseInt(v); - }); - return answer; -} diff --git "a/level-1/\354\236\220\354\227\260\354\210\230-\353\222\244\354\247\221\354\226\264-\353\260\260\354\227\264\353\241\234-\353\247\214\353\223\244\352\270\260&12932&.js" "b/level-1/\354\236\220\354\227\260\354\210\230-\353\222\244\354\247\221\354\226\264-\353\260\260\354\227\264\353\241\234-\353\247\214\353\223\244\352\270\260&12932&.js" deleted file mode 100644 index a6eb8bb..0000000 --- "a/level-1/\354\236\220\354\227\260\354\210\230-\353\222\244\354\247\221\354\226\264-\353\260\260\354\227\264\353\241\234-\353\247\214\353\223\244\352\270\260&12932&.js" +++ /dev/null @@ -1,66 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n) { - return n - .toString() - .split("") - .reverse() - .map((x) => parseInt(x)); -} - -//정답 2 - chaerin-dev -function solution(n) { - // 숫자 -> 문자열 -> 배열 -> 뒤집기 -> 모든 원소에 대해 자연수로 형 변환 - return String(n) - .split("") - .reverse() - .map((item) => parseInt(item)); -} - -//정답 3 - jaewon1676 -function solution(n) { - var answer = []; - // 정수형 => 문자형 => 하나씩 잘라서 뒤집어서 모아준다. - n = n.toString().split("").reverse().join(""); - for (let i = 0; i < n.length; i++) { - answer.push(parseInt(n[i])); // n은 지금 문자형이기때문에 Push 하기전에 정수형으로 바꿔줌 - // answer.push(n[i]) 로 해주면 현재 n[i]는 문자형이기때문에 결과는 ["5","4","3","2","1"] 가 됩니다. - // answer(parseInt(n[i])) 로 해준다면 n[i]는 문자형 => 정수형으로 변하기 때문에 결과는 [5, 4, 3, 2, 1] 가 됩니다. - // 문자형과 정수형의 차이는 숫자에 큰 따옴표가 있느냐 없느냐의 차이입니다. - } - return answer; -} - -//정답 4 - jaewon1676 -function solution(n) { - return (n = n - .toString() - .split("") - .reverse() - .map((o) => (o = parseInt(o)))); -} - -// 정답 5 - prove-ability -function solution(n) { - // 1. 문자열 변환 - // 2. 배열로 변환 - // 3. 배열 반전 - // 4. 정수로 변환 - return n - .toString() - .split("") - .reverse() - .map((v) => parseInt(v)); -} - -//정답 6 - yongchanson -function solution(n) { - let answer = []; - let string = n.toString(); - for (let i = string.length - 1; i >= 0; i--) { - let slice = string.substr(i, 1) * 1; - answer.push(slice); - } - return answer; -} diff --git "a/level-1/\354\240\225\354\210\230-\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234-\353\260\260\354\271\230\355\225\230\352\270\260&12933&.js" "b/level-1/\354\240\225\354\210\230-\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234-\353\260\260\354\271\230\355\225\230\352\270\260&12933&.js" deleted file mode 100644 index 4b8b08d..0000000 --- "a/level-1/\354\240\225\354\210\230-\353\202\264\353\246\274\354\260\250\354\210\234\354\234\274\353\241\234-\353\260\260\354\271\230\355\225\230\352\270\260&12933&.js" +++ /dev/null @@ -1,28 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n) { - return parseInt( - n - .toString() - .split("") - .sort((a, b) => b - a) - .join("") - ); -} - -//정답 2 - chaerin-dev -function solution(n) { - // 정수 -> 문자열 -> 배열 - let arrN = String(n).split(""); - // 배열 내림차순 정렬 - arrN.sort((a, b) => b - a); - // 배열 -> 문자열 -> 정수 - return parseInt(arrN.join("")); -} - -//정답 3 - prove-ability -function solution(n) { - return parseInt(n.toString().split("").sort((a, b) => b - a).join(""), 10); -} - diff --git "a/level-1/\354\240\225\354\210\230-\354\240\234\352\263\261\352\267\274-\355\214\220\353\263\204&12934&.js" "b/level-1/\354\240\225\354\210\230-\354\240\234\352\263\261\352\267\274-\355\214\220\353\263\204&12934&.js" deleted file mode 100644 index 95c9d82..0000000 --- "a/level-1/\354\240\225\354\210\230-\354\240\234\352\263\261\352\267\274-\355\214\220\353\263\204&12934&.js" +++ /dev/null @@ -1,39 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n) { - return Number.isInteger(Math.sqrt(n)) ? (Math.sqrt(n) + 1) ** 2 : -1; -} - -//정답 2 - chaerin-dev -function solution(n) { - // n의 제곱근값을 x에 저장 - let x = Math.sqrt(n); - // x가 정수이면 x+1의 제곱 반환, x가 정수가 아니면 -1 반환 - return Number.isInteger(x) ? Math.pow(x + 1, 2) : -1; -} - -//정답 3 - prove-ability -function solution(n) { - // n의 제곱근을 x 초기화 - const x = Math.sqrt(n); - // 양의 정수라면 x + 1 제곱 반환 - if(Number.isInteger(x)) return Math.pow(x + 1, 2) - // 아니라면 -1 반환 - return -1; -} - -//정답 4 - jaewon1676 -function solution(n) { - let s = parseInt(Math.sqrt(n)) // n의 제곱근을 확인 - if (s ** 2 === n) return ((s+1) ** 2) - - return -1; -} - -//정답 5 - yongchanson -function solution(n) { - const sqrt = Math.sqrt(n); - //sqrt % 1 == 0 이면 양의정수, -0이면 음의정수 - return sqrt % 1 == 0 ? (sqrt + 1) ** 2 : -1; -} diff --git "a/level-1/\354\240\234\354\235\274-\354\236\221\354\235\200-\354\210\230-\354\240\234\352\261\260\355\225\230\352\270\260&12935&.js" "b/level-1/\354\240\234\354\235\274-\354\236\221\354\235\200-\354\210\230-\354\240\234\352\261\260\355\225\230\352\270\260&12935&.js" deleted file mode 100644 index b979bc2..0000000 --- "a/level-1/\354\240\234\354\235\274-\354\236\221\354\235\200-\354\210\230-\354\240\234\352\261\260\355\225\230\352\270\260&12935&.js" +++ /dev/null @@ -1,68 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(arr) { - const index = arr.indexOf(Math.min(...arr)); - arr.splice(index, 1); - return arr.length === 0 ? [-1] : arr; -} - -//정답 2 - jaewon1676 -function solution(arr) { - var answer = []; - - let min = Math.min(...arr); - while (1) { - for (let i = 0; i < arr.length; i++) { - if (min == arr[i]) { - arr.splice(i, 1); - if (arr.length == 0) { - return [-1]; - } else { - return arr; - } - } - } - } - return -1; -} - -/* 풀이과정 -1. 배열의 최솟값을 min 변수에 담아줍니다. -2. 배열을 순회하며 최솟값을 찾아 splice 메서드를 사용해 최솟값의 자리만 제거해줍니다. -3. 최솟값 제거 후 배열 크기가 0이면 -1, 그렇지 않으면 배열 그대로 반환합니다. */ - -//정답 3 - jaewon1676 -function solution(arr) { - arr.splice(arr.indexOf(Math.min(...arr)), 1); - if (arr.length < 1) return [-1]; - return arr; -} - -/* 풀이과정 arr [4,3,2,1] 일경우 -Math.min(...arr)은 1 -arr.indexOf(1), 1이 있는 index가 3이므로 3 반환. -arr.splice(3, 1) arr의 3번째 index만 제거 해준다. -arr의 크기가 1보다 작으면 -1, 그렇지 않으면 그대로 반환. */ - -//정답 4 - chaerin-dev -function solution(arr) { - // arr에서 가장 최솟값의 위치를 찾아 해당 위치의 값을 삭제 - arr.splice(arr.indexOf(Math.min(...arr)), 1); - // arr가 빈 배열이 아니면 arr를 반환, arr가 빈 배열이면 [-1]반환 - return arr.length ? arr : [-1]; -} - -//정답 3 - prove-ability -function solution(arr) { - // 최솟값 찾기 - const min = Math.min(...arr); - // arr 중 min 과 같은 요소의 인덱스 제거 - arr.splice( - arr.findIndex((num) => num === min), - 1 - ); - // 만약 arr 가 비어있다면 [-1] 반환 - if (arr.length === 0) return [-1]; - return arr; -} diff --git "a/level-1/\354\247\201\354\202\254\352\260\201\355\230\225-\353\263\204\354\260\215\352\270\260&12969&.js" "b/level-1/\354\247\201\354\202\254\352\260\201\355\230\225-\353\263\204\354\260\215\352\270\260&12969&.js" deleted file mode 100644 index 4562ac1..0000000 --- "a/level-1/\354\247\201\354\202\254\352\260\201\355\230\225-\353\263\204\354\260\215\352\270\260&12969&.js" +++ /dev/null @@ -1,54 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - chaerin-dev -process.stdin.setEncoding("utf8"); -process.stdin.on("data", (data) => { - const n = data.split(" "); - const a = Number(n[0]), - b = Number(n[1]); - // 정답을 저장할 문자열 answer - answer = ""; - // 세로 길이만큼 아래의 과정(가로 길이만큼 별 더해주고 줄 바꾸기) 반복 - for (let i = 0; i < b; i++) { - // 가로 길이만큼 문자열에 별 더해주기 - for (let j = 0; j < a; j++) answer += "*"; - // 가로 길이만큼 별을 다 더해줬으면 줄 바꾸기 - answer += "\n"; - } - // 정답 출력 - console.log(answer); -}); - -//정답 2 - prove-ability -process.stdin.setEncoding('utf8'); -process.stdin.on('data', data => { - const nums = data.split(" "); - const n = Number(nums[0]), m = Number(nums[1]); - - let result = ""; - // 2차원으로 접근 - // 세로 길이만큼 반복 - for(let i = 0; i < m; i++) { - // 가로 길이만큼 별 더하기 - for(let j = 0; j < n; j++) { - result += "*"; - } - // 가로가 끝나면 줄내림 - result += "\n"; - } - console.log(result) -}); - -//정답 3 - yongchanson -process.stdin.setEncoding("utf8"); -process.stdin.on("data", (data) => { - const n = data.split(" "); - const a = Number(n[0]), - b = Number(n[1]); - console.log(("*".repeat(a) + `\n`).repeat(b)); -}); -/* -<풀이과정> -repeat() 메서드는 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환한다. ex) str.repeat(count); -'*'.repeat(a) : *를 a만큼 반복한다. -*/ diff --git "a/level-1/\354\247\235\354\210\230\354\231\200-\355\231\200\354\210\230&12937&.js" "b/level-1/\354\247\235\354\210\230\354\231\200-\355\231\200\354\210\230&12937&.js" deleted file mode 100644 index 377141c..0000000 --- "a/level-1/\354\247\235\354\210\230\354\231\200-\355\231\200\354\210\230&12937&.js" +++ /dev/null @@ -1,29 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(num) { - return num % 2 === 0 ? "Even" : "Odd"; -} - -//정답 2 - chaerin-dev -function solution(num) { - return num % 2 == 0 ? "Even" : "Odd"; -} - -//정답 3 - jaewon1676 -function solution(num) { - let answer; - num % 2 == 0 ? (answer = "Even") : (answer = "Odd"); - // 삼항 연산자를 사용하여 참일경우 Even, 거짓일 경우 Odd를 반환. - return answer; -} - -//정답 4 - prove-ability -function solution(num) { - return num % 2 === 0 ? "Even" : "Odd"; -} - -//정답 5 - yongchanson -function solution(num) { - return num % 2 ? "Odd" : "Even"; -} diff --git "a/level-1/\354\262\264\354\234\241\353\263\265&42862&.js" "b/level-1/\354\262\264\354\234\241\353\263\265&42862&.js" deleted file mode 100644 index 5baa4f6..0000000 --- "a/level-1/\354\262\264\354\234\241\353\263\265&42862&.js" +++ /dev/null @@ -1,127 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n, lost, reserve) { - let answer = 0; - let studentClothes = new Array(n + 2).fill(1); - for (const student of reserve) studentClothes[student] += 1; - for (const student of lost) studentClothes[student] -= 1; - for (let i = 1; i < n + 1; i++) { - if (studentClothes[i] === 0) { - if (studentClothes[i - 1] === 2 || studentClothes[i + 1] === 2) { - if (studentClothes[i - 1] === 2) { - studentClothes[i - 1] -= 1; - studentClothes[i] += 1; - } else { - studentClothes[i + 1] -= 1; - studentClothes[i] += 1; - } - } - } - } - for (const student of studentClothes) { - answer += student > 0 ? 1 : 0; - } - answer -= 2; - return answer; -} - -//정답 2 - prove-ability -function solution(n, lost, reserve) { - // students 초기화 - 학생들은 체육복 개수 1로 초기화 - let students = Array.from({ length: n }).fill(1); - - // 읽어버린 학생 개수 반영 - lost.forEach((target) => { - students[target - 1]--; - }); - - // 여별 체육복 개수 반영 - reserve.forEach((target) => { - students[target - 1]++; - }); - - // 학생들 순차적으로 접근 - for (let i = 0, len = students.length; i < len; i++) { - // 체육복 0 | 1 을 가진 학생들을 대여 불가능이기 때문에 continue - if (students[i] === 0 || students[i] === 1) continue; - // 이전 번호의 학생이 있고 그 학생이 0개의 체육복을 가졌다면 - if (i !== 0 && students[i - 1] === 0) { - // 이전 학생 증가 - students[i - 1]++; - // 자신은 대여해줬으니 감소 - students[i]--; - } - // 인덱스 학생이 1개 초과한 체육을 가지고 다음 번호의 학생이 있고 그 학생이 0개의 체육복을 가졌다면 - if (students[i] > 1 && i + 1 !== len && students[i + 1] === 0) { - // 다음 학생 증가 - students[i + 1]++; - // 자신은 대여해줬으니 감소 - students[i]--; - } - } - // 체육복 1개 이상을 가진 학생들의 수 반환 - return students.filter((v) => v >= 1).length; -} - -//정답 3 - jaewon1676 -function solution(n, lost, reserve) { - let answer = Array(n).fill(1) // n만큼의 배열을 만들어서 1을 만들어줍니다 - let cnt = 0; - for(let i = 0; i < reserve.length; i++){ // reserve 를 순회하며 체육복 - answer[reserve[i]-1] += 1 - } - for(let i = 0; i < lost.length; i++){ // lost 를 순회하며 체육복 수를 -1 - answer[lost[i]-1] -= 1 - } - for(let i = 0; i < n; i++){ // n을 순회하며 앞사람과 뒷사람의 체육복 수를 비교한다. - if (answer[i] == 2 && answer[i+1] == 0 || answer[i+1] == 2 && answer[i] == 0){ - answer[i] = 1 - answer[i+1] = 1 - } - } - for(let i = 0; i < answer.length; i++){ - (answer[i] >= 1 ? cnt += 1 : null) - } - return cnt - } - //그리디 - // 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 diff --git "a/level-1/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200-\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230&12940&.js" "b/level-1/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200-\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230&12940&.js" deleted file mode 100644 index 2a1955e..0000000 --- "a/level-1/\354\265\234\353\214\200\352\263\265\354\225\275\354\210\230\354\231\200-\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230&12940&.js" +++ /dev/null @@ -1,33 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(n, m) { - const gcd = greatestCommonDivisor(n, m); - return [gcd, (n * m) / gcd]; -} - -const greatestCommonDivisor = (a, b) => { - if (b === 0) return a; - else return greatestCommonDivisor(b, a % b); -}; - -//정답 2 - chaerin-dev -function solution(n, m) { - // 최대공약수 구하기 - let gcd = (n, m) => (n % m === 0 ? m : gcd(m, n % m)); - // 최소공배수 구하기 - let lcm = (n, m) => (n * m) / gcd(n, m); - // 결과 출력 - return [gcd(n, m), lcm(n, m)]; -} - -//정답 3 - yongchanson -function solution(a, b) { - let gcd = 0; - for (let i = 1; i <= Math.min(a, b); i++) { - if ((a % i) + (b % i) === 0) { - gcd = i; - } - } - return [gcd, (a / gcd) * b]; -} diff --git "a/level-1/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225&86491&.js" "b/level-1/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225&86491&.js" deleted file mode 100644 index 6f0a7d4..0000000 --- "a/level-1/\354\265\234\354\206\214\354\247\201\354\202\254\352\260\201\355\230\225&86491&.js" +++ /dev/null @@ -1,32 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220830) - codeisneverodd -function solution(sizes) { - const maxWidth = Math.max(...sizes.map(card => Math.min(...card))); - const maxHeight = Math.max(...sizes.map(card => Math.max(...card))); - return maxWidth * maxHeight; -} - -// 정답 2 - prove-ability -function solution(sizes) { - // 가로, 세로 중 큰 값을 가로 길이로 변경(스압) - sizes.forEach(([width, height], index) => { - if (sizes[index][0] < sizes[index][1]) [sizes[index][0], sizes[index][1]] = [sizes[index][1], sizes[index][0]]; - }); - - // 가로, 세로 각각 큰 값 추출 - const widthMax = Math.max(...sizes.map(v => v[0])); - const widthHeight = Math.max(...sizes.map(v => v[1])); - - return widthMax * widthHeight; -} -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(sizes) { - for (let card of sizes) { - if (card[0] < card[1]) [card[0], card[1]] = [card[1], card[0]]; - } - - const maxWidth = Math.max(...sizes.map(card => card[0])); - const maxHeight = Math.max(...sizes.map(card => card[1])); - return maxWidth * maxHeight; -} diff --git "a/level-1/\354\275\234\353\235\274\354\270\240-\354\266\224\354\270\241&12943&.js" "b/level-1/\354\275\234\353\235\274\354\270\240-\354\266\224\354\270\241&12943&.js" deleted file mode 100644 index 27f96d5..0000000 --- "a/level-1/\354\275\234\353\235\274\354\270\240-\354\266\224\354\270\241&12943&.js" +++ /dev/null @@ -1,75 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(num) { - let answer = 0; - while (answer <= 500) { - if (num === 1) return answer; - num = num % 2 === 0 ? num / 2 : num * 3 + 1; - answer += 1; - } - return -1; -} - -//정답 2 - chaerin-dev -function solution(num) { - // 작업을 반복한 횟수를 저장할 변수 - let cnt = 0; - // num이 1이 되면 반복 종료 - while (num > 1) { - // 작업을 500번 반복해도 1이 되지 않으면 -1 반환 - if (cnt == 500) return -1; - // 작업 반복 횟수 증가 - cnt++; - // 입력된 수가 짝수이면 2로 나누기 - if (num % 2 == 0) num /= 2; - // 입력된 수가 홀수이면 3을 곱하고 1을 더하기 - else { - num *= 3; - num++; - } - } - // 작업을 반복한 횟수 반환 - return cnt; -} - -//정답 3 - jaewon1676 -function solution(num) { - var answer = 0; - // num이 1이 아니고, answer이 500이 아니면 진행. - // 두 가지 조건중 하나라도 맞지 않으면 while문 종료. - while (num != 1 && answer != 500) { - //짝수면, 2로 나눠주고 홀수면 3을 곱하고 1을 더해준다. - num % 2 == 0 ? (num = num / 2) : (num = num * 3 + 1); - answer++; - } - return num == 1 ? answer : -1; -} - -//정답 4 - prove-ability -function solution(num) { - let count = 0; - - // 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다. - while (num !== 1) { - // 입력된 수가 짝수라면 2로 나눕니다. - if (num % 2 === 0) num /= 2; - // 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. - else num = num * 3 + 1; - count++; - // 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요 - if (count > 500) return -1; - } - - return count; -} - -//정답 5 - yongchanson -function solution(num) { - let count = 0; - while (num !== 1) { - if (count++ === 500) return -1; - num = num % 2 ? num * 3 + 1 : num / 2; - } - return count; -} diff --git "a/level-1/\355\201\254\353\240\210\354\235\270-\354\235\270\355\230\225\353\275\221\352\270\260-\352\262\214\354\236\204&64061&.js" "b/level-1/\355\201\254\353\240\210\354\235\270-\354\235\270\355\230\225\353\275\221\352\270\260-\352\262\214\354\236\204&64061&.js" deleted file mode 100644 index efdcfcc..0000000 --- "a/level-1/\355\201\254\353\240\210\354\235\270-\354\235\270\355\230\225\353\275\221\352\270\260-\352\262\214\354\236\204&64061&.js" +++ /dev/null @@ -1,84 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(board, moves) { - let answer = 0; - const length = board.length - let basket = [] - moves.forEach(move => { - for (let i = 0; i < length; i++) { - const item = board[i][move - 1] - if (item !== 0) { - if (basket[basket.length - 1] !== item) { - basket.push(item) - } else { - basket.pop() - answer += 2 - } - board[i][move - 1] = 0 - break - } - } - }) - - return answer; -} - -//정답 2 - jaewon1676 -function solution(board, moves) { - var answer = 0; // 인형을 터뜨린 횟수 - let basket = []; // 바구니 - let crane = 0; // 크레인의 행의 위치 - for (let i = 0; i < moves.length; i++) { - crane = moves[i] - 1; // crane = 0 - for (let j = 0; j < board.length; j++) { - if (board[j][crane] == 0) - else if (board[j][crane] != 0) { - basket.push(board[j][crane]) - board[j][crane] = 0 - if (basket[basket.length - 1] == basket[basket.length - 2]) { - basket.pop(); - basket.pop(); - answer += 2; - } - break; - } - } - } - - return answer; -} - -/* 풀이 과정 -1. 입력받은 moves의 length만큼 for문을 돌린다. -2. 크레인에 찾고자 하는 행을 저장하여 제일 윗부분부터 탐색한다., 제일 윗부분이 비어있으면 다음 행으로 넘어가면서 탐색 한다. -3. 값이 들어있으면 해당 값을 바구니에 push 해주고, 비워준다. -4. 바구니 배열의 끝부분에 같은 인형 값이 연속되어있으면 연속 된 인형들을 pop 해주고, answer에 인형이 터진 횟수인 2를 더해준다. */ - -//정답 3 - chaerin-dev -function solution(board, moves) { - let n = board.length; - - // 격자의 세로줄이 하나의 배열이 되도록 2차원 배열 방향 변경 - board = board.flat(); - let rotatedBoard = Array.from({ length: n }, (i) => []); - for (let i = 0; i < board.length; i++) { - if (board[i]) rotatedBoard[i % n].push(board[i]); - } - - // moves 배열 순회하며 인형 꺼내서 stack에 집어넣기 - let stack = []; - let cnt = 0; - for (let move of moves) { - let doll = rotatedBoard[move - 1].shift(); - if (doll === undefined) continue; - if (stack[stack.length - 1] === doll) { - stack.pop(); - cnt += 2; - } else { - stack.push(doll); - } - } - - return cnt; -} \ No newline at end of file diff --git "a/level-1/\355\202\244\355\214\250\353\223\234-\353\210\204\353\245\264\352\270\260&67256&.js" "b/level-1/\355\202\244\355\214\250\353\223\234-\353\210\204\353\245\264\352\270\260&67256&.js" deleted file mode 100644 index 00dc63c..0000000 --- "a/level-1/\355\202\244\355\214\250\353\223\234-\353\210\204\353\245\264\352\270\260&67256&.js" +++ /dev/null @@ -1,139 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220830) - codeisneverodd -function solution(numbers, hand) { - let [l, r] = [10, 12]; - const moveL = n => { - l = n; - return 'L'; - }; - - const moveR = n => { - r = n; - return 'R'; - }; - return numbers - .map(n => { - if (n === 0) n = 11; - const to = n => { - const numLocation = numToLocation(n); - const lDistance = distanceBtwLocation(numToLocation(l), numLocation); - const rDistance = distanceBtwLocation(numToLocation(r), numLocation); - if (lDistance < rDistance) return moveL(n); - if (rDistance > lDistance) return moveR(n); - return hand === 'left' ? moveL(n) : moveR(n); - }; - return num % 3 === 1 ? leftTo(num) : num % 3 === 0 ? rightTo(num) : to(num); - }) - .join(''); -} - -function numToLocation(num) { - return [Math.floor((num - 1) / 3), (num - 1) % 3]; -} - -function distanceBtwLocation(a, b) { - return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]); -} - -//정답 2 - chaerin-dev -function solution(numbers, hand) { - // 키패드를 4행 3열의 이차원 배열이라고 생각 - - // leftRow, leftCol: 왼손의 현재 위치 - let [leftRow, leftCol] = [3, 0]; - // rightRow, rightCol: 오른손의 현재 위치 - let [rightRow, rightCol] = [3, 2]; - // 각 번호를 누른 엄지손가락이 어느 손인지 저장할 문자열 - let result = ''; - - // 눌러야할 각 번호가 - numbers.forEach(e => { - // 1/4/7이면 왼손으로 눌러야하므로 - if (e === 1 || e === 4 || e === 7) { - // 왼손의 위치 업데이트 - [leftRow, leftCol] = [Math.floor((e - 1) / 3), 0]; - // result 문자열에 "L" 이어붙여줌 - result += 'L'; - } - - // 3/6/9이면 오른손으로 눌러야하므로 - else if (e === 3 || e === 6 || e === 9) { - // 오른손의 위치 업데이트 - [rightRow, rightCol] = [Math.floor((e - 1) / 3), 2]; - // result 문자열에 "R" 이어붙여줌 - result += 'R'; - } - - // 2/5/8/0이면 - else { - // 번호 위치 계산의 편의를 위해 눌러야 할 번호가 0일 경우 11로 바꿔줌 - if (e === 0) e = 11; - - // leftRow, leftCol: 다음에 눌러야 할 번호의 위치 - let [nextRow, nextCol] = [Math.floor((e - 1) / 3), 1]; - // leftDistance: 현재 왼손의 위치와 다음에 눌러야 할 번호의 위치 사이의 거리 - let leftDistance = Math.abs(leftRow - nextRow) + Math.abs(leftCol - nextCol); - // rightDistance: 현재 오른손의 위치와 다음에 눌러야 할 번호의 위치 사이의 거리 - let rightDistance = Math.abs(rightRow - nextRow) + Math.abs(rightCol - nextCol); - - // 왼손이 다음에 눌러야 할 번호의 위치와 더 가깝거나, 두 손의 거리가 같으면서 왼손잡이라면 왼손으로 눌러야하므로 - if (leftDistance < rightDistance || (leftDistance == rightDistance && hand === 'left')) { - // 왼손의 위치 업데이트 - [leftRow, leftCol] = [nextRow, nextCol]; - // result 문자열에 "L" 이어붙여줌 - result += 'L'; - } - - // 오른손이 다음에 눌러야 할 번호의 위치와 더 가깝거나, 두 손의 거리가 같으면서 오른손잡이라며 오른손으로 눌러야하므로 - else { - // 오른손의 위치 업데이트 - [rightRow, rightCol] = [nextRow, nextCol]; - // reuslt 문자열에 "R" 이어붙여줌 - result += 'R'; - } - } - }); - - // result 문자열 반환 - return result; -} - -//정답 3(🎩 refactor 220425) - codeisneverodd -function solution(numbers, hand) { - let leftNum = 10; - let rightNum = 12; - return numbers - .map(num => { - if (num === 0) { - num = 11; - } - if (num % 3 === 1) { - return leftTo(num); - } else if (num % 3 === 0) { - return rightTo(num); - } else { - const numLocation = numToLocation(num); - const leftDistance = distanceBtwLocation(numToLocation(leftNum), numLocation); - const rightDistance = distanceBtwLocation(numToLocation(rightNum), numLocation); - if (leftDistance === rightDistance) { - return hand === 'left' ? leftTo(num) : rightTo(num); - } else if (leftDistance < rightDistance) { - return leftTo(num); - } else { - return rightTo(num); - } - } - }) - .join(''); - - function leftTo(num) { - leftNum = num; - return 'L'; - } - - function rightTo(num) { - rightNum = num; - return 'R'; - } -} diff --git "a/level-1/\355\217\211\352\267\240-\352\265\254\355\225\230\352\270\260&12944&.js" "b/level-1/\355\217\211\352\267\240-\352\265\254\355\225\230\352\270\260&12944&.js" deleted file mode 100644 index e613264..0000000 --- "a/level-1/\355\217\211\352\267\240-\352\265\254\355\225\230\352\270\260&12944&.js" +++ /dev/null @@ -1,32 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(arr) { - return arr.reduce((acc, curr) => acc + curr) / arr.length; -} - -//정답 2 - jaewon1676 -function solution(arr) { - var answer = 0; - for (var i = 0; i < arr.length; i++) { - answer += arr[i]; - } - return answer / arr.length; -} - -//정답 3 - chaerin-dev -function solution(arr) { - // arr의 모든 요소를 sum에 더힘 - let sum = arr.reduce((sum, e) => sum + e); - // sum을 arr의 요소의 갯수로 나눈 후 반환 - return sum / arr.length; -} - -// 정답 4 - prove-ability -function solution(arr) { - var answer = 0; - arr.forEach((num) => { - answer += num; - }); - return answer / arr.length; -} diff --git "a/level-1/\355\217\260\354\274\223\353\252\254&1845&.js" "b/level-1/\355\217\260\354\274\223\353\252\254&1845&.js" deleted file mode 100644 index c99d311..0000000 --- "a/level-1/\355\217\260\354\274\223\353\252\254&1845&.js" +++ /dev/null @@ -1,59 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(nums) { - const numLen = nums.length; - const setLen = [...new Set(nums)].length; - return numLen / 2 >= setLen ? setLen : numLen / 2; -} - -//정답 2 - jaewon1676 -function solution(nums) { - let max = nums.length / 2; // N / 2 - let set = [...new Set(nums)]; // 중복을 없앤다. - return set.length > max ? max : set.length; -} - -/* 풀이 과정 -1. 많은 종류의 폰켓몬을 포함해서 N/2마리 선택해야한다. -2. 같은 숫자는 같은 종류이므로 set을 활용해 중복을 없애고 진행한다. -3. 최대로 고를 수 있는 폰켓몬 수는 N / 2마리가 set의 길이보다 크냐 작냐에 따라 - 두가지 경우의 수로 좁혀진다. */ - -// 정답 3 - prove-ability -function solution(nums) { - var answer = 0; - // set 을 사용해 중복 제거 - const set = new Set(); - nums.forEach((num) => { - set.add(num); - }); - // set 의 사이즈가 N/2 보다 크다면 N/2 반환 - // 그렇지 않다면 set size 반환 - if (set.size > nums.length / 2) answer = nums.length / 2; - else answer = set.size; - - return answer; -} - -// 정답 4 - yongchanson -function solution(nums) { - const unique = nums.filter((element, index) => { - return nums.indexOf(element) === index; - }); - - return unique.length > nums.length / 2 ? nums.length / 2 : unique.length; -} - -//정답 5 - chaerin-dev -function solution(nums) { - // 가질 수 있는 폰켓몬의 수 - const getCnt = nums.length / 2; - // 폰켓몬 종류의 수 - const setSize = new Set(nums).size; - // 내가 가질 수 있는 폰켓몬의 수보다 폰켓몬 종류의 수가 더 많으면 - // -> 모두 다른 종류의 폰켓몬을 하나씩 가질 수 있음 - // 내가 가질 수 있는 폰켓몬의 수보다 폰켓몬 종류의 수가 더 적으면 - // -> 최대한 다양한 종류의 폰켓몬을 가지려고 해도 원래 있던 폰켓몬 종류의 수가 최대로 가질 수 있는 폰켓몬 종류의 수 - return setSize > getCnt ? getCnt : setSize; -} diff --git "a/level-1/\355\225\230\354\203\244\353\223\234-\354\210\230&12947&.js" "b/level-1/\355\225\230\354\203\244\353\223\234-\354\210\230&12947&.js" deleted file mode 100644 index d1b0ad8..0000000 --- "a/level-1/\355\225\230\354\203\244\353\223\234-\354\210\230&12947&.js" +++ /dev/null @@ -1,50 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(x) { - const sum = x - .toString() - .split("") - .map((x) => parseInt(x)) - .reduce((acc, curr) => acc + curr); - return x % sum === 0; -} - -//정답 2 - chaerin-dev -function solution(x) { - // x의 각 자리에 접근하기 위해 x를 문자열로 변환 - let x_str = x.toString(); - // 각 자릿수의 합을 저장할 변수 - let sum_of_digits = 0; - // x_str의 각 문자를 숫자로 바꿔 sum_of_digits에 더해줌 - for (let i = 0; i < x_str.length; i++) { - sum_of_digits += Number(x_str[i]); - } - // x가 각 자릿수의 합으로 나누어떨어지는지 여부 반환 - return x % sum_of_digits == 0; -} - -//정답 3 - jaewon1676 -function solution(x) { - let sum = 0; - let arr = String(x).split(""); // 숫자를 하나씩 분리한다. - - for (var i = 0; i < arr.length; i++) { - sum += Number(arr[i]); // 각 숫자를 더해준다. - } - - return x % sum == 0 ? true : false; // 자릿수의 합으로 x가 나누어지면 하샤드 수 -} - -//정답 4 - prove-ability -function solution(x) { - var answer = true; - // 모든 자릿수의 합을 구한다 - const sum = x - .toString() - .split("") - .reduce((acc, cur) => acc + parseInt(cur, 10), 0); - // x가 자릿수의 합으로 나누어떨어지지 않는다면 false 반환 - if (x % sum !== 0) return false; - return answer; -} diff --git "a/level-1/\355\225\270\353\223\234\355\217\260-\353\262\210\355\230\270-\352\260\200\353\246\254\352\270\260&12948&.js" "b/level-1/\355\225\270\353\223\234\355\217\260-\353\262\210\355\230\270-\352\260\200\353\246\254\352\270\260&12948&.js" deleted file mode 100644 index 0d5e21a..0000000 --- "a/level-1/\355\225\270\353\223\234\355\217\260-\353\262\210\355\230\270-\352\260\200\353\246\254\352\270\260&12948&.js" +++ /dev/null @@ -1,22 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(phone_number) { - return "*".repeat(phone_number.length - 4) + phone_number.slice(-4); -} - -//정답 2 - chaerin-dev -function solution(phone_number) { - // "*"을 phone_number의 길이에서 4만큼 뺀 횟수만큼 반복한 문자열과 - // phone_number의 -4인덱스부터 끝까지 추출한 문자열을 - // 이어붙인 후 반환 - return "*".repeat(phone_number.length - 4) + phone_number.slice(-4); -} - -// 정답 3 - prove-ability -function solution(phone_number) { - var answer = ""; - answer += "*".repeat(phone_number.length - 4); - answer += phone_number.slice(phone_number.length - 4, phone_number.length); - return answer; -} diff --git "a/level-1/\355\226\211\353\240\254\354\235\230-\353\215\247\354\205\210&12950&.js" "b/level-1/\355\226\211\353\240\254\354\235\230-\353\215\247\354\205\210&12950&.js" deleted file mode 100644 index 92ce3ff..0000000 --- "a/level-1/\355\226\211\353\240\254\354\235\230-\353\215\247\354\205\210&12950&.js" +++ /dev/null @@ -1,50 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(arr1, arr2) { - const answer = []; - arr1.forEach((row, rowIndex) => { - answer.push(row.map((col, colIndex) => col + arr2[rowIndex][colIndex])); - }); - return answer; -} - -//정답 2 - codeisneverodd -function solution(arr1, arr2) { - var answer = new Array(arr1.length); - for (let i = 0; i < arr1.length; i++) { - answer[i] = new Array(arr1[0].length); - } - for (let row = 0; row < answer.length; row++) { - for (let col = 0; col < answer[0].length; col++) { - answer[row][col] = arr1[row][col] + arr2[row][col]; - } - } - return answer; -} - -//정답 3 - chaerin-dev -function solution(arr1, arr2) { - var answer = []; - for (let i = 0; i < arr1.length; i++) { - let ans_row = []; - for (let j = 0; j < arr1[0].length; j++) { - ans_row.push(arr1[i][j] + arr2[i][j]); - } - answer.push(ans_row); - } - return answer; -} - -//정답 4 - yongchanson -function solution(A, B) { - let answer = []; - - for (let i = 0; i < A.length; i++) { - answer[i] = []; - for (let j = 0; j < A[0].length; j++) { - answer[i][j] = A[i][j] + B[i][j]; - } - } - return answer; -} diff --git "a/level-2/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" "b/level-2/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" deleted file mode 100644 index 86a6c59..0000000 --- "a/level-2/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - 본인의 깃허브 아이디 -function solution(n) { - //프로그래머스에 제출하여 통과된 함수를 복사 붙여넣기 해주세요! -} - -//정답 2 - 본인의 깃허브 아이디 -function solution(n) { - //정답을 다른 방법으로도 작성했다면 추가해 주세요! -} diff --git "a/level-2/124-\353\202\230\353\235\274\354\235\230-\354\210\253\354\236\220&12899&.js" "b/level-2/124-\353\202\230\353\235\274\354\235\230-\354\210\253\354\236\220&12899&.js" deleted file mode 100644 index 5bf2450..0000000 --- "a/level-2/124-\353\202\230\353\235\274\354\235\230-\354\210\253\354\236\220&12899&.js" +++ /dev/null @@ -1,62 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - var answer = ''; - const oneTwoFour = ['4', '1', '2'] - while (n > 0) { - const remainder = n % 3 - answer = oneTwoFour[remainder] + answer; - n = Math.floor((n - 1) / 3) //나누어떨어지지 않을 때에도 -1해도 상관없음 - } - return answer; -} - -//정답 2 - codeisneverodd -function solution(n) { - var answer = ''; - const oneTwoFour = ['4', '1', '2'] - while (n > 0) { - const remainder = n % 3 - answer = oneTwoFour[remainder] + answer; - if (remainder === 0) { - n = Math.floor((n - 1) / 3) - } else { - n = Math.floor(n / 3) - } - } - return answer; -} - -//정답 3 - jaewon1676 -function solution(n) { - const number = [ 4, 1, 2]; - let answer = ""; - - while(n){ // - answer = number[n%3] + answer; - n = (n%3 == 0)? n/3 - 1 : Math.floor(n/3); - } - - return answer -} - -//정답 4- RyanDeclan -// 3진법 풀이를 바탕으로 풀음 0,1,2 대신 1,2,3을 활용 -// 1,2,4 나라지만 임시적으로 1,2,3 나라를 운영하고 마지막에 replace로 3을 전부 4로 바꾸는 코드 -let result = ""; -function solution(n) { - let remainder = n % 3; - let quotient = Math.floor(n / 3) - if(!remainder){ - quotient = Math.floor(n / 3) - 1; - remainder = 3 - } - result += remainder; - if( quotient <= 3){ - if(quotient)result += quotient - result = result.replace(/["3"]/g,"4") - return result.split("").reverse().join("") - } - return solution(quotient); -} diff --git "a/level-2/2-x-n-\355\203\200\354\235\274\353\247\201&12900&.js" "b/level-2/2-x-n-\355\203\200\354\235\274\353\247\201&12900&.js" deleted file mode 100644 index aeacf60..0000000 --- "a/level-2/2-x-n-\355\203\200\354\235\274\353\247\201&12900&.js" +++ /dev/null @@ -1,16 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - jaewon1676 -function solution(n) { - let dp = [0, 1, 2] // n이 1, 2일때는 바로 답을 출력, - if (n>2){ // n이 3 이상이면 필요한 만큼의 수 까지만 수를 만들어준다. - for (let i=3; i<=n; i++){ - dp.push((dp[i-1] + dp[i-2]) % 1000000007); - } - } - return dp[n] -} -/* -n이 1일땐 1, 2일땐 2, 3일땐 3, 4일땐 5 . . 의 식이 보인다. -n = (n - 1) + (n - 2)의 식으로 구할 수 있고, -제한 사항을 주의해서 풀어보자. */ \ No newline at end of file diff --git "a/level-2/2\352\260\234-\354\235\264\355\225\230\353\241\234-\353\213\244\353\245\270-\353\271\204\355\212\270&77885&.js" "b/level-2/2\352\260\234-\354\235\264\355\225\230\353\241\234-\353\213\244\353\245\270-\353\271\204\355\212\270&77885&.js" deleted file mode 100644 index 425f875..0000000 --- "a/level-2/2\352\260\234-\354\235\264\355\225\230\353\241\234-\353\213\244\353\245\270-\353\271\204\355\212\270&77885&.js" +++ /dev/null @@ -1,17 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - le2sky -function solution(numbers) { - const answer = []; - numbers.forEach((num) => { - if (num % 2 == 0) answer.push(num + 1); - else { - let binary = ["0", ...num.toString(2)]; - let last = binary.lastIndexOf("0"); - binary[last] = "1"; - binary[last + 1] = "0"; - answer.push(parseInt(binary.join(""), 2)); - } - }); - return answer; -} diff --git "a/level-2/3-x-n-\355\203\200\354\235\274\353\247\201&12902&.js" "b/level-2/3-x-n-\355\203\200\354\235\274\353\247\201&12902&.js" deleted file mode 100644 index 9d2fe52..0000000 --- "a/level-2/3-x-n-\355\203\200\354\235\274\353\247\201&12902&.js" +++ /dev/null @@ -1,18 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(n) { - if (n % 2 !== 0) return 0; - - const getCount = n => { - const k = n / 2; - const count = [3, 11, ...Array(k - 2)]; - const divider = 1000000007; - for (let i = 2; i < k; i++) { - count[i] = (4 * count[i - 1] - count[i - 2] + divider) % divider; - } - return count[count.length - 1]; - }; - - return getCount(n); -} diff --git a/level-2/H-Index&42747&.js b/level-2/H-Index&42747&.js deleted file mode 100644 index 1af72bc..0000000 --- a/level-2/H-Index&42747&.js +++ /dev/null @@ -1,37 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(citations) { - var answer = 0; - citations.sort((a, b) => b - a) - let h = 0 - while (h + 1 <= citations[h]) h++ - answer = h - return answer; -} - -//정답 2 - codeisneverodd -function solution(citations) { - var answer = 0; - let h = 0 - let length = 0 - while (length >= h) { - h++ - length = citations.filter(citation => citation >= h).length - } - answer = h - 1 - return answer; -} - -//정답 3 - jaewon1676 -function solution(citations) { - var answer = 0; - citations.sort((a,b)=>(b-a)) - - for(var i=0; i word.charAt(0).toUpperCase() + word.substring(1).toLowerCase()).join(' ') - //word[0]은 빈 문자열을 만나면 undefined를, word.charAt(0)은 빈 문자열을 만나면 빈 문자열을 반환한다. - return answer; -} - -//정답 2 - jaewon1676 -function solution(s) { - s = s.split(' ').map(el => el.split('').map((el, index) => - index == 0 ? el.toUpperCase() : el.toLowerCase()).join('')).join(' ') - return s; -} -// 문자열을 연습하기에 좋은 문제입니다. - -// s.split(' ') // 띄어쓰기를 기준으로 나눕니다. -// .map(el => el.split('')) 나눈 덩어리를 다시 요소 하나 하나씩 나눠줍니다 -// .map((el, index) => index == 0 ? el.toUpperCase() : el.toLowerCase()) -// 덩어리의 요소가 첫번째이면 대문자, 그렇지 않으면 소문자로 변환 해줍니다. -// .join('') 작은 배열들을 합쳐줍니다. -// .join(' ') 큰 배열들을 합쳐줍니다. - -//정답 3 - yongchanson -function solution(s) { - let answer = []; - s = s.split(" "); - - for (let i = 0; i < s.length; i++) { - answer.push( - s[i].substring(0, 1).toUpperCase() + s[i].substring(1).toLowerCase() - ); - } - return answer.join(" "); -} - -//정답 4 - RyanDeclan - -function solution(s) { - return s.toLowerCase().split(" ").map(x=>x[0] ? x[0].toUpperCase() + x.substring(1) : "").join(" "); -} - -// 이 문제에서 제일 핵심은 "공백문자가 연속해서 나올 수 있습니다." 입니다. 이 부분을 꼭 고려하셔야합니다. -// 왜냐하면 공백이 연속으로 있으면 split할때 공백이 포함되기에 그 공백이 마침 x[0]이 되어버리면 undefined.toUpperCase()가 되기에 런타임에러가 뜹니다. -// 따라서 저는 풀때 당시 몰랐지만 chartAt()을 사용하는 것도 좋은 방법중 하나라고 생각합니다. -//그게 아니라 이 코드로 한다면 꼭 undefined인 경우를 처리하는 코드를 추가해줘야합니다. diff --git a/level-2/N-Queen&12952&.js b/level-2/N-Queen&12952&.js deleted file mode 100644 index 8d36ad5..0000000 --- a/level-2/N-Queen&12952&.js +++ /dev/null @@ -1,39 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - /* - 1. 0번째 행에 0번째 queen을 놓는다. - 2. 그 다음 행의 퀸은 이전 퀸들의 범위와 겹치지 않는 곳에 놓는다. 퀸은 한 행에 반드시 하나 두어야한다. - 3. 마지막 열까지 도달하면 성공으로 간주하고 answer에 1을 더한다. - 4. 0번째 queen의 위치를 바꿔가며 모두 시도한다. - 4. 단, 체스판은 일차원 배열로 선언하고 index = 행, 값 = 열 로 생각한다. - */ - let answer = 0; - const canBePlacedOn = (chess, currentRow) => { - //해당 행에 둔 queen이 유효한지 - for (let prevRow = 0; prevRow < currentRow; prevRow++) { - const onDiagonal = currentRow - prevRow === Math.abs(chess[currentRow] - chess[prevRow]) - const onStraight = chess[prevRow] === chess[currentRow] - if (onDiagonal || onStraight) return false - } - return true - } - const placeQueen = (chess, currentRow) => { - //queen을 배치하다가 끝 행에 도착하면 1을 리턴, 도착하지 못하면 0을 리턴하여, 재귀적으로 모든 경우를 합하여 리턴 - let count = 0 - if (currentRow === chess.length) return 1 - for (let currentQueen = 0; currentQueen < n; currentQueen++) { - //queen을 우선 배치한 후 가능한지 살펴본다. - chess[currentRow] = currentQueen - if (canBePlacedOn(chess, currentRow)) count += placeQueen(chess, currentRow + 1) - } - return count - } - for (let firstQueen = 0; firstQueen < n; firstQueen++) { - const chess = new Array(n).fill(-1) - chess[0] = firstQueen - answer += placeQueen(chess, 1) - } - return answer; -} \ No newline at end of file diff --git "a/level-2/N\352\260\234\354\235\230-\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230&12953&.js" "b/level-2/N\352\260\234\354\235\230-\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230&12953&.js" deleted file mode 100644 index 239fc80..0000000 --- "a/level-2/N\352\260\234\354\235\230-\354\265\234\354\206\214\352\263\265\353\260\260\354\210\230&12953&.js" +++ /dev/null @@ -1,21 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(arr) { - var answer = 0; - answer = arr.reduce((a, b) => leastCommonMultiple(a, b), 1) - return answer; -} - -function leastCommonMultiple(a, b) { - return a * b / greatestCommonDivisor(a, b) -} - -function greatestCommonDivisor(a, b) { - while (b > 0) { - let r = a % b; - a = b; - b = r; - } - return a; -} \ No newline at end of file diff --git "a/level-2/[1\354\260\250]-\353\211\264\354\212\244-\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201&17677&.js" "b/level-2/[1\354\260\250]-\353\211\264\354\212\244-\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201&17677&.js" deleted file mode 100644 index 3636716..0000000 --- "a/level-2/[1\354\260\250]-\353\211\264\354\212\244-\355\201\264\353\237\254\354\212\244\355\204\260\353\247\201&17677&.js" +++ /dev/null @@ -1,78 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(str1, str2) { - var answer = 0; - let compare1 = verifiedSlices(str1), compare2 = verifiedSlices(str2) - const union = new Set([...compare1, ...compare2]) - let multiIntersectionLen = 0, multiUnionLen = 0 - for (const slice of union) { - const compare1Count = compare1.filter(x => x === slice).length, - compare2Count = compare2.filter(x => x === slice).length - multiIntersectionLen += Math.min(compare1Count, compare2Count) - multiUnionLen += Math.max(compare1Count, compare2Count) - } - answer = multiUnionLen === 0 ? 65536 : Math.floor(multiIntersectionLen / multiUnionLen * 65536) - return answer; -} - -function verifiedSlices(str) { - const onlyAlphabet = /[a-zA-Z]{2}/ - let result = [] - for (let i = 0; i < str.length - 1; i++) { - const slice = str.slice(i, i + 2) - if (onlyAlphabet.test(slice)) result.push(slice.toLowerCase()) - } - return result -} - -//정답 2 - jaewon1676 -function solution(str1, str2) { - - str1 = str1.toUpperCase(); // 대소문자를 구분하지 않으니 대문자로 맞춰줌. - str2 = str2.toUpperCase(); - let arr1 = new Array() // 빈 객체를 만들어줌. - let arr2 = new Array() - - for (var i = 0; i < str1.length - 1; i++) { - let tmp = str1.substr(i, 2) // i부터 2개 ( i, i+1 ) - if (tmp.search(/[^A-Z]/g) >= 0) { - // ^(not), A-Z(A ~ Z 의 범위), g(global 모두) - // tmp 변수에 담은 문자열이 영문자가 아니면 -1을 반환. - continue - } - arr1.push(tmp) - } - - for (var i = 0; i < str2.length - 1; i++) { - let tmp = str2.substr(i, 2) - if (tmp.search(/[^A-Z]/g) >= 0) { - continue - } - arr2.push(tmp) - } - arr1.sort() - arr2.sort() - var a = [] // 중복포함, 교집합 배열 - var b = [] // 중복포함, 합집합 배열 - - for (var i = 0; i < arr2.length; i++) { - if (arr1.indexOf(arr2[i]) >= 0) { - // arr1 객체에 arr2[i]과 같은 값이 있는지 확인. - // 없으면 -1을 반환하기때문에 조건이 성립되지 않는다. - a.push(arr1.splice(arr1.indexOf(arr2[i]), 1)) - } - // 교집합이 성립되지 않으면 실행. - b.push(arr2[i]) - } - - for (var i = 0; i < arr1.length; i++) { - b.push(arr1[i]) - } - - // 분모가 0이 될경우, 분자가 0이될 경우 따로 분리해줘야함 - if (b.length === 0) return 65536 - if (a.length === 0) return 0 - - return Math.floor((a.length / b.length) * 65536) -} diff --git "a/level-2/[1\354\260\250]-\354\272\220\354\213\234&17680&.js" "b/level-2/[1\354\260\250]-\354\272\220\354\213\234&17680&.js" deleted file mode 100644 index ece168f..0000000 --- "a/level-2/[1\354\260\250]-\354\272\220\354\213\234&17680&.js" +++ /dev/null @@ -1,58 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(cacheSize, cities) { - var answer = 0; - let cache = [] - if (cacheSize === 0) return 5 * cities.length - for (const city of cities) { - const cityLC = city.toLowerCase() - if (cache.includes(cityLC)) { - cache.splice(cache.indexOf(cityLC), 1) - cache.unshift(cityLC) - answer += 1 - } else { - if (cache.length >= cacheSize) cache.pop() - cache.unshift(cityLC) - answer += 5 - } - } - return answer; -} - -//정답 2 - jaewon1676 -function solution(cacheSize, cities) { - var answer = 0; - let cache = []; - - //캐시 크기가 0인 경우는 따로 처리 - if (cacheSize === 0) return cities.length * 5; - - while (cities.length != 0) { - // 맨 앞의 배열의 요소 히나를 소문자로 변환해서 city에 넣는다. - const city = cities.shift().toLowerCase(); - // cities의 요소 city가 캐시 안에 있는지 비교한다. (hit or miss) - if (cache.includes(city)) { - // 캐시 안에 있으면 그 위치에 있는 캐시를 빼주고, - cache.splice(cache.indexOf(city), 1); - // 맨 뒤로 push 해준다. - cache.push(city); - // cache hit - answer += 1; - } else { // 캐시 크기가 꽉 차있으면 캐시 맨 앞에 요소를 하나 빼준다. - if (cache.length === cacheSize) { - cache.shift(); - } - // 새로운 캐시 맨 뒤로 push - cache.push(city); - // cache miss - answer += 5; - } - } - return answer; - } - /* LRU 알고리즘 - n이 배열 안에 있으면 배열 안의 n을 빼주고, 새 n을 배열의 맨 뒤로 push 한다. - n이 배열 안에 없으면 n을 배열의 맨 뒤로 push 한다. 이때 배열의 크기 여유가 없으면 - 배열에서 가장 오래된 요소를 하나 뺴준다. (arr.shift()) */ - \ No newline at end of file diff --git "a/level-2/[1\354\260\250]-\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235&17679&.js" "b/level-2/[1\354\260\250]-\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235&17679&.js" deleted file mode 100644 index 41b4753..0000000 --- "a/level-2/[1\354\260\250]-\355\224\204\353\240\214\354\246\2104\353\270\224\353\241\235&17679&.js" +++ /dev/null @@ -1,47 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(m, n, board) { - board = board.map(r => r.split('')); - const getSquare = ([r, c]) => [ - [r, c], - [r, c + 1], - [r + 1, c], - [r + 1, c + 1], - ]; - - const isSquare = ([r, c]) => { - if (board[r][c] === '@') return false; - return [...new Set(getSquare([r, c]).map(([r, c]) => board[r][c]))].length === 1; - }; - - const remove = () => { - const removeArr = []; - for (let r = 0; r < m - 1; r++) { - for (let c = 0; c < n - 1; c++) { - if (isSquare([r, c])) getSquare([r, c]).forEach(v => removeArr.push(v)); - } - } - removeArr.forEach(([r, c]) => { - board[r][c] = '@'; - }); - return removeArr.length !== 0; - }; - - const pull = () => { - for (let c = 0; c < n; c++) { - const remainColumn = Array.from({ length: m }, (_, r) => board[r][c]).filter(v => v !== '@'); - const resultColumn = [...Array(m - remainColumn.length).fill('@'), ...remainColumn]; - resultColumn.forEach((v, r) => { - board[r][c] = v; - }); - } - return board; - }; - - while (remove()) { - pull(); - } - - return board.flat().filter(v => v === '@').length; -} diff --git "a/level-2/[3\354\260\250]-n\354\247\204\354\210\230-\352\262\214\354\236\204&17687&.js" "b/level-2/[3\354\260\250]-n\354\247\204\354\210\230-\352\262\214\354\236\204&17687&.js" deleted file mode 100644 index 9bea2b8..0000000 --- "a/level-2/[3\354\260\250]-n\354\247\204\354\210\230-\352\262\214\354\236\204&17687&.js" +++ /dev/null @@ -1,16 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n, t, m, p) { - let queue = [], result = [], currentNumDecimal = -1, turn = 0 - while (result.length < t) { - if (queue.length === 0) { - currentNumDecimal++ - currentNumDecimal.toString(n).split('').forEach(x => queue.push(x)) - } - const currentChar = queue.shift() - if (turn % m === p - 1) result.push(currentChar) - turn++ - } - return result.join('').toUpperCase() -} \ No newline at end of file diff --git "a/level-2/[3\354\260\250]-\353\260\251\352\270\210\352\267\270\352\263\241&17683&.js" "b/level-2/[3\354\260\250]-\353\260\251\352\270\210\352\267\270\352\263\241&17683&.js" deleted file mode 100644 index 20404da..0000000 --- "a/level-2/[3\354\260\250]-\353\260\251\352\270\210\352\267\270\352\263\241&17683&.js" +++ /dev/null @@ -1,42 +0,0 @@ -// https://github.com/codeisneverodd/programmers-coding-test -// 완벽한 정답이 아닙니다. -// 정답 1 - minjongbaek -function convertString(m) { // 문자열 m에 #이 붙은 음이 있다면 #을 제거하고 소문자로 변경한 후 반환하는 함수 - return m - .replace(/C#/g, 'c') - .replace(/D#/g, 'd') - .replace(/F#/g, 'f') - .replace(/G#/g, 'g') - .replace(/A#/g, 'a'); -} - -function solution(m, musicinfos) { - - // 네오가 기억하고 있는 멜로디가 라디오에서 재생됐는지 확인해야합니다. - // 재생시간이 길면 악보의 멜로디가 반복되어 재생되고, 짧다면 중간에 끊어지게 됩니다. - // #이 붙은 음은 2자리를 차지하기 때문에 #이 붙은 음을 어떻게 처리할지가 중요합니다. - - const listenSound = convertString(m); // #이 붙은 음을 다른 문자로 변환합니다. - - const map = new Map(); // 조건에 일치하는 음악 정보를 저장할 map 변수를 선언합니다. - for (const info of musicinfos) { - const [start, finish, title, _score] = info.split(','); - // 음악 재생이 끝난 시각과 재생된 시각의 차를 구하여 재생시간을 구합니다. - const duration = ((Number(finish.slice(0, 2)) * 60) + (Number(finish.slice(3, 5)))) - ((Number(start.slice(0, 2)) * 60) + (Number(start.slice(3, 5)))); - - const score = convertString(_score); // 악보의 멜로디에서 #이 붙은 음을 다른 문자로 변환합니다. - - // 재생된 멜로디를 구합니다. - // 각 음이 1분에 1개씩 재생되므로, repeat() 메서드를 사용하여 재생시간을 악보의 길이로 나눈 몫 만큼 반복합니다. - // slice() 메서드로 재생시간을 넘어가는 멜로디는 제외합니다. - const playScore = score.repeat(Math.ceil(duration / score.length)).slice(0, duration); - if (playScore.includes(listenSound)) { // 들은 멜로디가 재생된 멜로디에 포함되어 있다면 map에 저장한다. - map.set(title, {score, playScore}); - } - } - - // 조건에 일치하는 음악이 여러개인 경우 재생된 시간이 제일 길고 먼저 입력된 음악 제목을 반환합니다. - // map 객체는 삽입에 대한 순서를 기억하므로 재생된 시간이 제일 긴 음악부터 내림차순으로 정렬합니다. - const filter = [...map.keys()].sort((a,b) => map.get(b).playScore.length - map.get(a).playScore.length); - return filter.length >= 1 ? filter[0] : '(None)'; // 결과가 없다면 '(None)'을 반환하고, 그렇지 않다면 첫 번째 요소를 반환합니다. -} \ No newline at end of file diff --git "a/level-2/[3\354\260\250]-\354\225\225\354\266\225&17684&.js" "b/level-2/[3\354\260\250]-\354\225\225\354\266\225&17684&.js" deleted file mode 100644 index 75ad8eb..0000000 --- "a/level-2/[3\354\260\250]-\354\225\225\354\266\225&17684&.js" +++ /dev/null @@ -1,55 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(msg) { - const outputs = []; - const dict = ['@', ...Array.from(Array(26), (_, i) => String.fromCharCode(65 + i))]; - let [start, end] = [0, 1]; - - const doesDictHave = (start, end) => dict.includes(msg.substring(start, end)); - - const getInput = (start, end) => { - if (end + 1 > msg.length || !doesDictHave(start, end + 1)) return [start, end]; - return getInput(start, end + 1); - }; - - const addToDict = (start, end) => { - if (doesDictHave(start, end)) return; - dict.push(msg.substring(start, end)); - }; - - const addToOutputs = (start, end) => { - if (!doesDictHave(start, end)) return; - outputs.push(dict.indexOf(msg.substring(start, end))); - }; - - while (start < msg.length) { - [start, end] = getInput(start, end); - addToDict(start, end + 1); - addToOutputs(start, end); - start = end; - } - return outputs; -} - -// 정답 2 - ssi02014 -function solution(msg) { - const result = []; - const dict = Array.from({length: 26},(_, i) => String.fromCharCode(65 + i)) - - // 시간 복잡도 O(N^2) - const lastWordAndCompression = msg.split("").reduce((acc, cur) => { - const nextWord = acc + cur; - const nextWordIdx = dict.indexOf(nextWord); - const prevWordIdx = dict.indexOf(acc); - - if (nextWordIdx !== -1) return acc + cur; - dict.push(nextWord); - - if (prevWordIdx !== -1) result.push(prevWordIdx + 1); - return cur; - }, ""); - - result.push(dict.indexOf(lastWordAndCompression) + 1); - return result; -} diff --git "a/level-2/[3\354\260\250]-\355\214\214\354\235\274\353\252\205-\354\240\225\353\240\254&17686&.js" "b/level-2/[3\354\260\250]-\355\214\214\354\235\274\353\252\205-\354\240\225\353\240\254&17686&.js" deleted file mode 100644 index a645429..0000000 --- "a/level-2/[3\354\260\250]-\355\214\214\354\235\274\353\252\205-\354\240\225\353\240\254&17686&.js" +++ /dev/null @@ -1,14 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(files) { - var answer = []; - const numberRegex = /[0-9]+/ - answer = files.sort((a, b) => { - const [matchA, matchB] = [a.match(numberRegex), b.match(numberRegex)] - const [headA, headB] = [a.slice(0, matchA.index).toLowerCase(), b.slice(0, matchB.index).toLowerCase()] - const [numberA, numberB] = [parseInt(matchA[0]), parseInt(matchB[0])] - return headA < headB ? -1 : headA > headB ? 1 : numberA < numberB ? -1 : numberA > numberB ? 1 : 0 - }) - return answer; -} \ No newline at end of file diff --git "a/level-2/k\354\247\204\354\210\230\354\227\220\354\204\234-\354\206\214\354\210\230-\352\260\234\354\210\230-\352\265\254\355\225\230\352\270\260&92335&.js" "b/level-2/k\354\247\204\354\210\230\354\227\220\354\204\234-\354\206\214\354\210\230-\352\260\234\354\210\230-\352\265\254\355\225\230\352\270\260&92335&.js" deleted file mode 100644 index 5425443..0000000 --- "a/level-2/k\354\247\204\354\210\230\354\227\220\354\204\234-\354\206\214\354\210\230-\352\260\234\354\210\230-\352\265\254\355\225\230\352\270\260&92335&.js" +++ /dev/null @@ -1,23 +0,0 @@ -// https://github.com/codeisneverodd/programmers-coding-test -// 완벽한 정답이 아닙니다. -// 정답 1 - minjongbaek -function isPrime(number) { // 소수를 판별하는 함수 - if (number < 2) return false; - for (let i = 2; i * i <= number; i += 1) { - if (number % i === 0) { - return false; - } - } - return true; -} - -function solution(n, k) { - // 문제를 얼핏 보면 4가지의 경우를 모두 생각해야할 것 같지만, - // 결국은 앞이나 뒤에 0이 하나라도 있거나 아예 없는 경우에 소수인지 확인하면 됩니다. - // 따라서 k진수로 변환 후 0을 기준으로 나누고 각 요소가 소수인지 판별하면 됩니다. - - // (n).toString(k) // n을 k진수로 변환합니다. - // .split('0') // 0을 기준으로 나눕니다. - // .filter((number) => isPrime(+number)).length // 소수가 아닌 요소를 걸러낸 후에 개수를 셉니다. - return (n).toString(k).split('0').filter((number) => isPrime(+number)).length; -} \ No newline at end of file diff --git "a/level-2/n^2-\353\260\260\354\227\264-\354\236\220\353\245\264\352\270\260&87390&.js" "b/level-2/n^2-\353\260\260\354\227\264-\354\236\220\353\245\264\352\270\260&87390&.js" deleted file mode 100644 index 1fff1ad..0000000 --- "a/level-2/n^2-\353\260\260\354\227\264-\354\236\220\353\245\264\352\270\260&87390&.js" +++ /dev/null @@ -1,13 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - jaewon1676 -function solution (n, left, right) { - const answer = []; - - for (let i=left; i <= right; i++) { // left부터 right까지를 구한다. - let row = parseInt(i/n); // 행(row)을 구한다. - let column = i%n; // 열(column)을 구한다. - answer.push(Math.max(row, column) + 1) // 행과 열중 큰 값을 푸시한다. - } - return answer -} \ No newline at end of file diff --git "a/level-2/\352\260\200\354\236\245-\355\201\260-\354\210\230&42746&.js" "b/level-2/\352\260\200\354\236\245-\355\201\260-\354\210\230&42746&.js" deleted file mode 100644 index d6b7ce3..0000000 --- "a/level-2/\352\260\200\354\236\245-\355\201\260-\354\210\230&42746&.js" +++ /dev/null @@ -1,53 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers) { - var answer = ''; - numbers.sort(sortFunc) - answer = numbers.join('') - if (answer[0] === '0') return '0' - return answer; -} - -const sortFunc = (a, b) => { - const compareA = parseInt(a.toString() + b.toString()) - const compareB = parseInt(b.toString() + a.toString()) - return compareB - compareA -} - - -// 정답 2 - createhb21 -function solution(numbers) { - let stringNum = - numbers.map((el) => el + '').sort((a,b) => (b+a) - (a+b)); - - return stringNum[0] === '0' ? '0' : stringNum.join(''); -} - -// 정답 3 - prove-ability -function solution(numbers) { - if(numbers.every(v => v === 0)) return "0"; - return numbers.sort((a, b) => { - if(a === b) return 0; - let stringA = a.toString(10), stringB = b.toString(10); - if(stringA[0] === stringB[0]) { - let aIndex = 1, bIndex = 1; - while(true) { - if(!stringA[aIndex]) --aIndex; - if(!stringB[bIndex]) --bIndex; - if(stringA[aIndex] === stringB[bIndex]) { - aIndex++, bIndex++; - continue; - } - if(stringA[aIndex] < stringB[bIndex]) return 1; - else return -1; - } - } - return stringB[0] - stringA[0] - }).join(""); -} - -// 정답 4 - prove-ability -function solution(numbers) { - return numbers.every(v => v === 0) ? "0" : numbers.map(v => v.toString(10)).sort((a,b) => (b+a) - (a+b)).join(""); -} diff --git "a/level-2/\352\260\200\354\236\245-\355\201\260-\354\240\225\354\202\254\352\260\201\355\230\225-\354\260\276\352\270\260&12905&.js" "b/level-2/\352\260\200\354\236\245-\355\201\260-\354\240\225\354\202\254\352\260\201\355\230\225-\354\260\276\352\270\260&12905&.js" deleted file mode 100644 index e63b228..0000000 --- "a/level-2/\352\260\200\354\236\245-\355\201\260-\354\240\225\354\202\254\352\260\201\355\230\225-\354\260\276\352\270\260&12905&.js" +++ /dev/null @@ -1,12 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(board) { - for (let row = 0; row < board.length; row++) {//해당 칸이 0이 아니고 위, 왼쪽 대각선, 왼쪽이 정사각형이면, 정사각형 연장가능 - for (let col = 0; col < board[0].length; col++) { - if (board[row][col] >= 1 && (!(board[row - 1] === undefined || board[row][col - 1] === undefined))) - board[row][col] = Math.min(board[row - 1][col], board[row - 1][col - 1], board[row][col - 1]) + 1; - } - } - return Math.max(...board.map((row) => Math.max(...row))) ** 2; //수정된 board 내의 최댓값이 가능한 정사각형의 최대 -} \ No newline at end of file diff --git "a/level-2/\352\261\260\353\246\254\353\221\220\352\270\260-\355\231\225\354\235\270\355\225\230\352\270\260&81302&.js" "b/level-2/\352\261\260\353\246\254\353\221\220\352\270\260-\355\231\225\354\235\270\355\225\230\352\270\260&81302&.js" deleted file mode 100644 index 3569835..0000000 --- "a/level-2/\352\261\260\353\246\254\353\221\220\352\270\260-\355\231\225\354\235\270\355\225\230\352\270\260&81302&.js" +++ /dev/null @@ -1,21 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(places) { - var answer = []; - answer = places.map(place => { - return place.some((row, rowIndex) => - row.split('').some((mark, colIndex, rowArr) => { - if (mark === 'X') return false - const countPeopleAround = [ - rowArr[colIndex - 1] || '', - rowArr[colIndex + 1] || '', - (place[rowIndex - 1] || '')[colIndex], - (place[rowIndex + 1] || '')[colIndex], - ].filter(mark => mark === 'P').length - return (mark === 'P' && countPeopleAround > 0) || (mark === 'O' && countPeopleAround > 1) - }) - ) ? 0 : 1 - }) - return answer; -} \ No newline at end of file diff --git "a/level-2/\352\262\214\354\236\204-\353\247\265-\354\265\234\353\213\250\352\261\260\353\246\254&1844&.js" "b/level-2/\352\262\214\354\236\204-\353\247\265-\354\265\234\353\213\250\352\261\260\353\246\254&1844&.js" deleted file mode 100644 index 38689bc..0000000 --- "a/level-2/\352\262\214\354\236\204-\353\247\265-\354\265\234\353\213\250\352\261\260\353\246\254&1844&.js" +++ /dev/null @@ -1,40 +0,0 @@ -// https://github.com/codeisneverodd/programmers-coding-test -//정답 1 - prove-ability -function solution(maps) { - // BFS 활용 - const row = maps.length - 1, col = maps[0].length - 1; - - // 큐 - 시작 위치 y, x, 이동 거리 - const queue = [[0, 0, 1]]; - - while(queue.length) { - // 큐 추출 - let [y, x, count] = queue.shift(); - // 상대 팀 진영이라면 - if(y === row && x === col) return count; - // 동서남북 확인 - for(let i = 0; i < 4; i++) { - const [dy, dx] = DIRECTION[i]; - // 다음 길 위치 - const nextY = dy + y, nextX = dx + x; - // 맵 밖으로 나간다면 - if(isOut(nextY, nextX, row, col)) continue; - // 도착한 곳이 벽이라면 - if(maps[nextY][nextX] === 0) continue; - // 이미 지난 곳 벽으로 만들어서 다음에 접근 방지 - maps[nextY][nextX] = 0; - // 다음에 확인해야하는 곳 큐에 추가 - // 갈수 있는 곳이 두 곳이라면 두 곳 추가됨 - queue.push([nextY, nextX, count + 1]); - // 처음에 count 를 let 으로 선언하고 ++count 로 작성했을 떄 에러 발생 - 이유는 모르겠음.. - } - } - - return -1; -} - -// 상 우 하 좌 -const DIRECTION = [[1, 0], [0, 1], [-1, 0], [0, -1]]; - -// 사용이 가능한 길인지 확인하는 함수 -const isOut = (nextY, nextX, row, col) => nextY < 0 || nextX < 0 || nextY > row || nextX > col; \ No newline at end of file diff --git "a/level-2/\352\264\204\355\230\270-\353\263\200\355\231\230&60058&.js" "b/level-2/\352\264\204\355\230\270-\353\263\200\355\231\230&60058&.js" deleted file mode 100644 index 7d8de37..0000000 --- "a/level-2/\352\264\204\355\230\270-\353\263\200\355\231\230&60058&.js" +++ /dev/null @@ -1,64 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(p) { - if (p.length === 0) return p - let bracketCount = 0 - let isURight = true - for (let i = 0; i < p.length; i++) { - bracketCount = p[i] === '(' ? bracketCount + 1 : bracketCount - 1 - if (bracketCount < 0) isURight = false - if (bracketCount === 0) { - const [u, v] = [p.slice(0, i + 1), p.slice(i + 1)] - if (isURight) { - return u + solution(v) - } else { - let emptyString = '(' + solution(v) + ')' - const slicedReversedString = u - .slice(1, u.length - 1) - .split('') - .map(bracket => bracket === '(' ? ')' : '(') - .join('') - return emptyString + slicedReversedString - } - } - } -} - -//정답 2 - codeisneverodd -function solution(p) { - if (p.length === 0) { - return p - } else { - const sliceIndex = balancedIndex(p) - const [u, v] = [p.slice(0, sliceIndex + 1), p.slice(sliceIndex + 1)] - if (isRight(u)) { - return u + solution(v) - } else { - let emptyString = '(' + solution(v) + ')' - const slicedReversedString = u - .slice(1, u.length - 1) - .split('') - .map(bracket => bracket === '(' ? ')' : '(') - .join('') - return emptyString + slicedReversedString - } - } -} - -const isRight = (str) => { - if (str[0] === ')') return false - let stack = 0 - for (let i = 0; i < str.length; i++) { - stack = str[i] === '(' ? stack + 1 : stack - 1 - if (stack < 0) return false - } - return stack === 0 -} -const balancedIndex = (str) => { - let count = 0 - for (let i = 0; i < str.length; i++) { - count = str[i] === '(' ? count + 1 : count - 1 - if (count === 0) return i - } -} \ No newline at end of file diff --git "a/level-2/\352\264\204\355\230\270-\355\232\214\354\240\204\355\225\230\352\270\260&76502&.js" "b/level-2/\352\264\204\355\230\270-\355\232\214\354\240\204\355\225\230\352\270\260&76502&.js" deleted file mode 100644 index fc826c4..0000000 --- "a/level-2/\352\264\204\355\230\270-\355\232\214\354\240\204\355\225\230\352\270\260&76502&.js" +++ /dev/null @@ -1,38 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(s) { - let answer = 0; - let sArr = s.split('') - if (isRight(sArr.join(''))) answer += 1 - for (let i = 0; i < sArr.length - 1; i++) { - sArr.push(sArr.shift()) - if (isRight(sArr.join(''))) answer += 1 - } - return answer; -} - -function isRight(str) { - const bracketOpen = ['[', '{', '('], bracketClose = [']', '}', ')'] - let status = [{open: false, openOrder: []}, {open: false, openOrder: []}, {open: false, openOrder: []}] - for (let sIndex = 0; sIndex < str.length; sIndex++) { - for (let bIndex = 0; bIndex < 3; bIndex++) { - if (str[sIndex] === bracketOpen[bIndex]) { - status[bIndex].open = true - status[bIndex].openOrder.push(sIndex) - } - if (str[sIndex] === bracketClose[bIndex]) { - if (status[bIndex].openOrder.length > 0) { - if (status.filter(check => check.open && check.openOrder[check.openOrder.length - 1] > status[bIndex].openOrder[status[bIndex].openOrder.length - 1]).length > 0) - return false //먼저 닫혀야 하는 괄호보다 먼저 닫힘 - status[bIndex].openOrder.pop() - status[bIndex].open = false - } else { - return false //열리기 전에 닫힘 - } - } - } - } - for (let i = 0; i < 3; i++) if (status[i].open) return false //닫히지 않은 괄호가 있음 - return true -} \ No newline at end of file diff --git "a/level-2/\352\265\220\354\240\220\354\227\220-\353\263\204-\353\247\214\353\223\244\352\270\260&87377&.js" "b/level-2/\352\265\220\354\240\220\354\227\220-\353\263\204-\353\247\214\353\223\244\352\270\260&87377&.js" deleted file mode 100644 index f01e731..0000000 --- "a/level-2/\352\265\220\354\240\220\354\227\220-\353\263\204-\353\247\214\353\223\244\352\270\260&87377&.js" +++ /dev/null @@ -1,43 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(line) { - const getCrossPoint = ([A, B, E], [C, D, F]) => { - if (A * D - B * C === 0) return [Infinity, Infinity]; - return [(B * F - E * D) / (A * D - B * C), (E * C - A * F) / (A * D - B * C)]; - }; //문제 설명 최하단 참조 - - const crossPoints = line.flatMap((lineA, i) => - line - .slice(i + 1) - .map(lineB => getCrossPoint(lineA, lineB)) - .filter(([x, y]) => Number.isInteger(x) && Number.isInteger(y)) - ); - - const generateCanvas = crossPoints => { - const xPoints = [...crossPoints.map(([x, y]) => x)]; - const yPoints = [...crossPoints.map(([x, y]) => y)]; - const [minX, maxX] = [Math.min(...xPoints), Math.max(...xPoints)]; - const [minY, maxY] = [Math.min(...yPoints), Math.max(...yPoints)]; - const xLength = Math.abs(maxX - minX) + 1; - const yLength = Math.abs(maxY - minY) + 1; - - return { - canvas: Array.from({ length: yLength }, () => Array(xLength).fill('.')), - draw([x, y], value) { - this.canvas[Math.abs(y - maxY)][Math.abs(x - minX)] = value; - }, - print() { - return this.canvas.map(row => row.join('')); - }, - }; - }; - - const canvas = generateCanvas(crossPoints); - - crossPoints.forEach(point => { - canvas.draw(point, '*'); - }); - - return canvas.print(); -} diff --git "a/level-2/\352\265\254\353\252\205\353\263\264\355\212\270&42885&.js" "b/level-2/\352\265\254\353\252\205\353\263\264\355\212\270&42885&.js" deleted file mode 100644 index 3bfd2a7..0000000 --- "a/level-2/\352\265\254\353\252\205\353\263\264\355\212\270&42885&.js" +++ /dev/null @@ -1,66 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - jaewon1676 -function solution(people, limit) { - let cnt = 0; - - people.sort((a, b) => {return a - b}) // 몸무게 오름차순 - - while(people.length != 0){ // 무인도에 갖힌 사람이 없어질때까지 반복 - if (people[0] + people[people.length-1] <= limit){ // 무게가 되면 둘 다 빼주기 - people.pop() - people.shift() - } else { - people.pop() // 무거운사람을 뺴주자 - } - cnt++; - } - return cnt; -} // 4주차 2번 문제와 유사함 - -// 정답 2- prove-ability -function solution(people, limit) { - let count = 0; - // 오름차순 정렬 - people.sort((a, b) => a - b); - - // people 배열 요소가 있다면? - while(people.length) { - - // 요소 중 가장 큰 수인 마지막 요소를 가져온다 - let sum = people.pop(); - - // 요소 중 가장 작은 수를 더한다 - sum += people[0] - - // 합이 무게제한보다 작거나 같다면 가장 작은 요소 제거 - if(sum <= limit) people.shift(); - - count++; - } - - 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 diff --git "a/level-2/\352\270\260\353\212\245\352\260\234\353\260\234&42586&.js" "b/level-2/\352\270\260\353\212\245\352\260\234\353\260\234&42586&.js" deleted file mode 100644 index 1cc3df1..0000000 --- "a/level-2/\352\270\260\353\212\245\352\260\234\353\260\234&42586&.js" +++ /dev/null @@ -1,153 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd - 시간복잡도 감소 -function solution(progresses, speeds) { - var answer = []; - const remainDays = progresses.map((prog, index) => Math.ceil((100 - prog) / speeds[index])) - console.log(remainDays) - let maxDay = remainDays[0] - answer.push(0) - for (let i = 0; i < remainDays.length; i++) { - if (remainDays[i] <= maxDay) { - answer[answer.length - 1] += 1 - } else { - answer.push(1) - maxDay = remainDays[i] - } - } - return answer; -} - -//정답 2 - codeisneverodd -function solution(progresses, speeds) { - var answer = []; - while (progresses.length > 0) { - let done = 0 - progresses = progresses.map((prog, index) => prog + speeds[index]) - const length = progresses.length - for (let i = 0; i < length; i++) { - if (progresses[0] >= 100) { - progresses.shift() - speeds.shift() - done += 1 - } else { - break - } - } - if (done > 0) answer.push(done) - } - return answer; -} - -//정답 3 - jaewon1676 -function solution(progresses, speeds) { - let answer = []; - - while(speeds.length > 0) { - for(let i=0;i= 100) { - progresses.shift(); - speeds.shift(); - count++; - } - if(count > 0) { // 결과 배열에 넣어주기 - answer.push(count); - } - } - return answer; -} - -// 정답 4 - createhb21 -function solution(progresses, speeds) { - // answer은 각 배포 때 함께 배포되는 기능의 수를 담은 배열 - var answer = []; - // 각각의 기능이 몇 일 소요되는지 담은 큐 - let queue = []; - - for (let i = 0; i < speeds.length; i++) { - // 각각의 기능이 몇 일 걸리는지 계산 - let task = Math.ceil((100 - progresses[i]) / speeds[i]); - // 위 계산한 결과값(작업일)을 모두 큐에 넣어준다. - queue.push(task); - - // 그 다음 작업이 queue[0]보다 작거나 같을 경우, queue.push() - // 그 다음 작업이 queue[0]보다 클 경우, queue의 사이즈만큼 answer.push(), queue 초기화 - if(task > queue[0]) { - answer.push(queue.length-1); - // 큐 초기화 - queue = [task]; - } - } - - answer.push(queue.length); - return answer; - } - -// 정답 5 - chaerin-dev -function solution(progresses, speeds) { - // 각 기능 개발 작업이 끝나기까지 남은 일수를 계산해서 daysLeftArr 배열에 저장 - const daysLeftArr = progresses.map((progress, i) => Math.ceil((100 - progress) / speeds[i])); - - // 최초 배포날은 daysLeftArr의 첫 번째 요소 - let deployDay = daysLeftArr[0]; - // 각 배포에 몇 개의 기능이 배포될지 셀 변수 - let cnt = 0; - // 각 배포에 몇 개의 기능이 배포될지 저장할 배열 - const answer = []; - - // leftDays 배열을 차례로 순회하며 현재 배포일보다 이후에 배포되어야할 기능을 만나면 이전까지의 기능을 한번에 배포 - daysLeftArr.forEach((daysLeft) => { - if (deployDay < daysLeft) { - deployDay = daysLeft; - answer.push(cnt); - cnt = 0; - } - cnt++; - }); - answer.push(cnt); - - // 정답 반환 - return answer; -} - -// 정답 6 - RyanDeclan -// 예제1) 입력값 : [93, 30, 55], [1, 30, 5] -function solution(progresses, speeds) { - // 각각의 progress 의 기존 인덱스와 해당 기능의 작업한 n일을 포함하는 배열 - let countBox = []; - let completeBox = []; - for(k=1; k<100; k++){ - let complete = [] - for(i=0; i= 100){ - complete.push([i,k]); - progresses.splice(i,1,"end") - } - } - if(complete[0] != null)completeBox.push(...complete) - } - completeBox.sort((a,b) => a[0] - b[0]) - - //여기까지 한다면 console.log(completeBox) [ [ 0, 7 ], [ 1, 3 ], [ 2, 9 ] ] 이런식으로 정리가된다. - // 첫번째 기능(인덱스 0) 은 7일간 작업후 배포한다. 두 번째 기능(인덱스 1)은 3일간의 작업 후 배포한다. 세 번째 기능 (인덱스2)는 9일간의 작업후 배포한다 - - // 인덱스와 작업한 일수가 같이 들어가있는 배열을 가지고 count하는 작업 - let count = 0; - completeBox.reduce((acc, cur, i) => { - if( acc[0] < cur[1] ){ // 현재 순회하는 값(일수)가 기존에 저장된 값(일수)보다 클때 - if(i) countBox.push(count) - acc[0] = cur[1]; - count = 0; - count++ - }else{count++} - if(completeBox.length == i + 1) countBox.push(count) // 마지막 순회까지 다 돌고나면 count를 box에 담는다. - return acc - } ,[0]) - return countBox; -} diff --git "a/level-2/\353\213\244\353\246\254\353\245\274-\354\247\200\353\202\230\353\212\224-\355\212\270\353\237\255&42583&.js" "b/level-2/\353\213\244\353\246\254\353\245\274-\354\247\200\353\202\230\353\212\224-\355\212\270\353\237\255&42583&.js" deleted file mode 100644 index e8b5cd6..0000000 --- "a/level-2/\353\213\244\353\246\254\353\245\274-\354\247\200\353\202\230\353\212\224-\355\212\270\353\237\255&42583&.js" +++ /dev/null @@ -1,55 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(bridge_length, weight, truck_weights) { - let [tick, onBridge, weightOnBridge] = [0, [{weight: 0, timeToOut: 0}], 0] - while (onBridge.length > 0 || truck_weights.length > 0) { - if (onBridge[0].timeToOut === tick) weightOnBridge -= onBridge.shift().weight - if (weightOnBridge + truck_weights[0] <= weight) { - weightOnBridge += truck_weights[0] - onBridge.push({weight: truck_weights.shift(), timeToOut: tick + bridge_length}) - } else { - if (onBridge[0]) tick = onBridge[0].timeToOut - 1 // 시간을 줄이는 포인트 - } - tick++ - } - return tick -} - -//정답 2 - codeisneverodd -function solution(bridge_length, weight, truck_weights) { - const bridge = new Array(bridge_length).fill(0) - let tick = 0 - do { - tick++ - bridge.pop() - bridge.reduce((a, b) => a + b) + truck_weights[0] <= weight ? - bridge.unshift(truck_weights.shift()) : bridge.unshift(0) - } while (bridge.reduce((a, b) => a + b) !== 0) - return tick; -} - -//정답 3 - jaewon1676 -function solution(bridge_length, weight, truck_weights) { - var answer = 0; // 총 걸리는 시간 - let bridge = []; // 다리를 건너는 트럭 - let bridge_weight = 0; // 다리를 건너는 트럭의 총 무게 - - while (truck_weights.length > 0) { // 대기 트럭이 없을때까지 반복한다. - answer++; // 1초 추가 - if (bridge.length == bridge_length) { // 다리가 가득 차있으면 제일 먼저 들어간 트럭을 뺴준다. - bridge_weight -= bridge.shift(); - } - if (bridge_weight + truck_weights[0] > weight) { - bridge.push(0); - continue; - } - let truck_weight = truck_weights.shift(); - bridge.push(truck_weight); - bridge_weight += truck_weight; - } - - answer += bridge_length; - - return answer; - } \ No newline at end of file diff --git "a/level-2/\353\213\244\354\235\214-\355\201\260-\354\210\253\354\236\220&12911&.js" "b/level-2/\353\213\244\354\235\214-\355\201\260-\354\210\253\354\236\220&12911&.js" deleted file mode 100644 index 860c9e4..0000000 --- "a/level-2/\353\213\244\354\235\214-\355\201\260-\354\210\253\354\236\220&12911&.js" +++ /dev/null @@ -1,50 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - let answer = n; - const nCountOne = n.toString(2).match(/1/g).length - while (true) { - answer++ - if (nCountOne === (answer).toString(2).match(/1/g).length) break - } - return answer; -} - -//정답 2 - codeisneverodd -function solution(n) { - var answer = 0; - let find = false - const nCountOne = countOne(n.toString(2)) - let counter = 1 - while (!find) { - if (nCountOne === countOne((n + counter).toString(2))) { - answer = n + counter - find = true - } - counter++ - } - return answer; -} - -const countOne = (str) => { - return str.split('').reduce((sum, currentChar) => - currentChar === '1' ? sum += 1 : sum, 0) -} - -//정답 3 - prove-ability -function solution(n) { - let i = n; - n = n.toString(2).match(/1/g).length; - while(true) { - i++; - const value = i.toString(2).match(/1/g).length; - if(n === value) return i; - } -} - -//정답 4 = ryan-dia -function solution(n) { - const count = (num) => num.toString(2).match(/1/g).length; - for(i=(n+1); i< 1_000_000; i++) if(count(n) == count(i)) return i -} diff --git "a/level-2/\353\221\220-\355\201\220-\355\225\251-\352\260\231\352\262\214-\353\247\214\353\223\244\352\270\260&118667&.js" "b/level-2/\353\221\220-\355\201\220-\355\225\251-\352\260\231\352\262\214-\353\247\214\353\223\244\352\270\260&118667&.js" deleted file mode 100644 index 82a2ffe..0000000 --- "a/level-2/\353\221\220-\355\201\220-\355\225\251-\352\260\231\352\262\214-\353\247\214\353\223\244\352\270\260&118667&.js" +++ /dev/null @@ -1,31 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(queue1, queue2) { - const getSum = arr => arr.reduce((a, c) => a + c, 0); - - if (getSum([...queue1, ...queue2]) % 2 !== 0) return -1; - - const queue = [...queue1, ...queue2, ...queue1, ...queue2]; - const maxCount = queue.length; - const average = getSum(queue) / 4; - let [currentSum, count, start, end] = [getSum(queue1), 0, 0, queue1.length]; - - const pop = () => { - currentSum -= queue[start]; - start += 1; - count += 1; - }; - const insert = () => { - currentSum += queue[end]; - end += 1; - count += 1; - }; - - while (count <= maxCount) { - if (currentSum < average) insert(); - if (currentSum > average) pop(); - if (currentSum === average) return count; - } - return -1; -} diff --git "a/level-2/\353\225\205\353\224\260\353\250\271\352\270\260&12913&.js" "b/level-2/\353\225\205\353\224\260\353\250\271\352\270\260&12913&.js" deleted file mode 100644 index 8bf1c07..0000000 --- "a/level-2/\353\225\205\353\224\260\353\250\271\352\270\260&12913&.js" +++ /dev/null @@ -1,29 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - jaewon1676 -function solution(land) { - var answer = 0; - - for (i = 1; i < land.length; i++){ - land[i][0] += (Math.max(land[i-1][1], land[i-1][2], land[i-1][3])); - land[i][1] += (Math.max(land[i-1][0], land[i-1][2], land[i-1][3])); - land[i][2] += (Math.max(land[i-1][0], land[i-1][1], land[i-1][3])); - land[i][3] += (Math.max(land[i-1][0], land[i-1][1], land[i-1][2])) - } - answer = land[land.length - 1] - return Math.max(...answer) -} -/* 풀이 과정 -1. land의 행만큼 반복문을 돌린다. -2. i행(두번째 행)부터 land.length - 1행(마지막 행)까지 본인 열을 제외한 나머지 열의 최댓값을 본인의 열에 더하여 누적한다. -3. 마지막까지 다 구하면 마지막 행에서 최대값을 반환한다.*/ - -//정답 2 - codeisneverodd -function solution(land) { - for (let rowIndex = 1; rowIndex < land.length; rowIndex++) { - for (let colIndex = 0; colIndex < land[0].length; colIndex++) { - land[rowIndex][colIndex] += Math.max(...land[rowIndex - 1].slice(0, colIndex), ...land[rowIndex - 1].slice(colIndex + 1)) - } - } - return Math.max(...land[land.length - 1]) -} diff --git "a/level-2/\353\251\200\353\246\254-\353\233\260\352\270\260&12914&.js" "b/level-2/\353\251\200\353\246\254-\353\233\260\352\270\260&12914&.js" deleted file mode 100644 index c9ba82a..0000000 --- "a/level-2/\353\251\200\353\246\254-\353\233\260\352\270\260&12914&.js" +++ /dev/null @@ -1,12 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(n) { - if (n < 2) return 1; - const count = [0, 1, 2, ...Array(n - 2).fill(0)]; - count.forEach((_, i) => { - if (i > 2) count[i] = (count[i - 2] + count[i - 1]) % 1234567; - }); - return count[n]; -} -//재귀를 사용하면 콜스택 오버플로우가 발생합니다. diff --git "a/level-2/\353\251\200\354\251\241\355\225\234-\354\202\254\352\260\201\355\230\225&62048&.js" "b/level-2/\353\251\200\354\251\241\355\225\234-\354\202\254\352\260\201\355\230\225&62048&.js" deleted file mode 100644 index 539fb20..0000000 --- "a/level-2/\353\251\200\354\251\241\355\225\234-\354\202\254\352\260\201\355\230\225&62048&.js" +++ /dev/null @@ -1,65 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(w, h) { - var answer = 1; - const gcd = greatestCommonDivisor(w, h) - answer = w * h - (h + w - gcd) - return answer; -} - -let greatestCommonDivisor = (a, b) => { - while (b > 0) { - let r = a % b; - a = b; - b = r; - } - return a; -} - -//정답 2 - codeisneverodd -function solution(w, h) { - var answer = 1; - const gcd = greatestCommonDivisor2(w, h) - const erasedBoxInUnit = h / gcd + w / gcd - 1 - answer = w * h - erasedBoxInUnit * gcd - return answer; -} - -let greatestCommonDivisor2 = (a, b) => { - while (b > 0) { - let r = a % b; - a = b; - b = r; - } - return a; -} - -//정답 3 - jaewon1676 -// 유클리드 호제법을 이용한 최대 공약수 구하기 -function gcd(w, h) { - let mod = w % h; // w와 h의 나머지를 구합니다. - - if (mod === 0) { // 나머지가 0일 경우 h를 반환합니다. - return h; - } - // 만약 0이 아닐경우 w에 h를 넣고 h에 나머지인 mod를 넣어 해당 함수를 다시 호출해 줍니다. - return gcd(h, mod); -} -function solution(w, h) { - const gcdVal = gcd(w, h); // 최대 공약수를 구해줍니다. - return w * h - (w + h - gcdVal); -} - -//정답 4 - yongchanson -function solution(w,h){ - const slope = h / w; - let cnt = 0; - //대각선 아래에 위치한 도형의 개수를 구합니다. - //대각선과 만나는 도형을 포함하기 위해 ceil을 사용합니다. - for(let i = 1; i <= w; i++){ - cnt += Math.ceil(slope * i); - } - //대각선 위에 위치한 도형의 개수 * 2을 리턴합니다. - return ((w*h - cnt) * 2); -} diff --git "a/level-2/\353\251\224\353\211\264-\353\246\254\353\211\264\354\226\274&72411&.js" "b/level-2/\353\251\224\353\211\264-\353\246\254\353\211\264\354\226\274&72411&.js" deleted file mode 100644 index 9c0aa7d..0000000 --- "a/level-2/\353\251\224\353\211\264-\353\246\254\353\211\264\354\226\274&72411&.js" +++ /dev/null @@ -1,35 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(orders, course) { - var answer = []; - for (const selectNum of course) { - let combinations = [] - for (const order of orders) { - getCombinations(Array.from(order), selectNum) - .map(combination => combination.sort().join(''))// 'WX'는 'XW'와 같아야한다. - .forEach(combString => combinations.push(combString)) - } - const combCounts = combinations.reduce((counts, combination) => { - counts[combination] = (counts[combination] || 0) + 1; - return counts; - }, {}); - let maxCount = 0, maxComb = [] - for (const comb in combCounts) if (combCounts[comb] >= maxCount) maxCount = combCounts[comb] - for (const comb in combCounts) if (combCounts[comb] === maxCount && maxCount >= 2) maxComb.push(comb) - answer.push(...maxComb) - } - answer = answer.sort() - return answer; -} - -const getCombinations = (array, selectNum) => { - const result = []; - if (selectNum === 1) return array.map((element) => [element]); - array.forEach((fixed, index, origin) => { - const restCombinations = getCombinations(origin.slice(index + 1), selectNum - 1); - const attached = restCombinations.map((restCombination) => [fixed, ...restCombination]); - result.push(...attached); - }); - return result; -} diff --git "a/level-2/\353\252\250\354\235\214\354\202\254\354\240\204&84512&.js" "b/level-2/\353\252\250\354\235\214\354\202\254\354\240\204&84512&.js" deleted file mode 100644 index e1df7ce..0000000 --- "a/level-2/\353\252\250\354\235\214\354\202\254\354\240\204&84512&.js" +++ /dev/null @@ -1,30 +0,0 @@ -//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 -*/ diff --git "a/level-2/\353\254\270\354\236\220\354\227\264-\354\225\225\354\266\225&60057&.js" "b/level-2/\353\254\270\354\236\220\354\227\264-\354\225\225\354\266\225&60057&.js" deleted file mode 100644 index 05381fc..0000000 --- "a/level-2/\353\254\270\354\236\220\354\227\264-\354\225\225\354\266\225&60057&.js" +++ /dev/null @@ -1,71 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(s) { - var answer = 0; - let lengthArr = [] - for (let i = 1; i <= s.length; i++) lengthArr.push(compressedString(s, i).length) - answer = Math.min(...lengthArr) - return answer; -} - -function compressedString(str, unitNum) { - let count = 1 - let result = [''] - for (let repeat = 0; repeat <= str.length / unitNum; repeat++) { - const slicedGroup = str.slice(unitNum * repeat, unitNum * repeat + unitNum) - if (result[result.length - 1] === slicedGroup) { - count++ - } else { - if (count > 1) result[result.length - 1] = count + result[result.length - 1] - result.push(slicedGroup) - count = 1 - } - } - return result.join('') -} - -//정답 2 - chaerin-dev -function solution(s) { - // len: 압축 전 문자열 길이 - const len = s.length; - // shortenLen: 압축 후 문자열 길이의 최솟값을 저장할 변수(압축 전 문자열 길이로 초기화) - let shortenLen = len; - - // 문자열을 1개 단위, 2개 단위, ... 문자열 길이의 절반 단위로 잘라가며 압축 수행 - for (let i = 1; i <= len / 2; i++) { - // cnt: 단위가 반복되는 횟수를 카운트할 변수 - let cnt = 1; - // temp: 현재 단위 문자열을 임시로 저장해둘 변수 - let temp = s.slice(0, i); - // shhortenS: 압축 후 문자열을 저장할 변수 - let shortenS = ""; - - // 문자열을 i개 단위로 잘라가며 현재 단위 문자열과 일치하는지 판단 - for (let j = i; j < len; j += i) { - // 현재 단위 문자열과 일치하면 단위가 반복되는 횟수 1 증가 - if (temp === s.slice(j, j + i)) cnt++; - // 현재 단위 문자열과 일치하지 않으면 - else { - // 압축 후 문자열에 단위가 반복되는 횟수와 단위를 이어붙이고 - if (cnt === 1) shortenS += temp; - else shortenS += cnt + temp; - - // 단위가 반복되는 횟수는 다시 1로 초기화 - cnt = 1; - // 현재 단위 문자열 업데이트 - temp = s.slice(j, j + i); - } - } - - // 반복이 끝난 후 마지막으로 고려했던 단위 문자열도 압축 후 문자열에 이어붙여줘야 함 - if (cnt === 1) shortenS += temp; - else shortenS += cnt + temp; - - // 압축 후 문자열 길이의 최솟값 업데이트 - shortenLen = Math.min(shortenLen, shortenS.length); - } - - // 압축 후 문자열 길이의 최솟값 반환 - return shortenLen; -} diff --git "a/level-2/\353\260\251\353\254\270-\352\270\270\354\235\264&49994&.js" "b/level-2/\353\260\251\353\254\270-\352\270\270\354\235\264&49994&.js" deleted file mode 100644 index 116fd33..0000000 --- "a/level-2/\353\260\251\353\254\270-\352\270\270\354\235\264&49994&.js" +++ /dev/null @@ -1,37 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(dirs) { - const move = ([x, y], dir) => { - let next = [x, y]; - if (dir === 'U') next = [x, y + 1]; - if (dir === 'D') next = [x, y - 1]; - if (dir === 'R') next = [x + 1, y]; - if (dir === 'L') next = [x - 1, y]; - if (Math.abs(next[0]) > 5 || Math.abs(next[1]) > 5) return [x, y]; - return next; - }; - - const isSameRoute = ([s1, e1], [s2, e2]) => { - const isSamePoint = ([x1, y1], [x2, y2]) => x1 === x2 && y1 === y2; - return (isSamePoint(s1, s2) && isSamePoint(e1, e2)) || (isSamePoint(s1, e2) && isSamePoint(s2, e1)); - }; - - const trace = { - visited: [], - visit(start, end) { - if (start[0] === end[0] && start[1] === end[1]) return; - if (!this.visited.find(route => isSameRoute(route, [start, end]))) this.visited.push([start, end]); - }, - }; - - let current = [0, 0]; - - dirs.split('').forEach(dir => { - const next = move(current, dir); - trace.visit(current, next); - current = next; - }); - - return trace.visited.length; -} diff --git "a/level-2/\353\260\260\353\213\254&12978&.js" "b/level-2/\353\260\260\353\213\254&12978&.js" deleted file mode 100644 index fb70325..0000000 --- "a/level-2/\353\260\260\353\213\254&12978&.js" +++ /dev/null @@ -1,190 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. - -//정답 1 - pereng11 -// 다익스트라 + 최소힙 O( N * logN ) - // [목적지, 거리] 노드를 값으로 가지는, 거리에 대한 최소힙 -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; - } -} - -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 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 diff --git "a/level-2/\353\271\233\354\235\230-\352\262\275\353\241\234-\354\202\254\354\235\264\355\201\264&86052&.js" "b/level-2/\353\271\233\354\235\230-\352\262\275\353\241\234-\354\202\254\354\235\264\355\201\264&86052&.js" deleted file mode 100644 index 8281b8c..0000000 --- "a/level-2/\353\271\233\354\235\230-\352\262\275\353\241\234-\354\202\254\354\235\264\355\201\264&86052&.js" +++ /dev/null @@ -1,76 +0,0 @@ -// https://github.com/codeisneverodd/programmers-coding-test -// 완벽한 정답이 아닙니다. -// 정답 1 - minjongbaek - -// 빛의 이동을 위한 DX, DY 변수를 선언합니다. -const DX = [-1, 1, 0, 0]; -const DY = [0, 0, -1, 1]; - -function solution(grid) { - - // DFS에 4방향을 고려하여 문제를 풉니다. - // 핵심은 이미 방문한 칸이고 방향이 동일하다면 하나의 사이클이 형성된 것으로 생각해야합니다. - - const answer = []; - - // visited 변수를 선언 후 방문 여부를 확인할 3차원 배열을 할당합니다. [x좌표, y좌표, [하, 상, 좌, 우]] - const visited = Array.from({ length: grid.length }, () => []).map((v) => { - for (let i = 0; i < grid[0].length; i += 1) { - v.push(new Array(4).fill(false)); - } - return v - }); - - for (let x = 0; x < grid.length; x += 1) { - for (let y = 0; y < grid[0].length; y += 1) { - for (let d = 0; d < 4; d += 1) { - // x, y 좌표에 하, 상, 좌, 우 방향으로 방문한 적이 없다면 dfs를 수행합니다. - if (!visited[x][y][d]) { - const stack = []; - stack.push([x, y, d]); - - let cnt = 0; - while (stack.length !== 0) { - const [currentX, currentY, currentD] = stack.pop(); - if (!visited[currentX][currentY][currentD]) { - visited[currentX][currentY][currentD] = true; - cnt += 1; - - const [nextX, nextY] = getNextXY(currentX, currentY, currentD, grid.length, grid[0].length); // 다음으로 이동할 좌표를 구합니다. - const nextD = getNextD(grid[nextX][nextY], currentD) // x, y 칸에 적혀있는 문자열대로 방향을 다음 방향을 구합니다. - - stack.push([nextX, nextY, nextD]) - } - - } - answer.push(cnt); - } - } - } - } - return answer.sort((a, b) => a - b); -} - -// 다음 행선지를 구하는 함수 -function getNextXY(x, y, d, xLength, yLength) { - x += DX[d]; - y += DY[d]; - - // x나 y의 값이 유효하지 않은 경우 값을 재할당합니다. - if (x < 0) x = xLength - 1; - if (x >= xLength) x = 0; - if (y < 0) y = yLength - 1; - if (y >= yLength) y = 0; - - return [x, y]; -} - -// 현재 방향과 칸에 표시된 문자를 기준으로 다음 행선지의 방향을 구하는 함수 -function getNextD(command, d) { - if (command === 'L') { - d = [2, 3, 1, 0][d] - } else if (command === 'R') { - d = [3, 2, 0, 1][d] - } - return d -} diff --git "a/level-2/\354\202\274\352\260\201-\353\213\254\355\214\275\354\235\264&68645&.js" "b/level-2/\354\202\274\352\260\201-\353\213\254\355\214\275\354\235\264&68645&.js" deleted file mode 100644 index c381952..0000000 --- "a/level-2/\354\202\274\352\260\201-\353\213\254\355\214\275\354\235\264&68645&.js" +++ /dev/null @@ -1,40 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - const snail = Array.from(Array(n), (_, index) => Array(index + 1)); - let currentNum = 0; - let [currentRow, currentCol] = [-1, 0]; - let shouldMove = n; - while (shouldMove > 0) { - for (let i = 0; i < shouldMove; i++) - snail[++currentRow][currentCol] = ++currentNum; - for (let i = 0; i < shouldMove - 1; i++) - snail[currentRow][++currentCol] = ++currentNum; - for (let i = 0; i < shouldMove - 2; i++) - snail[--currentRow][--currentCol] = ++currentNum; - shouldMove -= 3; - } - return snail.flatMap((num) => num); -} - -//정답 2 - jaewon1676 -function solution(n) { - const answer = new Array(n).fill().map((e, i) => new Array(i + 1)); - // 이차원배열을 만들어준다 - - let count = 0; - let x = -1; // 행 , 0행 0열부터 시작해주기 위해 x는 -1 해줍니다. - let y = 0; // 열 - while (n > 0) { - for (let i = 0; i < n; i++) answer[++x][y] = ++count; // 아래로 이동합니다. - for (let i = 0; i < n - 1; i++) answer[x][++y] = ++count; // 오른쪽으로 이동합니다. - for (let i = 0; i < n - 2; i++) answer[--x][--y] = ++count; // 대각선 오른쪽 위로 이동합니다. - - n -= 3; - } - return answer.flatMap(e => e); - // flatMap은 이차원의 여러 배열을 하나의 배열로 묶어줍니다. - // ex [ [ 1 ], [ 2, 9 ], [ 3, 10, 8 ], [ 4, 5, 6, 7 ] ] - // => [1, 2, 9, 3, 10, 8, 4, 5, 6, 7] -} diff --git "a/level-2/\354\206\214\354\210\230-\354\260\276\352\270\260&42839&.js" "b/level-2/\354\206\214\354\210\230-\354\260\276\352\270\260&42839&.js" deleted file mode 100644 index 92bec52..0000000 --- "a/level-2/\354\206\214\354\210\230-\354\260\276\352\270\260&42839&.js" +++ /dev/null @@ -1,35 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(numbers) { - var answer = 0; - const numArr = numbers.split('') - const permutationAll = [] - for (let r = 1; r <= numbers.length; r++) { - const permutationR - = Permutation(numArr, r).map((permuArr) => - parseInt(permuArr.join('')) - ) - for (let i = 0; i < permutationR.length; i++) permutationAll.push(permutationR[i]) - } - const permutationSet = [...new Set(permutationAll)] - for (const number of permutationSet) answer += isPrime(number) ? 1 : 0 - return answer; -} - -function Permutation(arr, r) { - const result = [] - if (r === 1) return arr.map((num) => [num]) - arr.forEach((fixed, index, org) => { - const rest = [...org.slice(0, index), ...org.slice(index + 1)] - const permutation = Permutation(rest, r - 1) - const attached = permutation.map((numbers) => [fixed, ...numbers]) - result.push(...attached) - }) - return result -} - -function isPrime(num) { - for (let i = 2; i <= Math.sqrt(num); i++) if (num % i === 0) return false - return num >= 2 -} \ No newline at end of file diff --git "a/level-2/\354\210\230\354\213\235-\354\265\234\353\214\200\355\231\224&67257&.js" "b/level-2/\354\210\230\354\213\235-\354\265\234\353\214\200\355\231\224&67257&.js" deleted file mode 100644 index 5849a47..0000000 --- "a/level-2/\354\210\230\354\213\235-\354\265\234\353\214\200\355\231\224&67257&.js" +++ /dev/null @@ -1,33 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(expression) { - var answer = 0; - const mathExp = ['*', '+', '-'] - let priorityArr = Permutation(mathExp, 3) - const calculated = [] - for (const priority of priorityArr) { - const expressionArr = expression.split(/(\D)/) - for (const exp of priority) { - while (expressionArr.includes(exp)) { - const index = expressionArr.indexOf(exp) - expressionArr.splice(index - 1, 3, eval(expressionArr.slice(index - 1, index + 2).join(''))) - } - } - calculated.push(Math.abs(expressionArr[0])) - } - answer = Math.max(...calculated) - return answer -} - -function Permutation(arr, r) { - const result = [] - if (r === 1) return arr.map((num) => [num]) - arr.forEach((fixed, index, org) => { - const rest = [...org.slice(0, index), ...org.slice(index + 1)] - const permutation = Permutation(rest, r - 1) - const attached = permutation.map((numbers) => [fixed, ...numbers]) - result.push(...attached) - }) - return result -} \ No newline at end of file diff --git "a/level-2/\354\210\234\354\234\204-\352\262\200\354\203\211&72412&.js" "b/level-2/\354\210\234\354\234\204-\352\262\200\354\203\211&72412&.js" deleted file mode 100644 index 97d5caa..0000000 --- "a/level-2/\354\210\234\354\234\204-\352\262\200\354\203\211&72412&.js" +++ /dev/null @@ -1,51 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(infos, queries) { - const infoData = {}; - - const fetchInfoData = (keyArr, score, start) => { - const key = keyArr.join(''); - - infoData[key] ? infoData[key].push(score) : (infoData[key] = [score]); - - for (let i = start; i < keyArr.length; i++) { - fetchInfoData( - keyArr.map((v, index) => (index === i ? '-' : v)), - score, - i + 1 - ); - } - }; - - const getPassCount = (key, passScore) => { - const scores = infoData[key]; - - if (!scores) return 0; - - let [left, right] = [0, scores.length]; - - while (left < right) { - const mid = Math.floor((left + right) / 2); - scores[mid] >= passScore ? (right = mid) : (left = mid + 1); - } - - return scores.length - left; - }; - - infos - .map(info => [info.split(' ').slice(0, 4), info.split(' ')[4]]) - .forEach(([keyArr, score]) => fetchInfoData(keyArr, +score, 0)); - - Object.keys(infoData).forEach(key => { - infoData[key].sort((a, b) => a - b); - }); - - return queries - .map(query => query.replace(/ and /g, '').split(' ')) - .map(([key, passScore]) => getPassCount(key, +passScore)); -} -// 주의 할 점 -// 1. 중첩 구조에 있는 객체를 수정할 때 새로운 객체를 만들어 재할당하면 효율성에 걸림 -// 2. 고차함수 중첩하면 새로운 객체를 만드는 행위가 너무 많음으로 효율성에 걸림. -// 3. filter 대신 정렬 후 이진 탐색을 활용해야 효율성에 걸리지 않음. diff --git "a/level-2/\354\210\253\354\236\220-\353\270\224\353\241\235&12923&.js" "b/level-2/\354\210\253\354\236\220-\353\270\224\353\241\235&12923&.js" deleted file mode 100644 index 7bb5d51..0000000 --- "a/level-2/\354\210\253\354\236\220-\353\270\224\353\241\235&12923&.js" +++ /dev/null @@ -1,32 +0,0 @@ -//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 블록이 놓인다. -*/ diff --git "a/level-2/\354\210\253\354\236\220\354\235\230-\355\221\234\355\230\204&12924&.js" "b/level-2/\354\210\253\354\236\220\354\235\230-\355\221\234\355\230\204&12924&.js" deleted file mode 100644 index 93b5e62..0000000 --- "a/level-2/\354\210\253\354\236\220\354\235\230-\355\221\234\355\230\204&12924&.js" +++ /dev/null @@ -1,52 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { //수학적 풀이는 별도로 하지 않았습니다. - var answer = 0; - for (let i = 1; i <= n; i++) { - let sum = 0 - for (let j = i; j <= n; j++) { - sum += j - if (sum >= n) { - if (sum === n) answer++ - break - } - } - } - return answer; -} - -//정답 2 - prove-ability -function solution(n) { - let answer = 0; - for(let i = 1; i <= n; i++) { - let sum = 0; - for(let j = i; j <= n; j++) { - sum += j; - if(sum > n) break; - if(n === sum) { - answer++; - break; - } - } - } - return answer; -} - -//정답 3 - yongchanson -function solution(n) { - /* - 정답 = n의 홀수 약수의 개수 - 15의 홀수 약수 : 1,3,5,15 - 1+2+3+4+5=15 (중간값 3) - 4+5+6=15 (중간값 5) - 7+8=15 (연속된 값) - 15=15 (15) - */ - let result = 0; - - for (let i = 1; i <= n; i++) { - if (n % i == 0 && i % 2 == 1) result++; - } - return result; -} diff --git "a/level-2/\354\212\244\355\202\254\355\212\270\353\246\254&49993&.js" "b/level-2/\354\212\244\355\202\254\355\212\270\353\246\254&49993&.js" deleted file mode 100644 index 7143bb8..0000000 --- "a/level-2/\354\212\244\355\202\254\355\212\270\353\246\254&49993&.js" +++ /dev/null @@ -1,16 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(skill, skill_trees) { - var answer = 0; - for (const tree of skill_trees) { - let check = Array.from(tree).filter(x => skill.includes(x)).map(x => skill.indexOf(x)) - if (checkOrder(check)) answer += 1 - } - return answer; -} - -function checkOrder(checkArr) { - for (let i = 0; i < checkArr.length; i++) if (checkArr[i] !== i) return false - return true -} \ No newline at end of file diff --git "a/level-2/\354\226\221\352\266\201\353\214\200\355\232\214&92342&.js" "b/level-2/\354\226\221\352\266\201\353\214\200\355\232\214&92342&.js" deleted file mode 100644 index 3ac8103..0000000 --- "a/level-2/\354\226\221\352\266\201\353\214\200\355\232\214&92342&.js" +++ /dev/null @@ -1,72 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -// 문제 풀이 전략 -// 1. 라이언이 쏠 수 있는 모든 경우를 비교한다. -// 2. 10점부터 0점 순으로 어피치와 라이언을 비교해 가면서, 라이언이 해당 점수를 이길지, 비길지, 질지를 결정하며 가능한 경우를 만들어 간다. -// 3. 이기는 경우는 화살을 어피치 + 1 개, 비기는 경우는 어피치와 동일한 개수를 소모하고, 지는 경우는 화살을 쏘지 않는다. -// 4. 단, 0점에 도달하기 전에 화살을 모두 소진하면 더이상 쏠 화살이 없으므로 나머지 점수는 쏘지 않은 것으로 한다. 마찬가지로 0점에 도달하였는데 화살이 남아있더라면, 남은 화살을 모두 0점에 쏜다. -// 5. 따라서 [지금까지 화살을 쏜 상황, 현재 검사중인 점수, 남은 화살 수]를 파라미터로 갖는 재귀함수를 구현하면 모든 경우를 검사할 수 있다. -// 6. 모든 경우가 구해졌다면, 어피치와 라이언의 점수차가 가장 큰 경우들만 남긴다 -// 7. 가장 큰 경우들이 여러개라면 각 경우들을 중 마지막으로 쏜 화살의 점수 배점이 낮은 경우를 우선적으로 정렬한다. -// RETURN. 정렬이 완료되면 가장 우선순위가 높은 경우를 반환한다. -function solution(possibleArrows, apeachComb) { - const compareTable = apeachComb.map(apeachArrow => ({ - apeachArrow, - ryanArrow: 0, - })); - const possibleRyanTable = getPossibleRyanTable(compareTable, 0, possibleArrows); - const maxScoreDiff = Math.max(...possibleRyanTable.flatMap(({ scoreDiff }) => scoreDiff)); - const maxRyanTables = possibleRyanTable.filter(({ scoreDiff }) => scoreDiff === maxScoreDiff); - if (maxScoreDiff <= 0) return [-1]; - const getIndexOfLastArrow = arrowTable => - arrowTable.length - - arrowTable - .slice() - .reverse() - .findIndex(x => x !== 0); - return maxRyanTables.sort((a, b) => getIndexOfLastArrow(b.ryanTable) - getIndexOfLastArrow(a.ryanTable))[0].ryanTable; -} -function getPossibleRyanTable(compareTable, currentIndex, numberOfArrowLeft) { - const { apeachArrow } = compareTable[currentIndex]; - const lastIndex = compareTable.length - 1; - const possibleRyanArrows = [ - 0, - numberOfArrowLeft > apeachArrow && apeachArrow + 1, - numberOfArrowLeft >= apeachArrow && apeachArrow, - ]; - - if (currentIndex === lastIndex || numberOfArrowLeft === 0) { - if (numberOfArrowLeft > 0) { - compareTable[compareTable.length - 1] = { - apeachArrow, - ryanArrow: numberOfArrowLeft, - }; - } - const appeachScore = compareTable.reduce( - (acc, { apeachArrow, ryanArrow }, index) => - apeachArrow >= ryanArrow && apeachArrow !== 0 ? acc + 10 - index : acc, - 0 - ); - const ryanScore = compareTable.reduce( - (acc, { apeachArrow, ryanArrow }, index) => (ryanArrow > apeachArrow ? acc + 10 - index : acc), - 0 - ); - return [ - { - scoreDiff: ryanScore - appeachScore, - ryanTable: compareTable.flatMap(({ ryanArrow }) => ryanArrow), - }, - ]; - } - return [ - ...possibleRyanArrows.flatMap(ryanUsedArrow => { - const nextCompareTable = [...compareTable]; - nextCompareTable.splice(currentIndex, 1, { - apeachArrow, - ryanArrow: ryanUsedArrow, - }); - return getPossibleRyanTable(nextCompareTable, currentIndex + 1, numberOfArrowLeft - ryanUsedArrow); - }), - ]; -} diff --git "a/level-2/\354\230\201\354\226\264-\353\201\235\353\247\220\354\236\207\352\270\260&12981&.js" "b/level-2/\354\230\201\354\226\264-\353\201\235\353\247\220\354\236\207\352\270\260&12981&.js" deleted file mode 100644 index d3a5449..0000000 --- "a/level-2/\354\230\201\354\226\264-\353\201\235\353\247\220\354\236\207\352\270\260&12981&.js" +++ /dev/null @@ -1,13 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n, words) { - var answer = []; - let turn = 1 - for (let i = 1; i < words.length; i++) { - let pass = (words[i][0] === words[i - 1][words[i - 1].length - 1]) && !(words.slice(0, i).includes(words[i])) - if (i % n === 0) turn++ - if (!pass) return [i % n + 1, turn] - } - return [0, 0]; -} \ No newline at end of file diff --git "a/level-2/\354\230\210\354\203\201-\353\214\200\354\247\204\355\221\234&12985&.js" "b/level-2/\354\230\210\354\203\201-\353\214\200\354\247\204\355\221\234&12985&.js" deleted file mode 100644 index c2072b6..0000000 --- "a/level-2/\354\230\210\354\203\201-\353\214\200\354\247\204\355\221\234&12985&.js" +++ /dev/null @@ -1,42 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd - -function solution(n, a, b) { - let currentRound = 1; - const myNextNumber = (num) => Math.floor((num + 1) / 2)//내가 이긴경우 다음으로 가지게 될 번호 - while (a !== b) { // a의 다음 번호가 b의 다음번호와 같아지면 끝난다. - if (myNextNumber(a) === myNextNumber(b)) break - a = myNextNumber(a) - b = myNextNumber(b) - currentRound++ - } - return currentRound -} - -//정답 2 - le2sky -function solution(n, a, b) { - let arr = Array.from({ length: n }, () => 0) - arr[b - 1] = "B" - arr[a - 1] = "A" - - const isDiff = () => { - return ( - (arr.indexOf("A") + 1 > arr.length / 2 && arr.indexOf("B") + 1 <= arr.length / 2) || - (arr.indexOf("A") + 1 <= arr.length / 2 && arr.indexOf("B") + 1 > arr.length / 2)) ? true : false - }; - const isLeft = () => { - return (arr.indexOf("A") + 1 > arr.length / 2) ? false : true - }; - - //대진표의 절반을 기준으로 양옆에 A와 B가 있을 경우 log2N을 구하면 라운드 수가 나옴 - while (!isDiff()) { - if (isLeft()) { - arr.splice(arr.length / 2) - } else { - arr.splice(0, arr.length / 2) - } - } - return Math.log2(arr.length) -} - \ No newline at end of file diff --git "a/level-2/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251&42888&.js" "b/level-2/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251&42888&.js" deleted file mode 100644 index 259d864..0000000 --- "a/level-2/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251&42888&.js" +++ /dev/null @@ -1,83 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(record) { - var answer = []; - const users = {} - record.map(history => { - const [action, id, name] = history.split(' ') - if (action !== 'Leave') users[id] = name - }) - record.map(history => { - const [action, id, name] = history.split(' ') - if (action === 'Enter') answer.push(`${users[id]}님이 들어왔습니다.`) - if (action === 'Leave') answer.push(`${users[id]}님이 나갔습니다.`) - }) - return answer; -} - -//정답 2 - jaewon1676 -function solution(record) { - let answer = []; - const map = new Map(); - - for (let i = 0; i < record.length; ++i) { - const [state, uid, name] = record[i].split(' '); - - if (state == 'Leave') { - answer.push([uid, '님이 나갔습니다.']); - - continue; - } - - if (state == 'Enter') { - answer.push([uid, '님이 들어왔습니다.']); - } - map.set(uid, name); - } - return answer.map(ele => map.get(ele[0]) + ele[1]); -} - -//정답 3 - chaerin-dev -function solution(record) { - // 최종 메시지를 저장할 배열 - let result = []; - // 채팅방을 출입하는 유저의 아이디를 차례로 저장할 배열 - let resultId = []; - // 유저의 아이디: 닉네임 쌍을 저장할 Map - let idNameMap = new Map(); - - // record의 각 문자열을 띄어쓰기 단위로 나눠 배열로 변환 - record = record.map((e) => e.split(" ")); - - // record의 각 요소에 대해 - record.forEach((e) => { - // 각 요소의 첫 번째 요소(Enter/Leave/Change)가 - switch (e[0]) { - // Enter이면 - case "Enter": - // resultID 배열에 들어온 유저의 아이디 저장 - resultId.push(e[1]); - // result 배열에 닉네임을 제외하고 표시될 메시지 저장 - result.push("님이 들어왔습니다."); - // idNameMap Map에 유저의 아이디: 닉네임 쌍 저장 - idNameMap.set(e[1], e[2]); - break; - // Leave이면 - case "Leave": - // resultID 배열에 들어온 유저의 아이디 저장 - resultId.push(e[1]); - // result 배열에 닉네임을 제외하고 표시될 메시지 저장 - result.push("님이 나갔습니다."); - break; - // Change이면 - case "Change": - // idNameMap Map에 유저의 아이디에 해당하는 닉네임 변경 - idNameMap.set(e[1], e[2]); - break; - } - }); - - // resultId의 각 요소에 해당하는 닉네임을 idNameMap에서 찾아서 result의 각 요소와 이어붙인 값 배열 반환 - return result.map((e, i) => idNameMap.get(resultId[i]) + e); -} diff --git "a/level-2/\354\230\254\353\260\224\353\245\270-\352\264\204\355\230\270&12909&.js" "b/level-2/\354\230\254\353\260\224\353\245\270-\352\264\204\355\230\270&12909&.js" deleted file mode 100644 index c982ca6..0000000 --- "a/level-2/\354\230\254\353\260\224\353\245\270-\352\264\204\355\230\270&12909&.js" +++ /dev/null @@ -1,12 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1(🎩 refactor 220425) - codeisneverodd -function solution(s) { - let opened = 0; - for (const bracket of s) { - if (bracket === "(") opened += 1; - if (bracket === ")") opened -= 1; - if (opened < 0) return false; - } - return opened === 0; -} diff --git "a/level-2/\354\234\204\354\236\245&42578&.js" "b/level-2/\354\234\204\354\236\245&42578&.js" deleted file mode 100644 index 1466598..0000000 --- "a/level-2/\354\234\204\354\236\245&42578&.js" +++ /dev/null @@ -1,89 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(clothes) { - var answer = 1; - const spyWear = {}; - for (const clothNPart of clothes) - spyWear[clothNPart[1]] = (spyWear[clothNPart[1]] || 0) + 1; - for (const part in spyWear) answer *= spyWear[part] + 1; - return answer - 1; -} - -//정답 2 - codeisneverodd -function solution(clothes) { - var answer = 0; - const spyWear = {}; - for (const clothNPart of clothes) { - if (spyWear[clothNPart[1]] === undefined) spyWear[clothNPart[1]] = []; - spyWear[clothNPart[1]].push(clothNPart[0]); - } - const clothesCount = []; - for (const part in spyWear) clothesCount.push(spyWear[part].length + 1); - answer = - clothesCount.reduce((previous, current) => previous * current, 1) - 1; - return answer; -} -// 정답 3 - hyosung -function solution(clothes) { - let answer = 1; - // 옷 종류 - const types = {}; - // 반복문 최적화 - length, 비교연산 제거 - const length = clothes.length; - for (let i = length; i--; ) { - // 해당 옷의 종류가 없다면 종류 1 - if (!types[clothes[i][1]]) types[clothes[i][1]] = 1; - // 해당 옷의 종류가 있다면 종류 증가 - else types[clothes[i][1]] += 1; - } - // (종류 별 값 + 1 ) 을 다 곱셈 - Object.values(types).forEach((v) => { - answer *= v + 1; - }); - - return answer - 1; -} - -//정답 4 - jaewon1676 -function solution(clothes) { - var answer = 1; - var obj={}; - for(var i=0;i - 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 diff --git "a/level-2/\354\235\264\354\247\204-\353\263\200\355\231\230-\353\260\230\353\263\265\355\225\230\352\270\260&70129&.js" "b/level-2/\354\235\264\354\247\204-\353\263\200\355\231\230-\353\260\230\353\263\265\355\225\230\352\270\260&70129&.js" deleted file mode 100644 index 1b98e04..0000000 --- "a/level-2/\354\235\264\354\247\204-\353\263\200\355\231\230-\353\260\230\353\263\265\355\225\230\352\270\260&70129&.js" +++ /dev/null @@ -1,32 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(s) { - const removeZero = s => { - const removed = s - .split('') - .filter(n => n !== '0') - .join(''); - return { removed, count: s.length - removed.length }; - }; - - const convertToBinary = (s, turnCount, removedCount) => { - if (s === '1') return [turnCount, removedCount]; - const { removed, count } = removeZero(s); - return convertToBinary(removed.length.toString(2), turnCount + 1, removedCount + count); - }; - - return convertToBinary(s, 0, 0); -} - -// 정답 2 - RyanDeclan -function solution(s) { - let box = [0,0] - while(s.length > 1){ - let reamain = s.replace(/0/g,"").length - box[0] += 1 - box[1] += (s.length - reamain) - s = reamain.toString(2) - } - return box; -} diff --git "a/level-2/\354\240\204\353\240\245\353\247\235\354\235\204-\353\221\230\353\241\234-\353\202\230\353\210\204\352\270\260&86971&.js" "b/level-2/\354\240\204\353\240\245\353\247\235\354\235\204-\353\221\230\353\241\234-\353\202\230\353\210\204\352\270\260&86971&.js" deleted file mode 100644 index f57dd57..0000000 --- "a/level-2/\354\240\204\353\240\245\353\247\235\354\235\204-\353\221\230\353\241\234-\353\202\230\353\210\204\352\270\260&86971&.js" +++ /dev/null @@ -1,29 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(n, wires) { - const hasOneOfWire = (tree, [a, b]) => tree.includes(a) || tree.includes(b); - - const convertWiresToTree = wires => [...new Set(wires.flat())]; - - const generateTree = (wires, tree) => { - if (!wires.find(wire => hasOneOfWire(tree, wire))) return tree; - - const nextWires = wires.filter(wire => !hasOneOfWire(tree, wire)); - const nextTree = [...tree, ...convertWiresToTree(wires.filter(wire => hasOneOfWire(tree, wire)))]; - - return [...new Set(generateTree(nextWires, nextTree))]; - }; - - let minDiff = Infinity; - const length = convertWiresToTree(wires).length; - - wires.forEach((_, i) => { - const [initWire, ...remainWires] = wires.filter((_, j) => j !== i); - const lengthA = generateTree(remainWires, convertWiresToTree([initWire])).length; - const diff = Math.abs(lengthA - (length - lengthA)); - minDiff = Math.min(diff, minDiff); - }); - - return minDiff; -} diff --git "a/level-2/\354\240\220\355\224\204\354\231\200-\354\210\234\352\260\204-\354\235\264\353\217\231&12980&.js" "b/level-2/\354\240\220\355\224\204\354\231\200-\354\210\234\352\260\204-\354\235\264\353\217\231&12980&.js" deleted file mode 100644 index 9de65a0..0000000 --- "a/level-2/\354\240\220\355\224\204\354\231\200-\354\210\234\352\260\204-\354\235\264\353\217\231&12980&.js" +++ /dev/null @@ -1,25 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - var ans = 0; - while (n > 0) { - if (n % 2 !== 0) { - n = (n - 1) / 2 - ans++ - } else { - n = n / 2 - } - } - return ans; -} - -//정답 2 - yongchanson -function solution(n) { - let result = 0; - while (n > 0) { - result += n % 2; - n = Math.floor(n / 2); - } - return result; -} diff --git "a/level-2/\354\241\260\354\235\264\354\212\244\355\213\261&42860&.js" "b/level-2/\354\241\260\354\235\264\354\212\244\355\213\261&42860&.js" deleted file mode 100644 index 334f36b..0000000 --- "a/level-2/\354\241\260\354\235\264\354\212\244\355\213\261&42860&.js" +++ /dev/null @@ -1,25 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(name) { - var answer = 0; - const length = name.length; - let upDownCount = 0 - let leftRightCountList = [length - 1]//한 방향으로 쭉 갔을 때 - for (let i = 0; i < length; i++) upDownCount += minUpOrDownCount(name[i]) - for (let startOfA = 0; startOfA < name.length; startOfA++) { - let endOfA = startOfA + 1; - while (endOfA < length && name[endOfA] === 'A') endOfA++; - const [moveToStartOfA, moveToEndOfA] = [startOfA, length - endOfA] - leftRightCountList.push(moveToStartOfA * 2 + moveToEndOfA)// 0 -> A.., 0 <- A.., ..A <- -1 - leftRightCountList.push(moveToEndOfA * 2 + moveToStartOfA)//시작부터 뒤로 가는 경우 ..A <- -1, ..A -> -1, 0 -> A.. - } - answer = upDownCount + Math.min(...leftRightCountList) - return answer; -} - -function minUpOrDownCount(destination) { - const Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' - const index = Alphabet.indexOf(destination) - return Math.min(index, Alphabet.length - index) -} \ No newline at end of file diff --git "a/level-2/\354\243\274\354\260\250-\354\232\224\352\270\210-\352\263\204\354\202\260&92341&.js" "b/level-2/\354\243\274\354\260\250-\354\232\224\352\270\210-\352\263\204\354\202\260&92341&.js" deleted file mode 100644 index d93a2cf..0000000 --- "a/level-2/\354\243\274\354\260\250-\354\232\224\352\270\210-\352\263\204\354\202\260&92341&.js" +++ /dev/null @@ -1,65 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - ljw0096 - -function solution(fees, records) { - const answer = [] - - const parkingTable = getParkingTable(records) - const sortedKeys = Object.keys(parkingTable).sort() - - for (const targetCar of sortedKeys) { - if (parkingTable[targetCar].length % 2 === 1) { - parkingTable[targetCar].push(['23:59', 'OUT']) - } - const totalTime = getTotalTime(parkingTable, targetCar) - const fee = calculateFee(totalTime, fees) - answer.push(fee) - } - - return answer -} - -function getParkingTable(records) { - const parkingTable = {} - - records.forEach((val) => { - const info = val.split(' ') - if (Object.keys(parkingTable).includes(info[1])) { - parkingTable[info[1]].push([info[0], info[2]]) - } else { - parkingTable[info[1]] = [[info[0], info[2]]] - } - }) - - return parkingTable -} - -function getTotalTime(parkingTable, targetCar) { - let totalTime = 0 - for (let i = 0; i < parkingTable[targetCar].length - 1; i += 2) { - totalTime += calculateTotalTime( - parkingTable[targetCar][i][0], - parkingTable[targetCar][i + 1][0] - ) - } - return totalTime -} - -function calculateTotalTime(time1, time2) { - const [hour1, minute1] = time1.split(':').map((val) => parseInt(val)) - const [hour2, minute2] = time2.split(':').map((val) => parseInt(val)) - - return hour2 * 60 + minute2 - (hour1 * 60 + minute1) -} - -function calculateFee(totalTime, feeInfo) { - let fee = 0 - if (feeInfo[0] >= totalTime) { - fee = feeInfo[1] - } else { - fee = - feeInfo[1] + Math.ceil((totalTime - feeInfo[0]) / feeInfo[2]) * feeInfo[3] - } - return fee -} diff --git "a/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225&12936&.js" "b/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225&12936&.js" deleted file mode 100644 index bc7b2e5..0000000 --- "a/level-2/\354\244\204-\354\204\234\353\212\224-\353\260\251\353\262\225&12936&.js" +++ /dev/null @@ -1,39 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - codeisneverodd -function solution(n, k) { - const getFactorial = n => { - const result = [1, 1, 2, ...Array(n - 2)]; - result.forEach((_, i) => { - if (i > 2) result[i] = result[i - 1] * i; - }); - return result; - }; - - const getDivision = (dividend, divisor) => { - const quotient = Math.floor(dividend / divisor); - const remainder = dividend % divisor; - return [quotient, remainder]; - }; - - const stepCount = getFactorial(n).reverse(); - - const generateSteps = (k, step) => { - const [q, r] = getDivision(k, stepCount[step]); - if (r === 0) return [q]; - return [q, ...generateSteps(r, step + 1)]; - }; - - const answer = []; - - const steps = generateSteps(k - 1, 0); - - const notUsedNums = Array.from({ length: n }, (_, i) => i + 1); - - steps.slice(1).forEach(q => { - answer.push(notUsedNums[q]); - notUsedNums.splice(q, 1); - }); - - return [...answer, ...notUsedNums]; -} diff --git "a/level-2/\354\247\235\354\247\200\354\226\264-\354\240\234\352\261\260\355\225\230\352\270\260&12973&.js" "b/level-2/\354\247\235\354\247\200\354\226\264-\354\240\234\352\261\260\355\225\230\352\270\260&12973&.js" deleted file mode 100644 index 66569b8..0000000 --- "a/level-2/\354\247\235\354\247\200\354\226\264-\354\240\234\352\261\260\355\225\230\352\270\260&12973&.js" +++ /dev/null @@ -1,47 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(s) { - var answer = -1; - let notPairStack = [] - for (let i = 0; i < s.length; i++) notPairStack[notPairStack.length - 1] === s[i] ? notPairStack.pop() : notPairStack.push(s[i]) - answer = notPairStack.length === 0 ? 1 : 0 - return answer; -} - -//정답 2 - codeisneverodd -function solution(s) { - var answer = -1; - let notPairStack = [] - notPairStack.push(s[0]) - for (let i = 1; i < s.length; i++) { - if (notPairStack[notPairStack.length - 1] === s[i]) { - notPairStack.pop() - } else { - notPairStack.push(s[i]) - } - } - answer = notPairStack.length === 0 ? 1 : 0 - return answer; -} - -//정답 3 - jaewon1676 - -function solution(s){ - let cnt = 0; // 빼준 부분을 카운트 해줍니다 - let answer; - let stack = [] - for (let i of s){ - if (stack[stack.length - 1] === i){ // 스택의 끝부분과 i를 비교합니다 - stack.pop(); - cnt++;; - } else { - stack.push(i) - } - } - - (s.length / 2 == cnt ? answer = 1 : answer = 0 ) - // s의 길이를 2로 나눠서 cnt 값이 된다면 문자열의 개수만큼 잘 잘라졌다는 뜻입니다 - return answer; - } - // 코테 1주차 5번 문제와 유사합니다. 문자열 유형을 연습하기에 좋은 문제입니다 \ No newline at end of file diff --git "a/level-2/\354\265\234\353\214\223\352\260\222\352\263\274-\354\265\234\354\206\237\352\260\222&12939&.js" "b/level-2/\354\265\234\353\214\223\352\260\222\352\263\274-\354\265\234\354\206\237\352\260\222&12939&.js" deleted file mode 100644 index d2c0a52..0000000 --- "a/level-2/\354\265\234\353\214\223\352\260\222\352\263\274-\354\265\234\354\206\237\352\260\222&12939&.js" +++ /dev/null @@ -1,40 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(s) { - var answer = ''; - const arr = s.split(' ') - answer = Math.min(...arr) + ' ' + Math.max(...arr) - return answer; -} - -//정답 2 - codeisneverodd -function solution(s) { - var answer = ''; - const arr = s.split(' ').map(x => parseInt(x, 10)).sort((a, b) => a - b) - answer = arr[0] + ' ' + arr[arr.length - 1] - return answer; -} - -//정답 3 - jaewon1676 -function solution(s) { - s = s.split(' ') - s.sort((a, b) => {return a - b}) // 오름차순 정렬 - let small = s[0] // s의 최솟값 - let large = s[s.length - 1] // s의 최댓값 - return (small + ' ' + large) -} - -//정답 4 - prove-ability -function solution(s) { - s = s.split(" ").map((v) => parseInt(v, 10)) - return `${Math.min(...s)} ${Math.max(...s)}`; -} - -//정답 5 - yongchanson -function solution(s) { - let arr = s.split(" ").sort((a, b) => a - b); - arr.splice(1, arr.length - 2, " "); - let result = arr.join(""); - return result; -} diff --git "a/level-2/\354\265\234\354\206\237\352\260\222-\353\247\214\353\223\244\352\270\260&12941&.js" "b/level-2/\354\265\234\354\206\237\352\260\222-\353\247\214\353\223\244\352\270\260&12941&.js" deleted file mode 100644 index c7bf910..0000000 --- "a/level-2/\354\265\234\354\206\237\352\260\222-\353\247\214\353\223\244\352\270\260&12941&.js" +++ /dev/null @@ -1,30 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(A, B) { - var answer = 0; - A = A.sort((a, b) => a - b) - B = B.sort((a, b) => b - a) - for (let i = 0; i < A.length; i++) answer += A[i] * B[i] - return answer; -} - -//정답 2 - prove-ability -function solution(A,B){ - let sum = 0; - A.sort((a, b) => a - b); - B.sort((a, b) => b - a); - - for(let i = 0, len = A.length; i < len; i++) { - sum += A[i] * B[i]; - } - - return sum; -} - -//정답 3 - yongchanson -function solution(A, B) { - A.sort((a, b) => a - b); - B.sort((a, b) => b - a); - return A.reduce((t, n, i) => t + n * B[i], 0); -} diff --git "a/level-2/\354\271\264\355\216\253&42842&.js" "b/level-2/\354\271\264\355\216\253&42842&.js" deleted file mode 100644 index 147962f..0000000 --- "a/level-2/\354\271\264\355\216\253&42842&.js" +++ /dev/null @@ -1,41 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(brown, yellow) { - var answer = []; - const size = brown + yellow - answer = widthHeightPair(size).filter(pair => (pair[0] + pair[1]) * 2 - 4 === brown)[0] - return answer; -} - -function widthHeightPair(size) { - let result = [] - for (let i = 1; i <= Math.sqrt(size); i++) if (size % i === 0) result.push([size / i, i]) - return result -} - -//정답 2 - jaewon1676 -function solution(brown, yellow) { - var answer = []; - let sum = brown + yellow; - - //카펫의 최소높이는 3부터이다.(테두리 갈색, 가운데 노란색) - for(let height=3; height { - const length = matrix.length; - const half = length / 2; - const pass = matrix => matrix.every(row => row.every(v => v === matrix[0][0])); - - if (pass(matrix)) return [matrix[0][0]]; - if (length <= 2) return matrix; - - const startPoints = [ - [0, 0], - [0, half], - [half, 0], - [half, half], - ]; - - return startPoints.map(([r, c]) => quad(matrix.slice(r, r + half).map(row => row.slice(c, c + half)))); - }; - return quad(arr) - .flat(Infinity) - .reduce((a, c) => (c === 0 ? [a[0] + 1, a[1]] : [a[0], a[1] + 1]), [0, 0]); -} diff --git "a/level-2/\355\201\260-\354\210\230-\353\247\214\353\223\244\352\270\260&42883&.js" "b/level-2/\355\201\260-\354\210\230-\353\247\214\353\223\244\352\270\260&42883&.js" deleted file mode 100644 index 1bedf83..0000000 --- "a/level-2/\355\201\260-\354\210\230-\353\247\214\353\223\244\352\270\260&42883&.js" +++ /dev/null @@ -1,36 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(number, k) { - var answer = ''; - let answerStack = [0] - let deleteCount = -1 - for (let i = 0; i < number.length; i++) { - while (deleteCount < k && number[i] > answerStack[answerStack.length - 1]) { - answerStack.pop() - deleteCount++ - } - if (answerStack.length < number.length - k) answerStack.push(number[i]) - } - answer = answerStack.join('') - return answer; -} - -//정답 4 - jaewon1676 -function solution(number, k) { - const stack = []; - let answer = ''; - - for(let i=0; i 0 && stack[stack.length-1] < el){ - stack.pop(); - k--; - } - stack.push(el); - } - stack.splice(stack.length-k, k); - answer = stack.join(""); - return answer; -} - \ No newline at end of file diff --git "a/level-2/\355\203\200\352\262\237-\353\204\230\353\262\204&43165&.js" "b/level-2/\355\203\200\352\262\237-\353\204\230\353\262\204&43165&.js" deleted file mode 100644 index 4120a91..0000000 --- "a/level-2/\355\203\200\352\262\237-\353\204\230\353\262\204&43165&.js" +++ /dev/null @@ -1,46 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1(🎩 refactor 220830) - codeisneverodd -function solution(numbers, target) { - const dfs = (index, sum) => { - if (index === numbers.length) return sum === target ? 1 : 0; - return dfs(index + 1, sum + numbers[index]) + dfs(index + 1, sum - numbers[index]); - }; - return dfs(0, 0); -} - -//정답 2 - ssi02014 -function solution(numbers, target) { - let answer = 0; - - dfs(0, 0); - return answer; - - function dfs(index, sum) { - // 재귀 종료 - if (index === numbers.length) { - if (sum === target) { - answer++; - } - return; - } - - dfs(index + 1, sum + numbers[index]); - dfs(index + 1, sum - numbers[index]); - } -} - -//정답 3 - codeisneverodd -function solution(numbers, target) { - var answer = 0; - const binaryLength = numbers.length; - const binary = 2 ** binaryLength; - for (let i = 0; i < binary; i++) { - const numSlice = numbers.slice(); - const binaryString = i.toString(2).padStart(binaryLength, '0'); - for (let j = 0; j < binaryString.length; j++) binaryString[j] === '0' ? (numSlice[j] *= -1) : null; - const calculated = numSlice.reduce((prev, current) => prev + current); - if (calculated === target) answer += 1; - } - return answer; -} diff --git "a/level-2/\355\212\234\355\224\214&64065&.js" "b/level-2/\355\212\234\355\224\214&64065&.js" deleted file mode 100644 index bcdce86..0000000 --- "a/level-2/\355\212\234\355\224\214&64065&.js" +++ /dev/null @@ -1,33 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(s) { - var answer = []; - let sets = s - .slice(2, -2) - .split('},{') - .map(set => set.split(',').map(x => parseInt(x))) - .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 diff --git "a/level-2/\355\224\204\353\246\260\355\204\260&42587&.js" "b/level-2/\355\224\204\353\246\260\355\204\260&42587&.js" deleted file mode 100644 index d29b243..0000000 --- "a/level-2/\355\224\204\353\246\260\355\204\260&42587&.js" +++ /dev/null @@ -1,136 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(priorities, location) { - var answer = 0; - let documents = priorities.map((priority, index) => ({location: index, priority: priority})) - let locationPrinted = false - while (!locationPrinted) { - const shifted = documents.shift() - let printAvailable = true - if (documents.some((document) => shifted.priority < document.priority)) printAvailable = false - if (printAvailable) { - answer += 1 - if (shifted.location === location) locationPrinted = true - } else { - documents.push(shifted) - } - } - return answer; -} - -//정답 2 - codeisneverodd -function solution(priorities, location) { - var answer = 0; - let documents = priorities.map((priority, documentLocation) => [documentLocation, priority]) - let locationPrinted = false - while (!locationPrinted) { - const shifted = documents.shift() - let printAvailable = true - for (let i = 0; i < documents.length; i++) { - if (shifted[1] < documents[i][1]) { - printAvailable = false - break - } - } - if (printAvailable) { - answer += 1 - if (shifted[0] === location) locationPrinted = true - } else { - documents.push(shifted) - } - } - return answer; -} - -//정답 3 - jaewon1676 -function solution(priorities, location) { - var answer = 0; - while (true) { - - if (priorities[0] < Math.max(...priorities)) { - if (location - 1 < 0) location = priorities.length - priorities.push(priorities.shift()) - location--; - } else { - answer++; - if (location - 1 < 0) { - return answer; - } - priorities.shift() - location--; - } - console.log(priorities, location, answer) - - } - return answer -} - -// 정답 4 - createhb21 -function solution(priorities, location) { - var answer = priorities.map((priority, index) => { - return { - index, - priority - }; - }); - - let queue = []; - - while(answer.length > 0){ - const first = answer.shift(); - const isPriority = answer.some((p) => p.priority > first.priority); - isPriority ? answer.push(first) : queue.push(first); - } - const idx = queue.findIndex(p => p.index === location) + 1; - return idx; - } - -//정답 5 - codeisneverodd -//shift를 사용하지 않고 queue를 구현한 풀이를 추가합니다. -function solution(priorities, location) { - let answer = 0; - const printer = new Queue; - priorities.forEach((priority, index) => { - printer.enqueue([priority, index]) - }) - while (printer.size() > 0) { - const check = printer.dequeue() - const countHigherPriority = printer.queue.filter(x => x[0] > check[0]).length - if (countHigherPriority > 0) { - printer.enqueue(check) - } else { - answer += 1 - if (check[1] === location) break - } - - } - return answer; -} - -class Queue { - constructor() { - this.queue = [] - this.front = 0 - this.rear = 0 - } - - enqueue(value) { - this.queue[this.rear++] = value - } - - dequeue() { - const value = this.queue[this.front] - delete this.queue[this.front] - this.front += 1 - return value - } - - peek() { - return this.queue(this.front) - } - - size() { - return this.rear - this.front - } -} diff --git "a/level-2/\355\224\274\353\241\234\353\217\204&87946&.js" "b/level-2/\355\224\274\353\241\234\353\217\204&87946&.js" deleted file mode 100644 index 94a234d..0000000 --- "a/level-2/\355\224\274\353\241\234\353\217\204&87946&.js" +++ /dev/null @@ -1,28 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - pereng11 -//완전 탐색, greedy O(N^2) -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; -} - - - diff --git "a/level-2/\355\224\274\353\263\264\353\202\230\354\271\230-\354\210\230&12945&.js" "b/level-2/\355\224\274\353\263\264\353\202\230\354\271\230-\354\210\230&12945&.js" deleted file mode 100644 index ec16495..0000000 --- "a/level-2/\355\224\274\353\263\264\353\202\230\354\271\230-\354\210\230&12945&.js" +++ /dev/null @@ -1,30 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - var answer = 0; - answer = fibonacci1234567(n) - return answer; -} - -function fibonacci1234567(n) { //재귀적으로 하면 시간초과 - let fiboArr = new Array(n + 1).fill(0) - fiboArr[0] = 0 - fiboArr[1] = 1 - for (let i = 2; i <= n; i++) fiboArr[i] = (fiboArr[i - 1] + fiboArr[i - 2]) % 1234567 //1234567로 나눈 나머지로 하지 않으면 정수범위 초과 - return fiboArr[n] -} - -//정답 2 - jaewon1676 -function solution(n) { - let f_1 = 0; - let f_2 = 1; - - for (let i=2; i<=n; i++) { - let temp = (f_1 + f_2) % 1234567; - f_1 = f_2; - f_2 = temp; - } - - return f_2; -} \ No newline at end of file diff --git "a/level-2/\355\225\230\353\205\270\354\235\264\354\235\230-\355\203\221&12946&.js" "b/level-2/\355\225\230\353\205\270\354\235\264\354\235\230-\355\203\221&12946&.js" deleted file mode 100644 index 5b57c2d..0000000 --- "a/level-2/\355\225\230\353\205\270\354\235\264\354\235\230-\355\203\221&12946&.js" +++ /dev/null @@ -1,28 +0,0 @@ -//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(경유지)로 작성되어있음. -*/ diff --git "a/level-2/\355\226\211\353\240\254-\355\205\214\353\221\220\353\246\254-\355\232\214\354\240\204\355\225\230\352\270\260&77485&.js" "b/level-2/\355\226\211\353\240\254-\355\205\214\353\221\220\353\246\254-\355\232\214\354\240\204\355\225\230\352\270\260&77485&.js" deleted file mode 100644 index 0a90412..0000000 --- "a/level-2/\355\226\211\353\240\254-\355\205\214\353\221\220\353\246\254-\355\232\214\354\240\204\355\225\230\352\270\260&77485&.js" +++ /dev/null @@ -1,27 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(rows, columns, queries) { - var answer = []; - let matrix = new Array(rows) - for (let i = 0; i < rows; i++) matrix[i] = new Array(columns) - for (let i = 0; i < rows; i++) for (let j = 0; j < columns; j++) matrix[i][j] = i * columns + j + 1 - for (const query of queries) { - let order = [] - const [row1, col1, row2, col2] = [query[0] - 1, query[1] - 1, query[2] - 1, query[3] - 1] - //fill order (row1->row2, col1->col2, row2->row2, col2->col1) - for (let i = row1; i <= row2; i++) order.push(matrix[i][col1]) - for (let i = col1 + 1; i <= col2; i++) order.push(matrix[row2][i]) - for (let i = row2 - 1; i >= row1; i--) order.push(matrix[i][col2]) - for (let i = col2 - 1; i > col1; i--) order.push(matrix[row1][i]) - //rotate clockwise - order.push(order.shift()) - answer.push(Math.min(...order)) - //change value in matrix - for (let i = row1; i <= row2; i++) matrix[i][col1] = order.shift() - for (let i = col1 + 1; i <= col2; i++) matrix[row2][i] = order.shift() - for (let i = row2 - 1; i >= row1; i--) matrix[i][col2] = order.shift() - for (let i = col2 - 1; i > col1; i--) matrix[row1][i] = order.shift() - } - return answer; -} \ No newline at end of file diff --git "a/level-2/\355\226\211\353\240\254\354\235\230-\352\263\261\354\205\210&12949&.js" "b/level-2/\355\226\211\353\240\254\354\235\230-\352\263\261\354\205\210&12949&.js" deleted file mode 100644 index fb1e167..0000000 --- "a/level-2/\355\226\211\353\240\254\354\235\230-\352\263\261\354\205\210&12949&.js" +++ /dev/null @@ -1,33 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(arr1, arr2) { - const [row, col] = [arr1.length, arr2[0].length] - let answer = new Array(row); - for (let i = 0; i < row; i++) answer[i] = new Array(col) - //arr1의 열의 개수 = arr2의 행의 개수, arr1의 i번째 행과 arr2의 j번째 열의 원소들을 곱한 것들의 합이 answer[i][j] 값 - for (let i = 0; i < row; i++) { - for (let j = 0; j < col; j++) { - answer[i][j] = arr1[i].reduce((sum, arr1Value, rowIndex) => sum + arr1Value * arr2[rowIndex][j], 0) - } - } - return answer; -} - -//정답 2 - prove-ability -function solution(arr1, arr2) { - var answer = []; - // 행만큼 반복 - for(let i = 0, len = arr1.length; i < len; i++) { - const arr = [] - // 열만큼 반복 - for(let j = 0, len = arr1[i].length; j < len; j++) { - // 각의 배열에서 행을 더해서 arr push - arr.push(arr1[i][j] + arr2[i][j]) - } - // 열 만큼 추가된 arr 를 answer 가 추가 - answer.push(arr) - } - - return answer; -} \ No newline at end of file diff --git "a/level-2/\355\233\204\353\263\264\355\202\244&42890&.js" "b/level-2/\355\233\204\353\263\264\355\202\244&42890&.js" deleted file mode 100644 index b0d86e8..0000000 --- "a/level-2/\355\233\204\353\263\264\355\202\244&42890&.js" +++ /dev/null @@ -1,50 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(relation) { - //1. 가능한 조합을 1개~Attribute개수 만큼 찾는다. - //2. 해당 개수의 조합이 키가 될 수 있는지 검사하고, 가능하면 후보키에 추가한다. - //3. 단 추가하려고 할 때, 후보키에 있는 값이 자신의 부분 집합이 될 수 있으면 추가하지 않는다. - const keys = [] - const totalAttrCount = relation[0].length - const indexList = Array.from(Array(totalAttrCount), (x, index) => index) // [0,1,2,3 ... totalAttrCount-1] - - //Fn for 2. 해당 조합으로 각 row의 attribute를 모았을 때 중복이 있는지를 반환하는 함수 - const isUnique = (relation, attrIndexComb) => { - let result = Array.from(Array(relation.length), x => '') - for (const attrIndex of attrIndexComb) { - relation.forEach((row, rowIndex) => result[rowIndex] += row[attrIndex]) //Set를 이용해 중복 검사를 하기 위해 result에 string으로 넣음. - } - return result.length === [...new Set(result)].length - } - - //Fn for 3. keys에 현재 구한 검사할 조합의 부분집합이 존재하는지 반환, 단 keys에 들어있는 각 조합의 크기는 현재 검사할 조합의 크기보다 작다. - const isMinimal = (attrComb) => { - for (const key of keys) if (key.every(attr => attrComb.includes(attr))) return false - return true - } - - //가능한 모든 조합을 검사 - for (let attrCount = 1; attrCount <= totalAttrCount; attrCount++) { - const combinations = getCombinations(indexList, attrCount) - for (const attrComb of combinations) { - if (isMinimal(attrComb) && isUnique(relation, attrComb)) keys.push(attrComb) - } - } - - return keys.length -} - -//Fn for 1. 조합을 반환하는 함수 -const getCombinations = (array, selectNumber) => { - const result = []; - if (selectNumber === 1) { - return array.map((element) => [element]); - } - array.forEach((fixed, index, origin) => { - const restCombinations = getCombinations(origin.slice(index + 1), selectNumber - 1); - const attached = restCombinations.map((restCombination) => [fixed, ...restCombination]); - result.push(...attached); - }); - return result; -} diff --git "a/level-3/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" "b/level-3/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" deleted file mode 100644 index 86a6c59..0000000 --- "a/level-3/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - 본인의 깃허브 아이디 -function solution(n) { - //프로그래머스에 제출하여 통과된 함수를 복사 붙여넣기 해주세요! -} - -//정답 2 - 본인의 깃허브 아이디 -function solution(n) { - //정답을 다른 방법으로도 작성했다면 추가해 주세요! -} diff --git "a/level-3/2-x-n-\355\203\200\354\235\274\353\247\201&12900&.js" "b/level-3/2-x-n-\355\203\200\354\235\274\353\247\201&12900&.js" deleted file mode 100644 index aeacf60..0000000 --- "a/level-3/2-x-n-\355\203\200\354\235\274\353\247\201&12900&.js" +++ /dev/null @@ -1,16 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - jaewon1676 -function solution(n) { - let dp = [0, 1, 2] // n이 1, 2일때는 바로 답을 출력, - if (n>2){ // n이 3 이상이면 필요한 만큼의 수 까지만 수를 만들어준다. - for (let i=3; i<=n; i++){ - dp.push((dp[i-1] + dp[i-2]) % 1000000007); - } - } - return dp[n] -} -/* -n이 1일땐 1, 2일땐 2, 3일땐 3, 4일땐 5 . . 의 식이 보인다. -n = (n - 1) + (n - 2)의 식으로 구할 수 있고, -제한 사항을 주의해서 풀어보자. */ \ No newline at end of file diff --git a/level-3/N-Queen&12952&.js b/level-3/N-Queen&12952&.js deleted file mode 100644 index 8d36ad5..0000000 --- a/level-3/N-Queen&12952&.js +++ /dev/null @@ -1,39 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n) { - /* - 1. 0번째 행에 0번째 queen을 놓는다. - 2. 그 다음 행의 퀸은 이전 퀸들의 범위와 겹치지 않는 곳에 놓는다. 퀸은 한 행에 반드시 하나 두어야한다. - 3. 마지막 열까지 도달하면 성공으로 간주하고 answer에 1을 더한다. - 4. 0번째 queen의 위치를 바꿔가며 모두 시도한다. - 4. 단, 체스판은 일차원 배열로 선언하고 index = 행, 값 = 열 로 생각한다. - */ - let answer = 0; - const canBePlacedOn = (chess, currentRow) => { - //해당 행에 둔 queen이 유효한지 - for (let prevRow = 0; prevRow < currentRow; prevRow++) { - const onDiagonal = currentRow - prevRow === Math.abs(chess[currentRow] - chess[prevRow]) - const onStraight = chess[prevRow] === chess[currentRow] - if (onDiagonal || onStraight) return false - } - return true - } - const placeQueen = (chess, currentRow) => { - //queen을 배치하다가 끝 행에 도착하면 1을 리턴, 도착하지 못하면 0을 리턴하여, 재귀적으로 모든 경우를 합하여 리턴 - let count = 0 - if (currentRow === chess.length) return 1 - for (let currentQueen = 0; currentQueen < n; currentQueen++) { - //queen을 우선 배치한 후 가능한지 살펴본다. - chess[currentRow] = currentQueen - if (canBePlacedOn(chess, currentRow)) count += placeQueen(chess, currentRow + 1) - } - return count - } - for (let firstQueen = 0; firstQueen < n; firstQueen++) { - const chess = new Array(n).fill(-1) - chess[0] = firstQueen - answer += placeQueen(chess, 1) - } - return answer; -} \ No newline at end of file diff --git "a/level-3/\352\260\200\354\236\245-\353\250\274-\353\205\270\353\223\234&49189&.js" "b/level-3/\352\260\200\354\236\245-\353\250\274-\353\205\270\353\223\234&49189&.js" deleted file mode 100644 index f454cf7..0000000 --- "a/level-3/\352\260\200\354\236\245-\353\250\274-\353\205\270\353\223\234&49189&.js" +++ /dev/null @@ -1,23 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n, edge) { - const graph = Array.from(Array(n + 1), () => []) - for (const [src, dest] of edge) { - graph[src].push(dest) - graph[dest].push(src) - } - const distance = Array(n + 1).fill(0) - distance[1] = 1 - const toBeSearched = [1] - while (toBeSearched.length > 0) { - const src = toBeSearched.shift() - for (const dest of graph[src]) { - if (distance[dest] === 0) { - distance[dest] = distance[src] + 1 - toBeSearched.push(dest) - } - } - } - return distance.filter(x => x === Math.max(...distance)).length -} \ No newline at end of file diff --git "a/level-3/\353\204\244\355\212\270\354\233\214\355\201\254&43162&.js" "b/level-3/\353\204\244\355\212\270\354\233\214\355\201\254&43162&.js" deleted file mode 100644 index a4fa59d..0000000 --- "a/level-3/\353\204\244\355\212\270\354\233\214\355\201\254&43162&.js" +++ /dev/null @@ -1,30 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n, computers) { - let answer = 0 - const visited = new Array(n).fill(false) - const newNetwork = (startComputer) => { - //새로운 네트워크를 만들 시작 컴퓨터를 파라미터로 받는다. - const toBeVisited = [startComputer] - while (toBeVisited.length > 0) { - //시작 컴퓨터로부터 방문 가능한 컴퓨터를 모두 방문하며 해당 컴퓨터의 visited를 true로 바꾼다 - const currentComputer = toBeVisited.pop() - visited[currentComputer] = true - for (let nextComputer = 0; nextComputer < n; nextComputer++) { - if (!visited[nextComputer] && computers[currentComputer][nextComputer]) { - toBeVisited.push(nextComputer) - } - } - } - } - - for (let startComputer = 0; startComputer < n; startComputer++) { - if (!visited[startComputer]) { - newNetwork(startComputer) - //새로운 네트워크를 생성할 때마다 정답을 1 증가시킨다. - answer++ - } - } - return answer -} \ No newline at end of file diff --git "a/level-3/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274&42884&.js" "b/level-3/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274&42884&.js" deleted file mode 100644 index eb6f1b4..0000000 --- "a/level-3/\353\213\250\354\206\215\354\271\264\353\251\224\353\235\274&42884&.js" +++ /dev/null @@ -1,34 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - jaewon1676 -function solution(routes) { - let cctv = 1; // cctv의 개수는 최소 1개 - routes.sort((a, b) => a[0] - b[0]); // 고속도로 진입 시점을 기준으로 오름차순 정렬 - // [ [ -20, -15 ], [ -18, -13 ], [ -14, -5 ], [ -5, -3 ] ] - let out = routes[0][1]; // -15 - // 나간 시점(out)은 첫 차량의 나간시점으로 초기화 - - for(let i = 1; i < routes.length; i++) { - // 나간 시점(out)보다 현재 차량의 진입이 느리다면 카메라 추가 설치 - if(out < routes[i][0]) { - cctv++; - out = routes[i][1]; // out 시점 업데이트 - } - - // 나간 시점(out)이 현재 차량의 진출시점보다 큰 경우 - if(out > routes[i][1]) { - out = routes[i][1]; // out 시점 업데이트 - } - } - - return cctv; -} -// 그리디 - -// 우리는 카메라를 최소로 설치 해야합니다. 그러기 위해서는 고속도로 진입 시점을 기준으로 오름차순 정렬을(빨리 진입한 순) 합니다. -// 이렇게 되면 배열에 있는 모든 고속도로 진입 시점은 배열의 첫번째 고속도로 진입 시점보다 더 뒤에 있습니다. 그러므로 우리는 -// 나간시점만 검사 해주면 됩니다. - -// 먼저 첫번째 routes의 고속도로를 빠져나간 시점을 out 변수에 담아줍니다. -// 이 out 변수를 두번째 routes의 고속도로를 빠져나간 시점과 비교하여 out 변수보다 route[i][1]가 크면 ( 나간 시간이 느리면) -// cctv를 하나 늘려줍니다. , out 변수를 갱신 하며 세번째, 네번째도 계속 비교해줍니다. \ No newline at end of file diff --git "a/level-3/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224&42579&.js" "b/level-3/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224&42579&.js" deleted file mode 100644 index 5b45d5b..0000000 --- "a/level-3/\353\262\240\354\212\244\355\212\270\354\225\250\353\262\224&42579&.js" +++ /dev/null @@ -1,48 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(genres, plays) { - var answer = []; - const songs = [] - const genreSumHash = {} - const genreSumArr = [] - - //고유번호, 장르, 플레이수를 담은 songs - genres.forEach((genre, id) => { - songs.push({id: id, genre: genre, play: plays[id]}) - genreSumHash[genre] = genreSumHash[genre] === undefined ? plays[id] : genreSumHash[genre] + plays[id] - }) - - //장르별 플레이수 합으로 정렬하기 위해 생성한 배열 genreSumArr - for (const genre in genreSumHash) genreSumArr.push([genre, genreSumHash[genre]]) - genreSumArr.sort((a, b) => b[1] - a[1]) - - //각 장르안에서 각 노래의 play수가 높은 순으로 정렬하고 앞에서부터 2개까지 정답에 고유번호를 push - for (const genre of genreSumArr) { - const sorted = songs.filter(song => song.genre === genre[0]).sort((a, b) => b.play - a.play) - for (let i = 0; i < 2 && i < sorted.length; i++) answer.push(sorted[i].id) - } - return answer; -} - -//정답 2 - codeisneverodd -//Map과 고차함수를 적극적으로 이용한 풀이 -function solution(genres, plays) { - const genreMap = new Map(); // {genre:{totalPlay:number, songs:[{play:number, id:number}, ...]} - genres - .map((genre, id) => [genre, plays[id]]) - .forEach(([genre, play], id) => { - const data = genreMap.get(genre) || {totalPlay: 0, songs: []} - genreMap.set(genre, { - totalPlay: data.totalPlay + play, - songs: [...data.songs, {play: play, id: id}] - .sort((a, b) => b.play - a.play) - .slice(0, 2) - }) - }) - - return [...genreMap.entries()] //entries => [[genre, {totalPlay, songs}], ...] - .sort((a, b) => b[1].totalPlay - a[1].totalPlay) - .flatMap(item => item[1].songs) // [[songs], [songs]] => [songs, songs] - .map(song => song.id) -} \ No newline at end of file diff --git "a/level-3/\354\227\254\355\226\211\352\262\275\353\241\234&43164&.js" "b/level-3/\354\227\254\355\226\211\352\262\275\353\241\234&43164&.js" deleted file mode 100644 index 2317d7b..0000000 --- "a/level-3/\354\227\254\355\226\211\352\262\275\353\241\234&43164&.js" +++ /dev/null @@ -1,24 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(tickets) { - const routes = [] //최종 가능 루트들을 담을 배열 - const makeRoutes = (currentDepart, remainTickets, currentRoute) => { - //현재 출발지, 남은 티켓들, 현재 까지 만든 루트를 기반으로 경로를 만들어 가는 재귀 함수 - if (remainTickets.length > 0) { - remainTickets.forEach(([depart, nextDepart], index) => { - if (depart === currentDepart) - //현재 출발지와 같은 출발지를 가진 티켓이 있다면, 해당 티켓을 사용하고 해당 티켓의 도착지를 다음 출발지로 지정 - makeRoutes( - nextDepart, - [...remainTickets.slice(0, index), ...remainTickets.slice(index + 1)], - [...currentRoute, currentDepart]) - }) - } else { - //티켓을 모두 사용하면 최종 가능 루트에 포함 - routes.push([...currentRoute, currentDepart]) - } - } - makeRoutes("ICN", tickets, []) - return routes.sort()[0] -} \ No newline at end of file diff --git "a/level-3/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220&42628&.js" "b/level-3/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220&42628&.js" deleted file mode 100644 index 560abe0..0000000 --- "a/level-3/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220&42628&.js" +++ /dev/null @@ -1,34 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - jaewon1676 -function solution(operations) { - var answer = []; - for (let i = 0; i < operations.length; i++) { - // 숫자 삽입 - if (operations[i][0] == 'I') { - let m = operations[i].substring(2, operations[i].length); - answer.push(m); - } - // if 최댓값 삭제 - else if (operations[i][0] == 'D' && operations[i][2] == '1' && operations.length > 0) { - answer.pop(); - } - // if 최솟값 삭제 - else if (operations[i][0] == 'D' && operations[i][2] == '-' && operations[i][3] == '1' && operations.length > 0) { - answer.shift(); - } - - answer.sort((a, b) => { - return a - b; - }); - } - if (answer.length == 0) return [0, 0]; - else { - return [parseInt(answer.pop()), parseInt(answer.shift())]; - } -} -/* 풀이 과정 -1. 연산 처리를 구별하기 위해 배열의 0번째 자리, 2번째 자리에 있는 등을 비교하여 조건에 따른 명령을 실행한다. -2. answer 배열을 정렬 해준다 -3. 큐가 비어있으면 ( length == 0 ) 0을 반환. , 그렇지 않으면 [최댓값, 최솟값]을 반환한다. -*/ diff --git "a/level-3/\354\236\205\352\265\255\354\213\254\354\202\254&43238&.js" "b/level-3/\354\236\205\352\265\255\354\213\254\354\202\254&43238&.js" deleted file mode 100644 index 0a93d02..0000000 --- "a/level-3/\354\236\205\352\265\255\354\213\254\354\202\254&43238&.js" +++ /dev/null @@ -1,19 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -function solution(n, times) { - //최소로 걸릴 수 있는 시간 left, 최대로 걸릴 수 있는 시간 right - let [left, right] = [1, Math.max(...times) * n]; - while (left <= right) { - const mid = Math.floor((left + right) / 2); - const sum = times.reduce((acc, time) => acc + Math.floor(mid / time), 0); - //sum은 mid 시간 동안 처리 할 수 있는 사람의 수 - if (sum < n) { - left = mid + 1; - } else { - right = mid - 1; - } - } - // left 가 right를 넘어갔다는 것은 left가 n보다 크거나 같아져서 n명을 수용할 수 최소값이 되있다는 것이다. - return left; -} diff --git "a/level-4/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" "b/level-4/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" deleted file mode 100644 index 86a6c59..0000000 --- "a/level-4/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - 본인의 깃허브 아이디 -function solution(n) { - //프로그래머스에 제출하여 통과된 함수를 복사 붙여넣기 해주세요! -} - -//정답 2 - 본인의 깃허브 아이디 -function solution(n) { - //정답을 다른 방법으로도 작성했다면 추가해 주세요! -} diff --git "a/level-4/\352\260\200\354\202\254-\352\262\200\354\203\211&60060&.js" "b/level-4/\352\260\200\354\202\254-\352\262\200\354\203\211&60060&.js" deleted file mode 100644 index 77e4b6e..0000000 --- "a/level-4/\352\260\200\354\202\254-\352\262\200\354\203\211&60060&.js" +++ /dev/null @@ -1,73 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - ryong9rrr -class Node { - constructor(value = '') { - this.value = value - this.children = new Map() - this.count = 0 - } -} - -class Trie { - constructor() { - this.root = new Node() - } - - insert(string) { - let currentNode = this.root - for (const char of string) { - if (!currentNode.children.has(char)) { - currentNode.children.set(char, new Node(currentNode.value + char)) - } - currentNode = currentNode.children.get(char) - currentNode.count++ - } - } - - startsWithCount(prefix) { - let currentNode = this.root - for (const char of prefix) { - if (!currentNode.children.has(char)) { - return 0 - } - currentNode = currentNode.children.get(char) - } - return currentNode.count - } -} - -function reverseString(string) { - return [...string].reverse().join('') -} - -function solution(words, queries) { - const table = {} - const reverseTable = {} - const counter = {} - - words.forEach((word) => { - const key = word.length - if (!table[key]) table[key] = new Trie() - if (!reverseTable[key]) reverseTable[key] = new Trie() - table[key].insert(word) - reverseTable[key].insert(reverseString(word)) - if (counter[key] === undefined) counter[key] = 0 - counter[key]++ - }) - - return queries.map((query) => { - const key = query.length - if (!table[key]) { - return 0 - } - const tQuery = query.replace(/\?/g, '') - if (!tQuery) { - return counter[key] - } - if (query[query.length - 1] === '?') { - return table[key].startsWithCount(tQuery) - } - return reverseTable[key].startsWithCount(reverseString(tQuery)) - }) -} \ No newline at end of file diff --git "a/level-4/\353\213\250\354\226\264-\355\215\274\354\246\220&12983&.js" "b/level-4/\353\213\250\354\226\264-\355\215\274\354\246\220&12983&.js" deleted file mode 100644 index ce5fae8..0000000 --- "a/level-4/\353\213\250\354\226\264-\355\215\274\354\246\220&12983&.js" +++ /dev/null @@ -1,31 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - codeisneverodd -//코드 참고자료: https://velog.io/@longroadhome/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-LV.4-%EB%8B%A8%EC%96%B4-%ED%8D%BC%EC%A6%90 -function solution(strs, t) { - const tLength = t.length; //자주 쓰는 값 미리 계산 - //Infinity 로 선언을 해야 조합이 불가능한 영역의 값을 무한으로 두고, 그 영역에 하나를 더해도 불가능하다는 것을 Infinity로 표현할 수 있게 된다. - const minCountToIndex = new Array(tLength).fill(Infinity); - for (let currentIndex = 0; currentIndex < tLength; currentIndex++) { - //내가 검사할 부분은 t의 0~currentIndex 영역 - const currentSlice = t.slice(0, currentIndex + 1); - for (const str of strs) { - //현재 영역이 strs에 있는 조각들 중 하나로 끝난다면 - if (currentSlice.endsWith(str)) { - //frontLength 는 str 조각을 제외한 앞 쪽의 남은 조각의 길이 - const frontLength = currentIndex - str.length + 1; - if (frontLength === 0) { - //앞쪽에 남은 것이 없다면, 현재 검사중인 영역 = strs에 있는 조각 - minCountToIndex[currentIndex] = 1; - } else { - //앞쪽에 남은 것이 있다면, 현재 검사중이 영역까지 필요한 조각 수는, 지금까지 구한 최소 값과 지금 구한 값 중 최소값 - minCountToIndex[currentIndex] = Math.min(minCountToIndex[currentIndex], minCountToIndex[frontLength - 1] + 1); - } - } - } - } - //마지막 영역이 Infinity 이면 만들기 불가능한 단어, 아니라면 마지막 영역의 값을 리턴 - return minCountToIndex[tLength - 1] === Infinity ? -1 : minCountToIndex[tLength - 1]; -} - -//리드미 테스트용 코멘트 diff --git "a/level-4/\353\254\264\354\247\200\354\235\230-\353\250\271\353\260\251-\353\235\274\354\235\264\353\270\214&42891&.js" "b/level-4/\353\254\264\354\247\200\354\235\230-\353\250\271\353\260\251-\353\235\274\354\235\264\353\270\214&42891&.js" deleted file mode 100644 index 54b4060..0000000 --- "a/level-4/\353\254\264\354\247\200\354\235\230-\353\250\271\353\260\251-\353\235\274\354\235\264\353\270\214&42891&.js" +++ /dev/null @@ -1,30 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//더 좋은 풀이가 존재할 수 있습니다. -//정답 1 - ryong9rrr -function solution(food_times, k) { - const total = food_times.reduce((a, b) => a + b) - if (total <= k) { - return -1 - } - - // stack으로 풀기 - const stack = food_times.map((time, i) => [time, i + 1]).sort(([timeA], [timeB]) => timeB - timeA) - - let prev = 0 - while (stack.length > 0 && k >= 0) { - const [time] = stack[stack.length - 1] - const acc = (time - prev) * stack.length - if (k < acc) { - break - } - stack.pop() - k -= acc - prev = time - } - - const result = stack - .reverse() - .map(([_, order]) => order) - .sort((orderA, orderB) => orderA - orderB) - return result[k % result.length] -} \ No newline at end of file diff --git "a/level-4/\354\230\254\353\260\224\353\245\270-\352\264\204\355\230\270\354\235\230-\352\260\257\354\210\230&12929&.js" "b/level-4/\354\230\254\353\260\224\353\245\270-\352\264\204\355\230\270\354\235\230-\352\260\257\354\210\230&12929&.js" deleted file mode 100644 index 168bc5f..0000000 --- "a/level-4/\354\230\254\353\260\224\353\245\270-\352\264\204\355\230\270\354\235\230-\352\260\257\354\210\230&12929&.js" +++ /dev/null @@ -1,7 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - cg10036 -function solution(n) { - const fact = n => n ? BigInt(n) * fact(n - 1) : 1n; - return fact(n * 2) / (fact(n) * fact(n + 1)); -} diff --git "a/level-5/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" "b/level-5/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" deleted file mode 100644 index c6c966a..0000000 --- "a/level-5/00-\355\225\264\353\213\265-\354\230\210\354\213\234.js" +++ /dev/null @@ -1,11 +0,0 @@ -//https://github.com/codeisneverodd/programmers-coding-test -//완벽한 정답이 아닙니다. -//정답 1 - 본인의 깃허브 아이디 -function solution(n) { - //프로그래머스에 제출하여 통과된 함수를 복사 붙여넣기 해주세요! -} - -//정답 2 - 본인의 깃허브 아이디 -function solution(n) { - //정답을 다른 방법으로도 작성했다면 추가해 주세요! -} \ No newline at end of file diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..a843cbe --- /dev/null +++ b/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, +} + +module.exports = nextConfig diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index defa49e..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2319 +0,0 @@ -{ - "name": "programmers-coding-test", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "programmers-coding-test", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "axios": "^1.1.2", - "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/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", - "integrity": "sha512-bznQyETwElsXl2RK7HLLwb5GPpOLlycxHCtrpDR/4RqqBzjARaOTo3jz4IgtntWUYee7Ne4S8UHd92VCuzPaWA==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "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", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dependencies": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", - "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", - "dependencies": { - "css-select": "^4.3.0", - "css-what": "^6.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.3.1", - "domutils": "^2.8.0" - }, - "funding": { - "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/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "engines": { - "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/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "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", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "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", - "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "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/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "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", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "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/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.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", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.3.tgz", - "integrity": "sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "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": { - "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", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dependencies": { - "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", - "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/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "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", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "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 - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.2.tgz", - "integrity": "sha512-bznQyETwElsXl2RK7HLLwb5GPpOLlycxHCtrpDR/4RqqBzjARaOTo3jz4IgtntWUYee7Ne4S8UHd92VCuzPaWA==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "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", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - } - }, - "cheerio-select": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", - "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", - "requires": { - "css-select": "^4.3.0", - "css-what": "^6.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.3.1", - "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 - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "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", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "data-uri-to-buffer": { - "version": "4.0.0", - "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" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "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", - "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", - "requires": { - "node-domexception": "^1.0.0", - "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" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "requires": { - "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", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "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" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "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", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" - }, - "node-fetch": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.3.tgz", - "integrity": "sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA==", - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "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", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "requires": { - "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", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "requires": { - "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==" - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "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 b2b5bef..ee967dc 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,52 @@ { - "name": "programmers-coding-test", - "version": "1.0.0", - "description": "🌱 프로그래머스의 [코딩테스트 문제]", - "type": "module", + "name": "solution-pass-search", + "version": "0.1.0", + "private": true, "scripts": { - "build": "node ./utils/build.js", - "prepare": "husky install" + "dev": "next dev -p 3003", + "build": "next build", + "start": "next start", + "lint": "next lint && tsc --noemit", + "prepare": "husky install", + "pre-commit": "yarn lint" }, - "repository": { - "type": "git", - "url": "git+https://github.com/codeisneverodd/programmers-coding-test.git" - }, - "author": "cruelladevil ", - "license": "MIT", - "bugs": { - "url": "https://github.com/codeisneverodd/programmers-coding-test/issues" - }, - "homepage": "https://github.com/codeisneverodd/programmers-coding-test#readme", "dependencies": { - "axios": "^1.1.2", - "cheerio": "^1.0.0-rc.10", - "node-fetch": "^3.2.3", - "prettier": "^2.7.1" + "@chakra-ui/react": "^2.5.1", + "@emotion/react": "^11.10.6", + "@emotion/styled": "^11.10.6", + "@fortawesome/fontawesome-svg-core": "^6.3.0", + "@fortawesome/free-regular-svg-icons": "^6.3.0", + "@fortawesome/free-solid-svg-icons": "^6.3.0", + "@fortawesome/react-fontawesome": "^0.2.0", + "@tanstack/react-query": "^4.28.0", + "@tanstack/react-query-devtools": "^4.28.0", + "@types/node": "18.14.2", + "@types/react": "18.0.28", + "@types/react-dom": "18.0.11", + "axios": "^1.3.4", + "cheerio": "^1.0.0-rc.12", + "eslint": "8.35.0", + "eslint-config-next": "13.2.1", + "framer-motion": "^10.0.0", + "nanoid": "^4.0.1", + "next": "13.2.1", + "react": "18.2.0", + "react-dom": "18.2.0", + "recoil": "^0.7.7", + "typescript": "4.9.5" }, "devDependencies": { - "husky": "^8.0.1", - "lint-staged": "^13.0.3" - }, - "lint-staged": { - "**/*": "prettier --write --ignore-unknown" + "@typescript-eslint/eslint-plugin": "^5.53.0", + "@typescript-eslint/parser": "^5.53.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "husky": "^8.0.3", + "prettier": "^2.8.4" } } diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..c9bb00d Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/profile-512x512.png b/public/profile-512x512.png new file mode 100644 index 0000000..e9edfe2 Binary files /dev/null and b/public/profile-512x512.png differ diff --git a/src/lib/@components/Logo.tsx b/src/lib/@components/Logo.tsx new file mode 100644 index 0000000..563e201 --- /dev/null +++ b/src/lib/@components/Logo.tsx @@ -0,0 +1,16 @@ +import Image from "next/image"; +import { ComponentProps } from "react"; +import LogoImg from "public/profile-512x512.png"; +import { Box } from "@chakra-ui/react"; + +type LogoProps = { + size?: string; +} & Partial>; + +export default function Logo({ size = "120px", ...restProps }: LogoProps) { + return ( + + 로고 + + ); +} diff --git a/src/lib/@components/MainLayout.tsx b/src/lib/@components/MainLayout.tsx new file mode 100644 index 0000000..85fa149 --- /dev/null +++ b/src/lib/@components/MainLayout.tsx @@ -0,0 +1,121 @@ +import useColor from "@/lib/@hooks/useColor"; +import { + Box, + Button, + Flex, + Icon, + IconButton, + Text, + useColorMode +} from "@chakra-ui/react"; +import { + faGear, + faHome, + faMoon, + faSun +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import Head from "next/head"; +import { useRouter } from "next/router"; +import { ComponentProps, useRef } from "react"; + +export default function MainLayout({ + title, + children +}: { title: string } & ComponentProps) { + return ( + <> + +
+ + {children} + + + + {title ?? "codeisneverodd"} + + + + + + ); +} + +function Header(props: ComponentProps) { + const { subtleBg } = useColor(); + + return ( + + Solution Pass 어드민 + + + + ); +} + +function Menu() { + const router = useRouter(); + + const menuItems = useRef< + { icon: typeof faHome; title: string; href: string }[] + >([ + { icon: faHome, title: "문제 보기", href: "/" }, + { icon: faHome, title: "풀이 보기", href: "/sols" }, + { icon: faGear, title: "풀이 추가", href: "/newSol" } + ]); + + return ( + + {menuItems.current.map(({ icon, title, href }) => ( + + ))} + + ); +} + +function DarkModeSwitch() { + const { colorMode, toggleColorMode } = useColorMode(); + + return ( + + } + onClick={toggleColorMode} + aria-label="다크모드 토글 버튼" + /> + ); +} diff --git a/src/lib/@hooks/useClient.ts b/src/lib/@hooks/useClient.ts new file mode 100644 index 0000000..c9b2a04 --- /dev/null +++ b/src/lib/@hooks/useClient.ts @@ -0,0 +1,10 @@ +import { useEffect, useState } from "react"; + +export default function useClient() { + const [isClient, setIsClient] = useState(false); + useEffect(() => { + if (!isClient) setIsClient(true); + }, [isClient]); + + return isClient; +} diff --git a/src/lib/@hooks/useColor.ts b/src/lib/@hooks/useColor.ts new file mode 100644 index 0000000..d964607 --- /dev/null +++ b/src/lib/@hooks/useColor.ts @@ -0,0 +1,17 @@ +import { useColorModeValue } from "@chakra-ui/react"; + +export default function useColor() { + const bodyBg = useColorModeValue("white", "gray.800"); + const subtleBg = useColorModeValue("gray.100", "gray.700"); + const alphaBg = useColorModeValue("gray.100", "whiteAlpha.200"); + const accentBg = useColorModeValue("gray.200", "gray.900"); + + const getCountColor = (solCount: number) => { + if (solCount === 0) return "#ff6b18"; + if (solCount === 1) return "#47c84c"; + if (solCount <= 10) return "#1bbaff"; + return "#2189ff"; + }; + + return { bodyBg, subtleBg, alphaBg, accentBg, getCountColor }; +} diff --git a/src/lib/@hooks/useProbs.ts b/src/lib/@hooks/useProbs.ts new file mode 100644 index 0000000..c6d3c81 --- /dev/null +++ b/src/lib/@hooks/useProbs.ts @@ -0,0 +1,35 @@ +import { Prob } from "@/pages/api/prob"; +import { QueryClient, useQuery } from "@tanstack/react-query"; +import axios from "axios"; + +const queryClient = new QueryClient(); + +export default function useProbs() { + const probQuery = useQuery({ + queryKey: ["probs"], + queryFn: async () => { + const res = await axios.get("/api/prob", { + headers: { + "Content-Type": "application/json" + } + }); + return res.data; + } + }); + + const refreshProbs = async () => { + axios + .post("/api/prob", { + headers: { + "Content-Type": "application/json" + } + }) + .then(() => { + queryClient.invalidateQueries({ + queryKey: ["probs"] + }); + }); + }; + + return { probQuery, refreshProbs }; +} diff --git a/src/lib/@hooks/useSols.ts b/src/lib/@hooks/useSols.ts new file mode 100644 index 0000000..1025885 --- /dev/null +++ b/src/lib/@hooks/useSols.ts @@ -0,0 +1,80 @@ +import { PostSolReqBody, Sol } from "@/pages/api/sol"; +import { useToast } from "@chakra-ui/react"; +import { QueryClient, useMutation, useQuery } from "@tanstack/react-query"; +import axios from "axios"; +import useProbs from "./useProbs"; + +const queryClient = new QueryClient(); + +export default function useSols() { + const { probQuery } = useProbs(); + const toast = useToast(); + + const solsQuery = useQuery({ + queryKey: ["sols"], + queryFn: async () => { + const res = await axios.get("/api/sol", { + headers: { + "Content-Type": "application/json" + } + }); + return res.data; + }, + enabled: probQuery.isSuccess + }); + + const addSolMutaiton = useMutation({ + mutationFn: async (sol: PostSolReqBody) => { + await axios.post("/api/sol", sol, { + headers: { + "Content-Type": "application/json" + } + }); + }, + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: ["sols"] + }); + toast({ + title: "풀이 등록에 성공했어요.", + status: "success", + duration: 3000 + }); + }, + onError: () => { + toast({ + title: "풀이 등록에 실패했어요.", + status: "error", + duration: 3000 + }); + } + }); + const deleteSolMutation = useMutation({ + mutationFn: async ({ solId }: { solId: string }) => { + await axios.delete("/api/sol", { + params: { + solId + } + }); + }, + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: ["sols"] + }); + toast({ + title: "풀이 삭제에 성공했어요.", + status: "success", + duration: 3000 + }); + }, + onError: () => { + toast({ + title: "풀이 삭제에 실패했어요.", + status: "error", + duration: 3000 + }); + } + }); + + return { solsQuery, addSolMutaiton, deleteSolMutation }; +} diff --git a/src/lib/@utils/storageEffect.ts b/src/lib/@utils/storageEffect.ts new file mode 100644 index 0000000..018b658 --- /dev/null +++ b/src/lib/@utils/storageEffect.ts @@ -0,0 +1,37 @@ +import { AtomEffect } from "recoil"; + +export function sessionStorageEffect(key: string): AtomEffect { + return ({ setSelf, onSet }) => { + if (typeof window === "undefined") return; + const savedValue = sessionStorage.getItem(key); + if (savedValue != null) { + setSelf(JSON.parse(savedValue)); + } + + onSet((newValue, _, isReset) => { + if (isReset) { + sessionStorage.removeItem(key); + } else { + sessionStorage.setItem(key, JSON.stringify(newValue)); + } + }); + }; +} + +export function localStorageEffect(key: string): AtomEffect { + return ({ setSelf, onSet }) => { + if (typeof window === "undefined") return; + const savedValue = localStorage.getItem(key); + if (savedValue != null) { + setSelf(JSON.parse(savedValue)); + } + + onSet((newValue, _, isReset) => { + if (isReset) { + localStorage.removeItem(key); + } else { + localStorage.setItem(key, JSON.stringify(newValue)); + } + }); + }; +} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx new file mode 100644 index 0000000..7a4e0e2 --- /dev/null +++ b/src/pages/_app.tsx @@ -0,0 +1,17 @@ +import { ChakraProvider } from "@chakra-ui/react"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import type { AppProps } from "next/app"; +import { useState } from "react"; + +export default function App({ Component, pageProps }: AppProps) { + const [queryClient] = useState(() => new QueryClient()); + return ( + + + + + + + ); +} diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx new file mode 100644 index 0000000..b2fff8b --- /dev/null +++ b/src/pages/_document.tsx @@ -0,0 +1,13 @@ +import { Html, Head, Main, NextScript } from "next/document"; + +export default function Document() { + return ( + + + +
+ + + + ); +} diff --git a/src/pages/api/prob.ts b/src/pages/api/prob.ts new file mode 100644 index 0000000..baf8238 --- /dev/null +++ b/src/pages/api/prob.ts @@ -0,0 +1,57 @@ +import * as cheerio from "cheerio"; +import { promises as fs } from "fs"; +import type { NextApiRequest, NextApiResponse } from "next"; +import path from "path"; + +const COURSE_URL = "https://programmers.co.kr/learn/courses/30"; +const jsonDirectory = path.join(process.cwd(), "data"); + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + if (req.method === "GET") { + const fileContents = await fs.readFile( + `${jsonDirectory}/problems.json`, + "utf-8" + ); + const probs = JSON.parse(fileContents) as unknown as Prob[]; + + res.status(200).json(probs); + } + if (req.method === "POST") { + const $ = cheerio.load(await (await fetch(COURSE_URL)).text()); + const probs: Prob[] = []; + const sols = JSON.parse( + await fs.readFile(`${jsonDirectory}/solutions.json`, "utf-8") + ); + + $(".lesson-title").each((i, $node) => { + const title = $($node).children("span").text().trim(); + const link = $($node).attr("href"); + const id = link?.split("/").at(-1) ?? ""; + probs.push({ + title, + id, + solvedCount: sols.filter((sol: any) => sol.probId === id).length + }); + }); + + await fs.writeFile( + `${jsonDirectory}/problems.json`, + JSON.stringify(probs), + { + encoding: "utf-8" + } + ); + + const fileContents = await fs.readFile( + `${jsonDirectory}/problems.json`, + "utf-8" + ); + + res.status(200).json(JSON.parse(fileContents) as unknown as Prob[]); + } +} + +export type Prob = { id: string; title: string; solvedCount: number }; diff --git a/src/pages/api/sol.ts b/src/pages/api/sol.ts new file mode 100644 index 0000000..c763da9 --- /dev/null +++ b/src/pages/api/sol.ts @@ -0,0 +1,76 @@ +import { promises as fs } from "fs"; +import { nanoid } from "nanoid"; +import type { NextApiRequest, NextApiResponse } from "next"; +import path from "path"; + +const jsonDirectory = path.join(process.cwd(), "data"); + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse +) { + if (req.method === "GET") { + const sols = JSON.parse( + await fs.readFile(`${jsonDirectory}/solutions.json`, "utf-8") + ) as unknown as Sol[]; + + res.status(200).json(sols); + } + + if (req.method === "POST") { + const newSols: PostSolReqBody = req.body; + + const sols = JSON.parse( + await fs.readFile(`${jsonDirectory}/solutions.json`, "utf-8") + ) as unknown as Sol[]; + + sols.push({ + id: nanoid(), + author: newSols.author, + code: newSols.code, + probId: newSols.probId, + createdAt: +newSols.createdAt, + lang: newSols.lang + }); + + await fs.writeFile( + `${jsonDirectory}/solutions.json`, + JSON.stringify(sols), + { + encoding: "utf-8" + } + ); + + res.status(200).json(sols); + } + if (req.method === "DELETE") { + const { solId } = req.query as { solId: string }; + + const sols = JSON.parse( + await fs.readFile(`${jsonDirectory}/solutions.json`, "utf-8") + ) as unknown as Sol[]; + + const newSols = sols.filter(sol => sol.id !== solId); + + await fs.writeFile( + `${jsonDirectory}/solutions.json`, + JSON.stringify(newSols), + { + encoding: "utf-8" + } + ); + + res.status(200).json(sols); + } +} + +export type Sol = { + id: string; + author: string; + code: string; + probId: string; + createdAt: ReturnType; + lang: "JavaScript" | "Python"; +}; + +export type PostSolReqBody = Omit; diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000..d4d96c7 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,32 @@ +import MainLayout from "@/lib/@components/MainLayout"; +import useProbs from "@/lib/@hooks/useProbs"; +import { Button, Flex, Text } from "@chakra-ui/react"; + +export default function Home() { + const { probQuery, refreshProbs } = useProbs(); + + return ( + + New Template + + + {probQuery.data && ( + <> + 문제 수 : {probQuery.data.length} + {probQuery.data.map(({ title, id, solvedCount }) => ( + + {title} | {id} | {solvedCount} + + ))} + + )} + + ); +} diff --git a/src/pages/newSol.tsx b/src/pages/newSol.tsx new file mode 100644 index 0000000..df96c07 --- /dev/null +++ b/src/pages/newSol.tsx @@ -0,0 +1,88 @@ +import MainLayout from "@/lib/@components/MainLayout"; +import useSols from "@/lib/@hooks/useSols"; +import { Button, Flex, Text, Textarea } from "@chakra-ui/react"; +import { useState } from "react"; +import { PostSolReqBody } from "./api/sol"; + +export default function NewSol() { + const [solutionInfo, setSolutionInfo] = useState(""); + const [solCode, setSolCode] = useState(""); + const [isValid, setIsValid] = useState(false); + const { addSolMutaiton } = useSols(); + + const checkValid = () => { + try { + const info = JSON.parse(solutionInfo); + const valid = + info.probId && + info.author && + info.lang && + info.createdAt && + solCode !== ""; + setIsValid(valid); + return valid; + } catch (e) { + setIsValid(false); + return false; + } + }; + + const handleSumbit = () => { + if (checkValid()) { + const info = JSON.parse(solutionInfo) as PostSolReqBody; + addSolMutaiton.mutate( + { + author: info.author, + probId: info.probId, + lang: info.lang, + createdAt: info.createdAt, + code: solCode + }, + { + onSuccess: () => { + setSolCode(""); + setSolutionInfo(""); + } + } + ); + } + }; + + return ( + + + + 풀이 추가 + + + 제출한 정답 +