├── .gitignore
├── LICENSE
├── README.md
├── coding-test
├── jaeseong
│ ├── .코딩테스트-재성.js.swp
│ ├── K번째 수.js
│ ├── greedy
│ │ ├── 1이-될때까지.js
│ │ ├── classes
│ │ │ ├── util
│ │ │ │ ├── CoinCountor.js
│ │ │ │ ├── DOM.js
│ │ │ │ └── getCoinCount.js
│ │ │ └── view
│ │ │ │ ├── CSS.css
│ │ │ │ ├── Screen.js
│ │ │ │ └── index.html
│ │ ├── index.js
│ │ ├── 숫자카드게임.js
│ │ └── 큰수의-법칙.js
│ ├── 두개뽑아서더하기.js
│ ├── 예산.js
│ ├── 완주하지못한선수.js
│ ├── 코딩테스트 재성.js
│ └── 평균 구하기(동기화 확인 test).js
├── kimjiwon
│ ├── dfs-bfs
│ │ ├── BFS예제.js
│ │ ├── DFS예제.js
│ │ ├── DFS와BFS.js
│ │ ├── 나이트의이동.js
│ │ ├── 단지번호붙이기.js
│ │ ├── 미로탈출.js
│ │ ├── 바이러스.js
│ │ ├── 유기농배추.js
│ │ ├── 음료수얼려먹기(dfs).js
│ │ ├── 토마토.js
│ │ └── 토마토3차원.js
│ ├── greedy
│ │ ├── 1이될때까지.js
│ │ ├── 거스름돈.js
│ │ ├── 숫자카드게임.js
│ │ └── 큰수의법칙.js
│ ├── implement
│ │ ├── 게임개발.js
│ │ ├── 상하좌우.js
│ │ ├── 시각.js
│ │ └── 왕실의나이트.js
│ ├── level1
│ │ ├── 2016년.js
│ │ ├── 3진법뒤집기.js
│ │ ├── k번째수.js
│ │ ├── p와y개수는2가지.js
│ │ ├── x만큼간격이있는n개의숫자.js
│ │ ├── 가운데글자가져오기.js
│ │ ├── 같은숫자는싫어.js
│ │ ├── 나누어_떨어지는_숫자_배열.js
│ │ ├── 내적.js
│ │ ├── 다트게임.js
│ │ ├── 두개_뽑아서_더하기.js
│ │ ├── 두정수사이의합.js
│ │ ├── 모의고사.js
│ │ ├── 문자열_내_마음대로_정렬하기.js
│ │ ├── 문자열_내림차순으로_배치.js
│ │ ├── 문자열다루기기본.js
│ │ ├── 문자열정수로바꾸기.js
│ │ ├── 비밀지도.js
│ │ ├── 서울에서_김서방_찾기.js
│ │ ├── 수박수박수.js
│ │ ├── 실패율.js
│ │ ├── 약수의_합.js
│ │ ├── 예산.js
│ │ ├── 완주하지_못한_선수.js
│ │ ├── 이상한문자만들기.js
│ │ ├── 자릿수더하기.js
│ │ ├── 정수_내림차순으로_배치하기.js
│ │ ├── 제일작은수제거하기.js
│ │ ├── 체육복.js
│ │ ├── 최대공약수와최소공배수.js
│ │ ├── 콜라츠추측.js
│ │ ├── 크레인인형뽑기게임.js
│ │ ├── 하샤스수.js
│ │ └── 핸드폰_번호_가리기.js
│ ├── level2
│ │ ├── 기능개발.js
│ │ ├── 다리를지나는트럭.js
│ │ ├── 스킬트리.js
│ │ ├── 위장.js
│ │ ├── 타겟넘버.js
│ │ └── 프린터.js
│ └── sort
│ │ ├── 두배열의원소교체.js
│ │ ├── 성적이낮은순서로학생출력하기.js
│ │ └── 위에서아래로.js
├── minjae
│ ├── BackJoon
│ │ ├── 5단계-1차원배열
│ │ │ ├── 숫자의 개수.js
│ │ │ └── 평균은넘겠지.js
│ │ ├── 6단계-함수
│ │ │ ├── 셀프넘버.js
│ │ │ └── 한수.js
│ │ └── 7단계-문자열
│ │ │ ├── 그룹단어체커.js
│ │ │ ├── 다이얼.js
│ │ │ ├── 단어공부.js
│ │ │ ├── 문자열-반복.js
│ │ │ ├── 알파벳찾기.js
│ │ │ └── 크로아티아알파벳.js
│ ├── Implement
│ │ ├── 구현-게임개발.js
│ │ ├── 구현-상하좌우.js
│ │ ├── 구현-시각.js
│ │ └── 구현-왕실의-게임.js
│ ├── Level1
│ │ ├── 3진법-뒤집기.js
│ │ ├── k번째수.js
│ │ ├── 가운데-글자-가져오기.js
│ │ ├── 나누어-떨어지는-숫자-배열.js
│ │ ├── 내적.js
│ │ ├── 데모-테스트.js
│ │ ├── 두-수-사이의-합.js
│ │ ├── 두개-뽑아서-더하기.js
│ │ ├── 문자열-내-마음대로-정렬.js
│ │ ├── 문자열-내림차순으로-배치.js
│ │ ├── 문자열-다루기-기본.js
│ │ ├── 문자열내-p와y-개수.js
│ │ ├── 서울에서-김서방-찾기.js
│ │ ├── 수박수박수.js
│ │ ├── 시저-암호.js
│ │ ├── 약수의-합.js
│ │ ├── 예산.js
│ │ ├── 완주하지-못한-선수-객체.js
│ │ ├── 완주하지-못한-선수.js
│ │ ├── 이상한-문자-만들기.js
│ │ ├── 자릿수-더하기.js
│ │ ├── 자연수-뒤집어-배열로-만들기.js
│ │ ├── 정수-제곱근-판별.js
│ │ ├── 제일-작은수-제거.js
│ │ ├── 최대공약수-최소공배수.js
│ │ ├── 콜라츠-추측.js
│ │ ├── 하샤드-수.js
│ │ ├── 핸드폰-번호-가리기.js
│ │ └── 행렬의-덧셈.js
│ ├── Level2
│ │ ├── 기능개발.js
│ │ ├── 다음큰숫자.js
│ │ ├── 멀쩡한-사각형.js
│ │ ├── 올바른-괄호.js
│ │ └── 이진변환-반복하기.js
│ ├── binary-search
│ │ ├── 떡볶이만들기.js
│ │ ├── 부품찾기-이진탐색.js
│ │ ├── 부품찾기.js
│ │ ├── 순차탐색예제.js
│ │ ├── 이진탐색예제1.js
│ │ └── 이진탐색예제2.js
│ ├── dfs-bfs
│ │ ├── BFS-예제.js
│ │ ├── DFS-예제.js
│ │ ├── DFS와BFS.js
│ │ ├── stack-queue.js
│ │ ├── 나이트의이동.js
│ │ ├── 단지번호붙이기.js
│ │ ├── 미로탈출.js
│ │ ├── 미로탐색.js
│ │ ├── 바이러스.js
│ │ ├── 유기농배추.js
│ │ ├── 음료수얼려먹기.js
│ │ └── 토마토.js
│ ├── greedy
│ │ ├── 그리디1-거스름돈.js
│ │ ├── 그리디2-큰-수의-법칙.js
│ │ ├── 그리디3-숫자-카드-게임.js
│ │ └── 그리디4-1이-될-때까지.js
│ └── sort
│ │ ├── 계수정렬-예제.js
│ │ ├── 두배열의원소교체.js
│ │ ├── 삽입정렬-예제.js
│ │ ├── 선택정렬-예제.js
│ │ ├── 성적이-낮은-순서.js
│ │ ├── 위에서아래로.js
│ │ └── 퀵정렬-예제.js
├── sangjun
│ ├── 12월2일.js
│ ├── 2016년.js
│ ├── Implement
│ │ ├── 게임개발.js
│ │ ├── 상하좌우.js
│ │ ├── 시각.js
│ │ └── 왕실의나이트.js
│ ├── binary-serach
│ │ ├── 떡볶이떡만들기.js
│ │ ├── 부품찾기.js
│ │ ├── 부품찾기set.js
│ │ ├── 순차탐색.js
│ │ └── 이진탐색.js
│ ├── dfs-bfs
│ │ ├── bfs.js
│ │ ├── dfs.js
│ │ ├── dfs와bfs.js
│ │ ├── 나이트의이동.js
│ │ ├── 단지번호붙이기.js
│ │ ├── 미로탈출.js
│ │ ├── 미로탐색.js
│ │ ├── 바이러스.js
│ │ ├── 유기농배추.js
│ │ ├── 음료수 얼려먹기.js
│ │ └── 토마토.js
│ ├── greedy
│ │ ├── 1이될때까지.js
│ │ ├── 거스름돈.js
│ │ ├── 숫자카드게임.js
│ │ └── 큰수의법칙.js
│ ├── 같은숫자는싫어.js
│ ├── 나누어떨어지는숫자베열.js
│ ├── 두개뽑아서더하기.js
│ ├── 두정수사의합.js
│ ├── 문자열내마음대로정렬하기.js
│ ├── 문자열다루기기본.js
│ ├── 삼진법뒤집기.js
│ ├── 예산.js
│ ├── 완주하지못한선수.js
│ ├── 자릿수더하기.js
│ └── 정수내림차순배치.js
├── soongu
│ ├── K번째수.js
│ ├── binary-search
│ │ ├── 떡볶이떡만들기.js
│ │ ├── 부품탐색 set.js
│ │ ├── 부품탐색 계수정렬.js
│ │ ├── 부품탐색 이진탐색.js
│ │ ├── 순차탐색 예제.js
│ │ ├── 이진탐색 반복문.js
│ │ └── 이진탐색 예제.js
│ ├── dfs-bfs
│ │ ├── 3D토마토.js
│ │ ├── bfsdfs.js
│ │ ├── bfsdfs최적화.js
│ │ ├── 나이트의이동.js
│ │ ├── 단지번호붙이기.js
│ │ ├── 미로탐색.js
│ │ ├── 바이러스.js
│ │ ├── 유기농배추.js
│ │ ├── 음료수얼려먹기.js
│ │ └── 토마토.js
│ ├── greedy
│ │ ├── 1이 될 때까지.js
│ │ ├── 숫자 카드 게임.js
│ │ ├── 큰 수의 법칙1.js
│ │ └── 큰 수의 법칙2.js
│ ├── implement
│ │ ├── 게임개발.js
│ │ ├── 상하좌우.js
│ │ ├── 상하좌우2.js
│ │ ├── 시각.js
│ │ └── 왕실의나이트.js
│ ├── sort
│ │ ├── 두배열의원소교체.js
│ │ ├── 성적이낮은순서도.js
│ │ └── 위에서아래로.js
│ ├── 가운데 글자 가져오기.js
│ ├── 같은 숫자는 싫어.js
│ ├── 거스름돈.js
│ ├── 두 정수 사이의 합.js
│ ├── 두-개-뽑아서-더하기.js
│ ├── 모의고사.js
│ ├── 문자열 내림차순.js
│ ├── 문자열-p와-y의-개수.js
│ ├── 문자열-다루기.js
│ ├── 서울에서-김서방찾기.js
│ ├── 수박수.js
│ ├── 약수의-합.js
│ ├── 예산.js
│ ├── 완주하지-못한-선수.js
│ ├── 완주하지못한선수(object).js
│ ├── 이상한-문자-만들기.js
│ ├── 자릿수 더하기.js
│ ├── 정수-제곱근-판별.js
│ ├── 평균구하기.js
│ └── 행렬의 덧셈.js
├── wonji
│ ├── dfs-bfs
│ │ ├── bfs예제.js
│ │ ├── dfs예제.js
│ │ ├── 미로탈출.js
│ │ └── 음료수얼려먹기.js
│ ├── greedy
│ │ ├── 1이될때까지.js
│ │ ├── 거스름돈.js
│ │ ├── 숫자카드게임.js
│ │ └── 큰수의법칙.js
│ ├── implement
│ │ ├── 게임개발.js
│ │ ├── 상하좌우.js
│ │ ├── 시각.js
│ │ └── 왕실의나이트.js
│ └── level-1
│ │ ├── k번째-수.js
│ │ ├── 가운데-글자-가져오기.js
│ │ ├── 같은숫자는싫어.js
│ │ ├── 두-개-뽑아서-더하기.js
│ │ ├── 두-정수-사이의-합.js
│ │ ├── 문자열-내-마음대로-정렬하기.js
│ │ ├── 문자열-내림차순으로-배치하기.js
│ │ ├── 문자열-다루기-기본-2.js
│ │ ├── 문자열-다루기-기본.js
│ │ ├── 문자열내p와y의개수.js
│ │ ├── 문자열을-정수로-바꾸기.js
│ │ ├── 서울에서-김서방-찾기.js
│ │ ├── 수박수박수.js
│ │ ├── 약수의 합.js
│ │ ├── 완주하지-못한-선수(object).js
│ │ ├── 완주하지_못한_선수(object2).js
│ │ ├── 자릿수-더하기.js
│ │ ├── 체육복-1.js
│ │ └── 체육복-2.js
└── woorim
│ ├── binary-search
│ ├── binary-search.js
│ ├── 떡볶이-떡-만들기.js
│ └── 부품-찾기.js
│ ├── dfs-bfs
│ ├── DFS와-BFS(백준-1260).js
│ ├── bfs.js
│ ├── dfs.js
│ ├── queue.js
│ ├── recursive.js
│ ├── stack.js
│ ├── tree.js
│ ├── 나이트의-이동(백준-7562).js
│ ├── 단지번호붙이기(백준-2667).js
│ ├── 미로탈출.js
│ ├── 미로탐색(백준-2178).js
│ ├── 바이러스(백준-2606).js
│ ├── 유기농배추(백준-1012).js
│ ├── 음료수-얼려-먹기.js
│ ├── 타겟-넘버(프로그래머스).js
│ ├── 토마토-2차원(백준-7576).js
│ └── 토마토-3차원(백준-7569).js
│ ├── greedy
│ ├── 1이-될때까지.js
│ ├── input.txt
│ ├── 거스름돈.js
│ ├── 숫자카드게임.js
│ ├── 주유소.js
│ ├── 큰수의-법칙.js
│ └── 회의실배정-BOJ-1931.js
│ ├── implement
│ ├── 게임-개발.js
│ ├── 게임-게발-하드코딩.js
│ ├── 상하좌우.js
│ ├── 시각.js
│ ├── 왕실의-나이트.js
│ └── 해치웠나(소마-데모).js
│ └── sort
│ ├── countSort.js
│ ├── insertionSort.js
│ ├── quickSort.js
│ ├── selectionSort.js
│ ├── 두-배열의-원소-교체.js
│ ├── 성적이-낮은-순서로-학생-출력하기(정렬라이브러리사용).js
│ ├── 성적이-낮은-순서로-학생-출력하기(직접-구현).js
│ ├── 위에서-아래로.js
│ └── 통계학.js
├── sql
├── README.md
├── kimjiwon
│ ├── GROUP_BY
│ │ ├── 고양이와개는몇마리.sql
│ │ ├── 동명동물수찾기.sql
│ │ ├── 입양시간구하기(1).sql
│ │ └── 입양시간구하기(2).sql
│ ├── ISNULL
│ │ ├── NULL처리하기.sql
│ │ ├── 이름이없는동물의아이디.sql
│ │ └── 이름이있는동물의아이디.sql
│ ├── JOIN
│ │ ├── 보호소에서중성화한동물.sql
│ │ ├── 없어진기록찾기.sql
│ │ ├── 오랜기간보호한동물(1).sql
│ │ └── 있었는데요없었습니다.sql
│ ├── SELECT
│ │ ├── 동물의아이디와이름.sql
│ │ ├── 모든레코드조회.sql
│ │ ├── 상위n개레코드.sql
│ │ ├── 아픈동물찾기.sql
│ │ ├── 어린동물찾기.sql
│ │ ├── 여러기준으로정렬하기.sql
│ │ └── 역순정렬하기.sql
│ ├── SUM,MAX,MIN
│ │ ├── 동물수구하기.sql
│ │ ├── 중복제거하기.sql
│ │ ├── 최댓값구하기.sql
│ │ └── 최소값구하기.sql
│ └── String,Date
│ │ ├── DATETIME에서DATE로형변환.sql
│ │ ├── 루시와엘라찾기.sql
│ │ ├── 오랜기간보호한동물(2).sql
│ │ ├── 이름에EL들어가는동물찾기.sql
│ │ └── 중성화여부파악하기.sql
├── soongu
│ ├── groupby
│ │ ├── 고양이와개는몇마리있을까.sql
│ │ ├── 동명동물수찾기.sql
│ │ ├── 입양시각구하기(1).sql
│ │ └── 입양시각구하기(2).sql
│ ├── isnull
│ │ ├── null처리하기.sql
│ │ ├── 이름이없는동물의아이디.sql
│ │ └── 이름이있는동물의아이디.sql
│ ├── join
│ │ ├── 보호소에서중성화한동물.sql
│ │ ├── 없어진기록찾기.sql
│ │ ├── 오랜기간보호한동물(1).sql
│ │ └── 있었는데요없었습니다.sql
│ ├── select
│ │ ├── 동물의아이디와이름.sql
│ │ ├── 모든레코드조회하기.sql
│ │ ├── 상위n개 레코드.sql
│ │ ├── 아픈동물찾기.sql
│ │ ├── 어린동물찾기.sql
│ │ ├── 여러기준으로정렬하기.sql
│ │ └── 역순정렬하기.sql
│ ├── string,date
│ │ ├── datetime에서date로형변환.sql
│ │ ├── 루시와엘라찾기.sql
│ │ ├── 오랜기간보호한동물(2).sql
│ │ ├── 이름에EL이들어가는동물찾기.sql
│ │ └── 중성화여부파악하기.sql
│ └── sum,max,min
│ │ ├── 동물수구하기.sql
│ │ ├── 중복제거하기.sql
│ │ ├── 최대값구하기.sql
│ │ └── 최솟값구하기.sql
├── wonji
│ ├── group-by
│ │ ├── 고양이와-개는-몇-마리-있을까.sql
│ │ ├── 동명-동물-수-찾기.sql
│ │ ├── 입양-시각-구하기(1).sql
│ │ └── 입양-시각-구하기(2).sql
│ ├── is-null
│ │ ├── null-처리하기.sql
│ │ ├── 이름이-없는-동물의-아이디.sql
│ │ └── 이름이-있는-동물의-아이디.sql
│ ├── join
│ │ ├── 보호소에서-중성화한-동물.sql
│ │ ├── 없어진-기록-찾기.sql
│ │ ├── 오랜기간-보호한-동물(1).sql
│ │ └── 있었는데요-없었습니다.sql
│ ├── select
│ │ ├── 동물의아이디와이름.sql
│ │ ├── 모든레코드조회하기.sql
│ │ ├── 상위n개레코드.sql
│ │ ├── 아픈동물찾기.sql
│ │ ├── 어린동물찾기.sql
│ │ ├── 여러기준으로정렬하기.sql
│ │ └── 역순정렬하기.sql
│ ├── string-data
│ │ ├── datetime에서-date로-형-변환.sql
│ │ ├── 루시와-엘라-찾기.sql
│ │ ├── 오랜기간-보호한-동물(2).sql
│ │ ├── 이름에-el이-들어가는-동물-찾기.sql
│ │ └── 중성화-여부-파악하기.sql
│ └── sum-max-min
│ │ ├── 동물-수-구하기.sql
│ │ ├── 중복-제거하기.sql
│ │ ├── 최대값-구하기.sql
│ │ └── 최솟값-구하기.sql
└── woorim
│ ├── group-by
│ ├── 고양이와-개는-몇마리있을까.sql
│ ├── 동명-동물-수-찾기.js
│ ├── 입양-시각-구하기(2).sql
│ └── 입양-시각-구하기.sql
│ ├── is-null
│ ├── NULL-처리하기.sql
│ ├── 이름이-없는-아이디.sql
│ └── 이름이-있는-동물의-아이디.sql
│ ├── join
│ ├── 보호소에서-중성화한-동물.sql
│ ├── 없어진-기록-찾기.sql
│ ├── 오랜-기간-보호한-동물.sql
│ └── 있었는데요-없었습니다.sql
│ ├── select
│ ├── 동물의-아이디와-이름.sql
│ ├── 모든-레코드-조회하기.sql
│ ├── 상위-n개-레코드.sql
│ ├── 아픈-동물-찾기.sql
│ ├── 어린-동물-찾기.sql
│ ├── 여러-기준으로-정렬하기.sql
│ └── 역순-정렬하기.sql
│ ├── string-date
│ ├── DATETIME에서-DATE로-형변환.sql
│ ├── 루시와-엘라-찾기.sql
│ ├── 오랜-기간-보호한-동물(2).sql
│ ├── 이름에-el이-들어가는-이름찾기.sql
│ └── 중성화-여부-파악하기.sql
│ └── sum-max-min
│ ├── 동물-수-구하기.sql
│ ├── 중복-제거하기.sql
│ ├── 최댓값-구하기.sql
│ └── 최솟값-구하기.sql
└── task
├── baseball-game
├── README.md
├── jaeseong
│ ├── CSS.css
│ ├── README.md
│ ├── classes
│ │ ├── BaseballGame.js
│ │ ├── DOM.js
│ │ ├── Error.js
│ │ ├── Random.js
│ │ └── UserNum.js
│ ├── index.html
│ └── index.js
├── jiwon
│ ├── README.md
│ └── origin
│ │ ├── classes
│ │ ├── DOM.js
│ │ ├── error
│ │ │ ├── ErrorMessage.js
│ │ │ └── ErrorValidator.js
│ │ ├── random
│ │ │ └── computer.js
│ │ └── result
│ │ │ ├── baseballgame.js
│ │ │ └── output.js
│ │ ├── image
│ │ └── 황당.jpg
│ │ ├── index.css
│ │ ├── index.html
│ │ └── index.js
├── minjae
│ ├── README.md
│ ├── index.html
│ ├── index.js
│ ├── main
│ │ └── BaseballGame.js
│ ├── src
│ │ ├── CounterCheck.js
│ │ ├── Random.js
│ │ ├── Restart.js
│ │ ├── User.js
│ │ ├── Validator.js
│ │ └── ViewResult.js
│ ├── style.css
│ └── utils
│ │ └── DOM.js
├── origin
│ ├── classes
│ │ └── BaseballGame.js
│ ├── index.html
│ └── index.js
├── sangjun
│ ├── README.md
│ ├── classes
│ │ ├── BaseballGame.js
│ │ ├── DOM.js
│ │ ├── Output.js
│ │ ├── Random.js
│ │ └── Validator.js
│ ├── index.css
│ ├── index.html
│ └── index.js
├── soongu
│ ├── README.md
│ ├── app
│ │ └── BaseballGame.js
│ ├── index.html
│ ├── index.js
│ ├── inputNumber
│ │ ├── ComputerInputNumbers.js
│ │ └── UserInputNumber.js
│ ├── style.css
│ └── util
│ │ ├── DOM.js
│ │ ├── NumberLength.js
│ │ ├── Restart.js
│ │ └── Validator.js
├── wonji
│ ├── README.md
│ ├── class
│ │ ├── Check.js
│ │ ├── Computer.js
│ │ ├── Output.js
│ │ └── countStrikeBall.js
│ ├── index.html
│ ├── index.js
│ ├── memo.md
│ └── style.css
└── woorim
│ ├── classes
│ ├── BaseballGame.js
│ ├── User.js
│ └── utils
│ │ ├── DOM.js
│ │ ├── Random.js
│ │ └── Validator.js
│ ├── index.html
│ └── index.js
└── calculator
├── jaeseong
├── procedure.html
└── procedure.js
├── jiwon
├── procedure.html
└── procedure.js
├── sangjun
├── procedure.html
└── procedure.js
├── soongu
├── procedure.html
└── procedure.js
└── wonji
├── procedure.html
└── procedure.js
/coding-test/jaeseong/.코딩테스트-재성.js.swp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/woorim960/modern-agile-codingtest/053154d2153e530d5e8025071f669e94ebbf8a1a/coding-test/jaeseong/.코딩테스트-재성.js.swp
--------------------------------------------------------------------------------
/coding-test/jaeseong/K번째 수.js:
--------------------------------------------------------------------------------
1 | function solution(array, commands) {
2 | var answer = []; // const로 선언
3 | let startNum, endNum, cutNum; // Good!!
4 | for(let l = 0;l < commands.length; l++){ // l로 선언한 이유는? , i나 idx로 인덱스임을 명시해줘야 한다.
5 | startNum = commands[l][0];
6 | endNum = commands[l][1];
7 | cutNum = commands[l][2];
8 | let out = array.slice(startNum - 1, endNum).sort((a, b) => a - b); // for 문 안에서 let으로 초기화하면 매번 반복때마다 선언하게 됨. 효율적이지 못하다. sort를 a-b로 해준 이유?
9 | answer[l] = out[cutNum - 1]; // [l]에 대입하는 건 옳지 못한 코딩 습관이다. 다른 언어에서는 에러뜨면서 종료될 것임. 없는 공간에 값을 대입하려는 것이기 때문. array에는 push가 맞음.
10 | }
11 | return answer;
12 | }
13 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/1이-될때까지.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | const rl = require("readline-sync");
3 | let [ n,k ] = rl.question("n m input please : \n>>").split(" ");
4 | console.log(`\n입력값 :${n},${k}`);
5 |
6 | function solution() {
7 | console.log(n,k);
8 | let count = 0;
9 | while (n !== 1) {
10 | if ( n % k !== 0) {
11 | n -= 1;
12 | count++;
13 | } else if (n % k === 0){
14 | n /= k;
15 | count++;
16 | }
17 | }
18 | return console.log(`정답 : ${count}`);
19 | }
20 |
21 | solution();
22 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/classes/util/CoinCountor.js:
--------------------------------------------------------------------------------
1 | const COINS = [500, 100, 50, 10];
2 | export default class CoinCountor {
3 | calculate(unitInput) {
4 | let count = [];
5 | let total = 0;
6 |
7 | for (let i = 0; i < coinList.length; i++) {
8 | count[i] = parseInt(unitInput / coinList[i]); // 동전갯수
9 | unitInput %= coinList[i]; // 거스름돈
10 | total += count[i]; //동전개수
11 | }
12 | return { count, total };
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/classes/util/DOM.js:
--------------------------------------------------------------------------------
1 | export const result = document.querySelector("#result");
2 | export const input = document.querySelector("#change-input");
3 | export const btnClick = document.querySelector("#submit");
4 |
5 |
6 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/classes/util/getCoinCount.js:
--------------------------------------------------------------------------------
1 | export default class getCoinCount {
2 | calculate(unitInput) {
3 | let coinList = [500, 100, 50, 10];
4 | let count = [];
5 | let total = 0;
6 |
7 | for (let i = 0; i < coinList.length; i++) {
8 | count[i] = parseInt(unitInput / coinList[i]); // 동전갯수
9 | unitInput %= coinList[i]; // 거스름돈
10 | total += count[i]; //동전개수
11 | }
12 | return { count, total };
13 | }
14 | }
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/classes/view/CSS.css:
--------------------------------------------------------------------------------
1 | body {
2 | text-align: center;
3 | font-family: cursive;
4 | background-color: cornsilk;
5 | }
6 |
7 | #app {
8 | text-align: center;
9 | }
10 | #app h1 {
11 | animation-duration: 3s;
12 | animation-name: slidein;
13 | background-color: blanchedalmond;
14 | }
15 | #app p {
16 | background-color: crimson;
17 | }
18 |
19 | @keyframes slidein {
20 | from {
21 | margin-left: 100%;
22 | width: 300;
23 | }
24 | to {
25 | margin-left: 0%;
26 | width: 100%;
27 | }
28 | }
29 |
30 | #app button {
31 | background-color: rgb(92, 71, 34);
32 | border: none;
33 | color: white;
34 | padding: 5px 10px;
35 | text-decoration: none;
36 | display: inline-block;
37 | font-size: 10px;
38 | cursor: pointer;
39 | }
40 | #app button:hover {
41 | background-color: rgb(236, 214, 176);
42 | }
43 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/classes/view/Screen.js:
--------------------------------------------------------------------------------
1 | import { result } from '../util/DOM.js';
2 |
3 | export default class Screen {
4 | static print (count, total) {
5 | result.innerHTML = `오백원 ${count[0]}개 백원 ${count[1]}개 오십원 ${count[2]} 십원 ${count[3]}개 동전 총 개수 : ${total}`;
6 | }
7 | }
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/classes/view/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 그리드
11 |
12 |
13 |
14 |
거스름돈
15 |
16 | 거스름돈을 입력해 주세요
17 |
18 |
아래 입력창에 입력해주세요
19 |
20 |
제출
21 |
22 |
📄 결과
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 |
4 | import CoinCountor from "./classes/util/CoinCountor.js";
5 | import Screen from "./classes/view/Screen.js";
6 | import { input, btnClick } from "./classes/util/DOM.js";
7 |
8 | const coinCountor = new CoinCountor();
9 |
10 |
11 | btnClick.addEventListener("click", run);
12 |
13 | function run() {
14 |
15 | const { eachCoinCount, totalCoinCount } = coinCountor.calculate(input.value);
16 | Screen.print(eachCoinCount, totalCoinCount);
17 | }
18 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/숫자카드게임.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | const rl = require("readline-sync");
3 | let [ n, m ] = rl.question("n m input please : \n>>").split(" ");
4 | let data = rl.question("array input please : \n>>").split(" ");
5 | console.log(`\n입력값 :${n},${m}`);
6 | console.log(`배열값 :${data}\n`);
7 |
8 | function solution() {
9 | let minValue = [];
10 | let result = 0;
11 |
12 | for ( let i = 1; i < n ; i++ ) {
13 | for ( let j = 1; j < m; j++ ) {
14 | minValue = Math.min(data[j]);
15 | result = Math.max(result, minValue);
16 | }
17 | }
18 | return console.log(`정답 : ${result}`);
19 | }
20 |
21 | solution();
22 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/greedy/큰수의-법칙.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const rl = require("readline-sync");
4 | let [ n, m, k ] = rl.question("n m k input please : \n>>").split(" ");
5 | let data = rl.question("array input please : \n>>").split(" ");
6 | console.log(`\n입력값 :${n},${m},${k}`);
7 | console.log(`배열값 :${data}`);
8 |
9 | function solution() {
10 | data.sort();
11 | let first = data[n - 1];
12 | let second = data[n - 2];
13 |
14 | let count = parseInt(m / (k + 1)) * k;
15 | count += m % (k + 1);
16 |
17 | let result = 0;
18 | result += (count) * first;
19 | result += (m - count) * second;
20 | return console.log(result);
21 | }
22 |
23 | solution();
24 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/두개뽑아서더하기.js:
--------------------------------------------------------------------------------
1 | function solution(numbers) {
2 | const NUMBER_LENGTH = numbers.length;
3 |
4 | let result = [];
5 | for(let i = 0; i < NUMBER_LENGTH; i++){
6 | for(let j = i + 1; j < NUMBER_LENGTH; j++){
7 | result.push(numbers[i] + numbers[j]);
8 | }
9 | }
10 | result.sort((a, b) => a - b);
11 | return Array.from(new Set(result));
12 | }
13 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/예산.js:
--------------------------------------------------------------------------------
1 | function solution(d, budget) {
2 | let count, sum
3 | count = sum = 0;
4 | d.sort((a,b) => a - b);
5 |
6 | for(let i = 0; i < d.length ; i++) {
7 | sum += d[i];
8 | if (sum <= budget) {
9 | count++;
10 | }
11 | }
12 | return count;
13 | }
14 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/완주하지못한선수.js:
--------------------------------------------------------------------------------
1 | function solution(participant, completion) {
2 | let answer = '';
3 |
4 | let checkObj = {};
5 | for (let name of participant) {
6 | if (checkObj[name] === undefined) {
7 | checkObj[name] = 1;
8 | continue;
9 | }
10 | checkObj[name] += 1;
11 | }
12 |
13 | for (let name of completion) {
14 | if (checkObj[name]) {
15 | checkObj[name] -= 1;
16 | }
17 | }
18 |
19 | for (let name of participant) {
20 | if (checkObj[name] >= 1) {
21 | answer = name;
22 | break;
23 | }
24 | }
25 |
26 | return answer;
27 | }
28 |
--------------------------------------------------------------------------------
/coding-test/jaeseong/평균 구하기(동기화 확인 test).js:
--------------------------------------------------------------------------------
1 | function solution(arr) {
2 | let sum = 0;
3 | let answer = 0;
4 | for( let i = 0 ; i < arr.length ; i++ ){
5 | sum = sum + arr[i];
6 | }
7 | answer = sum / arr.length;
8 | return answer;
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/dfs-bfs/BFS예제.js:
--------------------------------------------------------------------------------
1 | const graph = [
2 | [],
3 | [2, 3, 8],
4 | [1, 7],
5 | [1, 4, 5],
6 | [3, 5],
7 | [3, 4],
8 | [7],
9 | [2, 6, 8],
10 | [1, 7],
11 | ];
12 | //방문한 숫자 => 큐 배열
13 | const queue = [];
14 | //큐에서 빠져나온 숫자 배열 1은 기본값..
15 | const visited = [1];
16 | //이거 제외
17 |
18 | //모두 방문하면 큐 배열로 가고 그 큐 배열에서 숫자배열로
19 | //큐 배열 빠지면 끝
20 |
21 | for (let x = 1; x < graph.length; x++) {
22 | for (let y = 0; y < graph[x].length; y++) {
23 | if (x === graph.length - 1) {
24 | visited.push(...queue);
25 | break;
26 | }
27 | if (visited.includes(graph[x][y])) {
28 | continue;
29 | }
30 | if (queue.includes(graph[x][y])) {
31 | visited.push(queue[0]);
32 | queue.shift();
33 | continue;
34 | }
35 | queue.push(graph[x][y]);
36 | }
37 | }
38 | console.log(visited.join(","));
39 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/dfs-bfs/DFS예제.js:
--------------------------------------------------------------------------------
1 | const graph = [
2 | [],
3 | [2, 3, 8],
4 | [1, 7],
5 | [1, 4, 5],
6 | [3, 5],
7 | [3, 4],
8 | [7],
9 | [2, 6, 8],
10 | [1, 7],
11 | ];
12 |
13 | const visited = {};
14 | const result = [];
15 |
16 | function dfs(graph, x, visited) {
17 | visited[x] = true;
18 | result.push(x);
19 | for (let y of graph[x]) {
20 | if (!visited[y]) {
21 | dfs(graph, y, visited);
22 | }
23 | }
24 | }
25 |
26 | dfs(graph, 1, visited);
27 | console.log(result.join(","));
28 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/dfs-bfs/음료수얼려먹기(dfs).js:
--------------------------------------------------------------------------------
1 | `use strict`;
2 |
3 | const n = 5;
4 | const m = 4;
5 | const drink = [
6 | [0, 0, 1, 1, 0],
7 | [0, 0, 0, 1, 1],
8 | [1, 1, 1, 1, 1],
9 | [0, 0, 0, 0, 0],
10 | ];
11 | //0을 찾는다 처음자리 0,0
12 | //그 위아래양옆을 뒤진다. => dfs
13 | //0이 있으면 자리 옮기고 그 자리는 1
14 | //위아래옆 중복되어 0이면 다 1로
15 | //없으면 카운트 +1
16 | let icecream = 0;
17 |
18 | function navigation(x, y) {
19 | if (x > m - 1 || x < 0 || y > n - 1 || y < 0) return false;
20 |
21 | if (drink[x][y] === 0) {
22 | drink[x][y] = 1;
23 | navigation(x, y - 1);
24 | navigation(x + 1, y);
25 | navigation(x, y + 1);
26 | navigation(x - 1, y);
27 | return true;
28 | }
29 | return false;
30 | }
31 |
32 | for (let row = 0; row < m; row++) {
33 | for (let column = 0; column < n; column++) {
34 | if (navigation(row, column)) icecream++;
35 | }
36 | }
37 | console.log(icecream);
38 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/greedy/1이될때까지.js:
--------------------------------------------------------------------------------
1 | function getMinNumberCount(N, K) {
2 | let cnt = 0;
3 | while (N !== 1) {
4 | N = N % K ? N - 1 : N / K; // N이 K로 나눠지지 않으면 N에서 1을 빼고, 나눠지면 N / K를 수행하여 N에 대입한다.
5 | cnt++;
6 | }
7 | return cnt;
8 | }
9 |
10 | console.log(getMinNumberCount(24, 3));
11 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/greedy/숫자카드게임.js:
--------------------------------------------------------------------------------
1 | const cards = [];
2 |
3 | function setCards(row, column) {
4 | while (cards.length !== column) {
5 | cards.push(rowcards(row));
6 | }
7 | }
8 |
9 | const getMaxCard = (cards) =>
10 | Math.max(...cards.map((card) => card.sort((a, b) => a - b)[0]));
11 |
12 | setCards(3, 4);
13 | console.log(getMaxCard(cards));
14 | //대애애박 ...배열하면 안의 배열은 풀린다! 머리 딱 치고 갑니다..
15 |
16 | //랜덤 카드 뽑기
17 | function rowcards(row) {
18 | const numbers = new Set();
19 | while (numbers.size != row) {
20 | numbers.add(Math.floor(Math.random() * 9 + 1));
21 | }
22 | return [...numbers];
23 | }
24 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/greedy/큰수의법칙.js:
--------------------------------------------------------------------------------
1 | function bigNumberRule() {
2 | const [n, m, k] = [5, 8, 3];
3 | const numbers = array(n);
4 | let largestNumber, secondNumber, count, result;
5 | largestNumber = secondNumber = count = result = 0;
6 |
7 | numbers.sort((a, b) => b - a);
8 | console.log(numbers);
9 | largestNumber = numbers[0];
10 | secondNumber = numbers[1];
11 |
12 | count = (m / (k + 1)) * k;
13 | count += m % (k + 1);
14 |
15 | result = count * largestNumber;
16 | result += (m - count) * secondNumber;
17 |
18 | return result;
19 | }
20 |
21 | console.log(bigNumberRule());
22 |
23 | //랜덤으로 숫자 고르기
24 | function array(arrayLength) {
25 | const compareNumbers = new Set();
26 | while (compareNumbers.size != arrayLength) {
27 | compareNumbers.add(Math.floor(Math.random() * 9 + 1) + "");
28 | }
29 | return [...compareNumbers];
30 | }
31 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/implement/상하좌우.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 | const boxsize = +rl.question("크기는 어떻게 될까요?");
3 | const move = rl
4 | .question("움직인 방향은?(R: 오른쪽, L: 왼쪽, U:위, D: 아래)")
5 | .split(" ");
6 |
7 | const dy = [0, 0, -1, 1];
8 | const dx = [1, -1, 0, 0];
9 | const direction = ['R', 'L', 'U', 'D'];
10 |
11 | let x, y, nx, ny;
12 | x = y = 1;
13 | nx = ny = 0;
14 |
15 | for (let i of move) {
16 | let position = direction.indexOf(i);
17 |
18 | nx = x + dx[position];
19 | ny = y + dy[position];
20 |
21 | if (!nx || !ny || nx > boxsize || ny > boxsize) {
22 | continue;
23 | }
24 |
25 | x = nx;
26 | y = ny;
27 | }
28 |
29 | console.log(`${x} ${y}`);
30 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/implement/시각.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | const H = +rl.question("몇 시까지 할껀데 딱 말혀");
4 | let count = 0;
5 |
6 | for (let h = 0; h < H + 1; h++) {
7 | for (let m = 0; m < 60; m++) {
8 | for (let s = 0; s < 60; s++) {
9 | let time = `${h}:${m}:${s}`;
10 | if (time.match(/[3]/g)) {
11 | count++;
12 | }
13 | }
14 | }
15 | }
16 | console.log(count);
17 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/implement/왕실의나이트.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | const location = rl.question("나이트의 현재 위치 브리핑해").split("");
4 | const rows = ["a", "b", "c", "d", "e", "f", "g", "h"];
5 | const columns = ["1", "2", "3", "4", "5", "6", "7", "8"];
6 | const moves = [[-2, -1], [-2, 1], [2, -1], [2, 1], [-1, -2], [-1, 2], [1, -2], [1, 2]];
7 |
8 | let count = 0;
9 | let nextRow, nextColumn;
10 |
11 | for (let i of moves) {
12 | nextColumn = nextRow = 0;
13 | nextRow = rows.indexOf(location[0]) + 1 + i[0];
14 | nextColumn = columns.indexOf(location[1]) + 1 + i[1];
15 | if (nextRow < 9 && nextRow > 0 && nextColumn < 9 && nextColumn > 0) {
16 | count++;
17 | }
18 | }
19 | console.log(count);
20 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/2016년.js:
--------------------------------------------------------------------------------
1 | function solution(a, b) {
2 | const days = ["FRI","SAT","SUN","MON","TUE","WED","THU"];
3 | const dates = [31,29,31,30,31,30,31,31,30,31,30,31];
4 | let week = -1;
5 |
6 | for( let month = 1; month < a+1; month++ ) {
7 | for( let day = 1; day <= dates[month-1]; day++ ) {
8 | week = week + 1;
9 | if( week == 7 ){
10 | week = 0;
11 | }
12 | if( a==month && b == day ){
13 | return days[week];
14 | }
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/3진법뒤집기.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let str = n.toString(3).split('').reverse().join('');
3 |
4 | let num = parseInt (str, 3);
5 | return num;
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/k번째수.js:
--------------------------------------------------------------------------------
1 | function solution(array, commands) {
2 | var answer = [];
3 |
4 | answer = commands.map(num => {
5 | return array.slice(num[0] - 1, num[1]).sort((a, b) => a - b)[num[2] - 1];
6 | });
7 | return answer;
8 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/p와y개수는2가지.js:
--------------------------------------------------------------------------------
1 | function solution(s){
2 | const sToLower = s.toLowerCase().split("");
3 |
4 | let pp, yy;
5 | pp = yy = 0;
6 |
7 | for (let i = 0; i < sToLower.length; i++) {
8 | if (sToLower[i] === 'p'){
9 | pp++;
10 | } else if (sToLower[i] === 'y') {
11 | yy++;
12 | }
13 | }
14 |
15 | return pp === yy;
16 | }
17 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/x만큼간격이있는n개의숫자.js:
--------------------------------------------------------------------------------
1 | function solution(x, n) {
2 | const answer = [x];
3 |
4 | let i = 1;
5 | let plus = x;
6 |
7 | while (i !== n) {
8 | plus += x;
9 | answer.push(plus);
10 | i++;
11 | }
12 | return answer;
13 | }
14 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/가운데글자가져오기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | const word = s.split('');
3 | const length = word.length % 2 ? odd(word) : even(word); // 변수명을 length로 선언한 이유? -> result나 centerWord 등과 같이 변수가 가진 값이 무엇인지 알도록 해주어야 함. 함수로 빼준 것 정말 잘한 일.
4 | return length;
5 | }
6 |
7 | function even (t) { // 함수명 뒤에는 공백 X
8 | // 이처럼 값을 바로 반환해주는 함수는 getEvenCenterWord와 같은 표현이 좋음.
9 | return `${t[t.length / 2 - 1] + t[t.length / 2] }`;
10 | }
11 |
12 | function odd (t) { // 함수명 뒤에는 공백 X
13 | // 이처럼 값을 바로 반환해주는 함수는 getOddCenterWord와 같은 표현이 좋음.
14 | return `${t[(t.length - 1) / 2]}`;
15 | }
16 |
17 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/같은숫자는싫어.js:
--------------------------------------------------------------------------------
1 | function solution(arr){
2 | const result = [];
3 | for(let seq = 0; seq <= arr.length; seq++) { // for 뒤에 공백. 나머지 너무 좋음. -> seq도 좋으나 되도록 인덱스는 i or idx를 사용.
4 | if(arr[seq] != arr[seq + 1]) { // if 뒤에 공백. != 가 아닌 !== 사용할 것.
5 | result.push(arr[seq]);
6 | }
7 | }
8 | return result;
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/나누어_떨어지는_숫자_배열.js:
--------------------------------------------------------------------------------
1 | function solution(arr, divisor) {
2 | const array = [];
3 | let num = 1;
4 | arr.forEach((element) => {
5 | if (element % divisor === 0) {
6 | array.push(element);
7 | }
8 | });
9 |
10 | if (array.length === 0) {
11 | array.push(-1);
12 | }
13 |
14 | return array.sort((a,b) => a - b);
15 | }
16 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/내적.js:
--------------------------------------------------------------------------------
1 | function solution(a, b) {
2 | let sum = 0;
3 | for (let i = 0; i < a.length; i++) {
4 | sum += (a[i] * b[i]);
5 | }
6 | return sum;
7 | }
8 |
9 | // return a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
10 | // reduce함수 알아야될듯...
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/두개_뽑아서_더하기.js:
--------------------------------------------------------------------------------
1 | function solution(numbers) {
2 | const sumArr = [];
3 | let sum, count = 0;
4 | numbers.forEach ((first, i) => {
5 | count += (i + 1);
6 | for (count; count < numbers.length; count++) {
7 | sum = first + numbers[count];
8 | sumArr.push(sum);
9 | }
10 | count = sum = 0;
11 | });
12 | return set(sumArr);
13 | }
14 |
15 |
16 | function set(setArr) {
17 | const result = new Set(setArr);
18 | return [...result].sort((a, b) => a - b);
19 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/두정수사이의합.js:
--------------------------------------------------------------------------------
1 | function solution(a, b) {
2 | let min, max, result; // Good!
3 | max = min = result = 0;
4 | if(a <= b) { // if 뒤 공백
5 | min = a;
6 | max = b;
7 | }else { // else 앞 공백
8 | min = b;
9 | max = a;
10 | } // 되도록이면 js에서 제공하는 기본 문법 활용하는 것이 보기도 좋고 속도도 빠름. -> Math.min() or Math.max()
11 |
12 | for (let num = min; num <= max; num++) { // Good!!
13 | result += num;
14 | }
15 | return result;
16 | }
17 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/모의고사.js:
--------------------------------------------------------------------------------
1 | function solution(answers) {
2 | const person = [1,2,3,4,5];
3 | const secPerson = [2,1,2,3,2,4,2,5];
4 | const thirdPerson = [3,3,1,1,2,2,4,4,5,5];
5 | const count = [0,0,0]
6 | const result = [];
7 | let seq = 0, max;
8 |
9 | answers.map ((value, se) => {
10 | if (value == person[se % person.length]) count[0]++;
11 | if (value == secPerson[se % secPerson.length]) count[1]++;
12 | if (value == thirdPerson[se % thirdPerson.length]) count[2]++;
13 | });
14 |
15 |
16 | max = Math.max(count[0],count[1],count[2]);
17 |
18 | if (max === count[0]) result.push(1);
19 | if (max === count[1]) result.push(2);
20 | if (max === count[2]) result.push(3);
21 |
22 | return result;
23 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/문자열_내_마음대로_정렬하기.js:
--------------------------------------------------------------------------------
1 | function solution(strings, n) {
2 | strings.sort(function(a,b){
3 | let first = a[n];
4 | let second = b[n];
5 | if(first === second){
6 | return (a > b) - (a < b);
7 | }else {
8 | return (first > second) - (first < second);
9 | }
10 | })
11 | return strings;
12 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/문자열_내림차순으로_배치.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | return s.split('').sort().reverse().join('');
3 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/문자열다루기기본.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | let check;
3 | if ( s.length == 4 || s.length == 6 ){
4 | check = s.replace( /[^0-9]/g, "" );
5 |
6 | if( check == s ){
7 | return true;
8 | }else{
9 | return false;
10 | }
11 | }else{
12 | return false;
13 | }
14 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/문자열정수로바꾸기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | let num = parseInt(s, 10);
3 | return num;
4 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/비밀지도.js:
--------------------------------------------------------------------------------
1 | function solution(n, arr1, arr2) {
2 | const decode = [];
3 | const fliter = " ";
4 | for (let i = 0; i < n; i++) {
5 | //or연산을 이용해 비밀지도1과 비밀지도 2 합침
6 | decode.push(arr1[i] | arr2[i]);
7 | decode[i] = decode[i].toString(2);
8 | //2진법으로 바꾼 후 #과 공백으로 바꿈
9 | decode[i] = decode[i].replace(/1/gi, "#");
10 | decode[i] = decode[i].replace(/0/gi, " ");
11 | //앞에 공백이 나왔을 경우 concat을 이용해 공백을 넣어줌
12 | if (decode[i].length !== n) {
13 | while (decode[i].length < n) {
14 | decode[i] = fliter.concat(decode[i]);
15 | }
16 | }
17 | }
18 | return decode;
19 | }
20 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/서울에서_김서방_찾기.js:
--------------------------------------------------------------------------------
1 | function solution(seoul) {
2 | let name;
3 |
4 | for(let seq = 0; seq < seoul.length; seq++){
5 | if(seoul[seq]=="Kim"){
6 | name=seq;
7 | }
8 | }
9 | const answer=`김서방은 ${name}에 있다`;
10 | return answer;
11 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/수박수박수.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | return ("수박").repeat(n / 2) + ((n % 2) ? "수" : ""); // repeat에서 n/2를 함으로써 불필요한 반복 횟수를 줄인 것 아주 칭찬.
3 | }
4 |
5 | ((n % 2) ? "수" : "") // 새로운 접근 Good!
6 | ["", "수"][n % 2] // 이러한 접근도 가능함 -> 사실 3항 연산자는 개발에서 지향하는 방식은 아님. 코드를 해석하기 어려워진다는 이유 때문.
7 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/실패율.js:
--------------------------------------------------------------------------------
1 | function solution(N, stages) {
2 | const temp = {},
3 | dicSort = [],
4 | result = [];
5 |
6 | let failNumbers = 0,
7 | total = stages.length;
8 |
9 | for (let i = 1; i < N + 1; i++) {
10 | let stageNum = stages.filter((el) => el === i).length;
11 | if (stageNum === 0) {
12 | failNumbers = 0;
13 | } else {
14 | failNumbers = stageNum / total;
15 | }
16 | total -= stageNum;
17 | temp[i] = failNumbers;
18 | }
19 |
20 | for (let failValue in temp) {
21 | dicSort.push([failValue, temp[failValue]]);
22 | }
23 |
24 | dicSort.sort((a, b) => b[1] - a[1]);
25 |
26 | dicSort.forEach((el) => result.push(parseInt(el[0])));
27 | return result;
28 | }
29 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/약수의_합.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | const temp = [];
3 | let sum = 0;
4 |
5 | for(let i = n; i >= n / i; i--) {
6 | if(!(n % i)) {
7 | temp.push(i);
8 | if(i === (n / i)){
9 | break;
10 | }
11 | temp.push(n / i);
12 | }
13 | }
14 |
15 | temp.forEach(el => {
16 | sum += el;
17 | })
18 | return sum;
19 | }
20 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/예산.js:
--------------------------------------------------------------------------------
1 | function solution(d, budget) {
2 | const sortDArr = d.sort((a,b) => a - b);
3 | let count = 0;
4 | sortDArr.forEach(ele => {
5 | budget -= ele;
6 | if(budget >= 0) {
7 | count++;
8 | }
9 | });
10 | return count;
11 | }
12 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/완주하지_못한_선수.js:
--------------------------------------------------------------------------------
1 | function solution(participant, completion) {
2 | const obj = {};
3 | for (let player of participant) {
4 | if (player in obj) {
5 | obj[player] += 1; //객체에 있으면 키의 값에 1추가
6 | } else {
7 | obj[player] = 1;
8 | }
9 | }
10 |
11 | for (let finisher of completion) {
12 | obj[finisher] -= 1; //해당 키의 값을 -1
13 | }
14 |
15 | for (let player of participant) {
16 | if (obj[player] === 1) {
17 | return player;
18 | }
19 | }
20 | }
21 | console.log(solution(['leo', 'kiki', 'eden'], ['eden', 'kiki']));
22 | console.log(solution(['mislav', 'stanko', 'mislav', 'ana'],['stanko', 'ana', 'mislav']));
23 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/이상한문자만들기.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | function solution(s) {
4 | const midArr = [];
5 | const finArr = [];
6 | s.split(" ").forEach((strArr) => {
7 | strArr.split("").forEach((str, seq) => {
8 | if ((seq + 1) % 2 !== 0) {
9 | str = str.toUpperCase();
10 | } else {
11 | str = str.toLowerCase();
12 | }
13 | midArr.push(str);
14 | });
15 | finArr.push(midArr.join(''));
16 | midArr.length = 0; //배열 초기화
17 | });
18 | return finArr.join(' ');
19 | }
20 | console.log(solution("try hello world"));
21 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/자릿수더하기.js:
--------------------------------------------------------------------------------
1 | function solution(n)
2 | {
3 | const div = (n+"").split('');
4 | let sum = 0;
5 | div.forEach(ele => {
6 | sum += parseFloat(ele);
7 | })
8 | return sum;
9 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/정수_내림차순으로_배치하기.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | const newNumber = (n + '');
3 | return Number(newNumber.split('').sort().reverse().join(''));
4 | }
5 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/제일작은수제거하기.js:
--------------------------------------------------------------------------------
1 | function solution(arr) {
2 | const minNumber = Math.min.apply(null, arr);
3 | if (arr.length < 2) {
4 | arr[0] = -1;
5 | }else {
6 | arr.splice(arr.indexOf(minNumber), 1);
7 | }
8 |
9 | return arr;
10 | }
11 |
12 |
13 | // 이렇게도 할 수 있음.
14 | function solutions(arr) {
15 | arr.splice(arr.indexOf(Math.min(...arr)), 1);
16 | return arr.length === 0 ? [-1] : arr;
17 | }
18 | //WOW!!!!
19 |
20 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/체육복.js:
--------------------------------------------------------------------------------
1 | function solution(n, lost, reserve) {
2 | const clothes = [];
3 | let count = 0;
4 | while (clothes.length < n) {
5 | clothes.push(1);
6 | }
7 | reserve.forEach(el => {
8 | clothes.splice(el - 1, 1, 2);
9 | });
10 | lost.forEach(el => {
11 | clothes.splice(el - 1, 1, (clothes[el - 1] - 1));
12 | });
13 |
14 | for (let i = 0; i < n; i++) {
15 | if (!clothes[i]) {
16 | temp(clothes, i);
17 | }
18 | }
19 |
20 | clothes.forEach(el => {
21 | if (el >= 1) {
22 | count++;
23 | }
24 | });
25 | return count;
26 | }
27 |
28 | function temp(clothes, i) {
29 | if (clothes[i + 1] === 2) {
30 | clothes[i + 1]--;
31 | clothes[i]++;
32 | }else if (clothes[i - 1] === 2) { // else 앞에
33 | clothes[i - 1]--;
34 | clothes[i]++;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/최대공약수와최소공배수.js:
--------------------------------------------------------------------------------
1 | function solution(n, m) {
2 | const arr = [];
3 | let minNum = Math.min(n, m);
4 | let maxNum = Math.max(n, m);
5 |
6 | arr.push(max(maxNum, minNum));
7 | arr.push(min(maxNum, minNum));
8 |
9 | return arr;
10 | }
11 |
12 | function max (maxNum, minNum) {
13 | return (maxNum % minNum) === 0 ? minNum : max(minNum, maxNum % minNum);
14 | }
15 |
16 | function min (maxNum, minNum) {
17 | return maxNum * minNum / max(maxNum, minNum);
18 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/콜라츠추측.js:
--------------------------------------------------------------------------------
1 | function solution(num) {
2 | let count = 0;
3 | for (let i = 0; i < 500; i ++) {
4 | if (num === 1) {
5 | return count;
6 | }
7 | if (num % 2) {
8 | num = num * 3 + 1;
9 | count++;
10 | }else {
11 | num = num / 2;
12 | count++;
13 | }
14 | }
15 | if (num !== 1) {
16 | return -1;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/크레인인형뽑기게임.js:
--------------------------------------------------------------------------------
1 | function solution(board, moves) {
2 | let number, result, count, crane;
3 | const pocket = [];
4 | const boardSize = board.length;
5 | number = result = 0;
6 | moves.forEach((move) => {
7 | count = 0;
8 | crane = move - 1;
9 | while (true) {
10 | if (board[count][crane]) {
11 | if (
12 | pocket.length &&
13 | pocket[pocket.length - 1] === board[count][crane]
14 | ) {
15 | pocket.pop();
16 | result += 2;
17 | } else {
18 | pocket.push(board[count][crane]);
19 | }
20 | board[count][crane] = 0;
21 | break;
22 | }
23 | count++;
24 | if (count === boardSize) {
25 | break;
26 | }
27 | }
28 | });
29 | return result;
30 | }
31 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/하샤스수.js:
--------------------------------------------------------------------------------
1 | function solution(x) {
2 | const numbers = String(x).split('');
3 | let sum = 0;
4 | for (let num of numbers) {
5 | sum += parseFloat(num);
6 | }
7 | if (x % sum === 0) {
8 | return true;
9 | }
10 | return false;
11 | }
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level1/핸드폰_번호_가리기.js:
--------------------------------------------------------------------------------
1 | function solution(phone_number) {
2 | const backNum = phone_number.substr(-4, 4),
3 | frontNum = phone_number.length - 4;
4 | let emptyArr = [];
5 | for(let i = 0; i < frontNum; i++){
6 | emptyArr.push('*');
7 | }
8 | emptyArr = emptyArr.join('');
9 | return emptyArr.concat(backNum);
10 | }
11 |
12 | /*
13 | 좋은 코딩!
14 | return "*".repeat(phone_number.length - 4) + phone_number.slice(-4);
15 | */
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level2/기능개발.js:
--------------------------------------------------------------------------------
1 | function solution(progresses, speeds) {
2 | const result = [];
3 |
4 | while (speeds.length > 0) {
5 | for (let i in speeds) {
6 | if (progresses[i] < 100) {
7 | progresses[i] += speeds[i];
8 | }
9 | }
10 |
11 | let count = 0;
12 | while (progresses[0] > 99) {
13 | progresses.shift();
14 | speeds.shift();
15 | count++;
16 | }
17 | if (count > 0) {
18 | result.push(count);
19 | }
20 | }
21 |
22 | return result;
23 | }
24 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level2/다리를지나는트럭.js:
--------------------------------------------------------------------------------
1 | function solution(bridgeLength, weight, truckWeights) {
2 | const firstTruck = truckWeights.shift();
3 | const bridge = new Array(bridgeLength - 1).fill(0);
4 |
5 | bridge.push(firstTruck);
6 |
7 | let bridgeWeight = firstTruck;
8 | let time = 1;
9 |
10 | while (bridgeWeight) {
11 | bridgeWeight = bridgeWeight - bridge.shift();
12 |
13 | const nextTruckWeight = truckWeights[0];
14 |
15 | if (weight > bridgeWeight + nextTruckWeight - 1) {
16 | bridge.push(nextTruckWeight);
17 | truckWeights.shift();
18 | bridgeWeight = bridgeWeight + nextTruckWeight;
19 | } else {
20 | bridge.push(0);
21 | }
22 | time++;
23 | }
24 | return time;
25 | }
26 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level2/스킬트리.js:
--------------------------------------------------------------------------------
1 | function solution(skill, skill_trees) {
2 | let count = 0;
3 | let i = 0;
4 | while (i < skill_trees.length) {
5 | let skillSeq = skill_trees[i].match(new RegExp(`[${skill}]`, "g"));
6 | if (skillSeq === null) {
7 | count++;
8 | i++;
9 | continue;
10 | }
11 | let changeStr = skillSeq.join("");
12 |
13 | if (skill.includes(changeStr) && changeStr.includes(skill[0])) {
14 | count++;
15 | }
16 | i++;
17 | }
18 | return count;
19 | }
20 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level2/위장.js:
--------------------------------------------------------------------------------
1 | const div = {};
2 | const midArr = [];
3 | let divNum;
4 | function solution(clothes) {
5 | for (let clothe of clothes) { // clothes로 배열은 표시하였으니 엘리먼트는 clothe가 좋겠다. clo는 이해하기 어려운 변수로 판단됨.
6 | if (div[clothe[1]] === undefined) {
7 | div[clothe[1]] = clothe[0];
8 | }else {
9 | div[clothe[1]] += `,${clothe[0]}`;
10 | }
11 | }
12 |
13 | for(let i in div) { // 인덱스 변수명은 짧을 수록 좋다. ex) i, idx
14 | midArr.push(div[i].split(',').length);
15 | }
16 | return parseInt(calcurator(midArr)); // parseInt()된 변수를 리턴해주는게 더 좋겠다.
17 | }
18 |
19 | function calcurator(midArr) {
20 | if (midArr.length === 1) {
21 | return midArr.join();
22 | }
23 | while (midArr.length > 1) {
24 | divNum = midArr.splice(0, 2);
25 | midArr.unshift((divNum[0] + 1) * (divNum[1] + 1) - 1);
26 | }
27 | return midArr.join();
28 | }
29 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level2/타겟넘버.js:
--------------------------------------------------------------------------------
1 | function solution(numbers, target) {
2 | return dfs(0, numbers, target);
3 | }
4 |
5 | function dfs(startIndex, numbers, target) {
6 | return (function cal(num, index) {
7 | if (index === numbers.length) {
8 | if (num === target) return 1;
9 | return 0;
10 | }
11 | let first = num + numbers[index];
12 | let second = num - numbers[index];
13 | return cal(first, index + 1) + cal(second, index + 1);
14 | })(0, startIndex);
15 | }
16 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/level2/프린터.js:
--------------------------------------------------------------------------------
1 | function solution(print, location) {
2 | let count = 0;
3 |
4 | while (print.length) {
5 | let first = print.shift();
6 | if (print.some((v) => v > first)) {
7 | print.push(first);
8 | } else {
9 | count++;
10 | if (location === 0) break;
11 | }
12 |
13 | if (location === 0) {
14 | location = print.length - 1;
15 | continue;
16 | }
17 | location--;
18 | }
19 | return count;
20 | }
21 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/sort/두배열의원소교체.js:
--------------------------------------------------------------------------------
1 | const line = require("fs").readFileSync("/dev/stdin", "utf8");
2 | let input = line.trim().split("\n");
3 |
4 | const [N, K] = input[0].split(" ").map(Number);
5 |
6 | const A = input[1].split(" ").map(Number);
7 | const B = input[2].split(" ").map(Number);
8 |
9 | A.sort((a, b) => a - b);
10 | B.sort((a, b) => b - a);
11 |
12 | for (let i = 0; i < K; i++) {
13 | //두번째 방법(비효율적)
14 | // const aMin = Math.min.apply(null, arrStore[0]);
15 | // const bMax = Math.max.apply(null, arrStore[1]);
16 | // const alocation = arrStore[0].indexOf(aMin);
17 | // const blocation = arrStore[1].indexOf(bMax);
18 | if (A[i] >= B[i]) break;
19 | [A[i], B[i]] = [B[i], A[i]];
20 | }
21 |
22 | const result = A.reduce((a, b) => {
23 | return a + b;
24 | });
25 |
26 | console.log(result);
27 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/sort/성적이낮은순서로학생출력하기.js:
--------------------------------------------------------------------------------
1 | const line = require("fs").readFileSync("/dev/stdin", "utf8");
2 | let input = line.trim().split("\n");
3 |
4 | const N = +input[0];
5 | const students = [];
6 | let name = "";
7 | for (let i = 1; i < N + 1; i++) {
8 | const student = input[i].split(" ");
9 | students.push({ name: student[0], value: +student[1] });
10 | }
11 |
12 | // students.sort((a, b) => {
13 | // if (a.value < b.value) return -1;
14 | // if (a.value > b.value) return 1;
15 | // return 0;
16 | // });
17 | // 아래처럼 하면 됨.
18 | students.sort((a, b) => a.value - b.value);
19 |
20 | students.forEach((el) => {
21 | process.stdout.write(`${el} `);
22 | });
23 |
--------------------------------------------------------------------------------
/coding-test/kimjiwon/sort/위에서아래로.js:
--------------------------------------------------------------------------------
1 | const line = require("fs").readFileSync("/dev/stdin", "utf8");
2 | let input = line.trim().split("\n");
3 | let numberArr = [];
4 | const N = +input[0];
5 |
6 | for (let i = 1; i < N + 1; i++) {
7 | numberArr.push(+input[i]);
8 | }
9 |
10 | numberArr.sort((a, b) => b - a);
11 | console.log(numberArr.join(" "));
12 |
--------------------------------------------------------------------------------
/coding-test/minjae/BackJoon/5단계-1차원배열/숫자의 개수.js:
--------------------------------------------------------------------------------
1 | function solution(n, m, x) {
2 | const COMPARISON_LENGTH = 10;
3 | const comparisonList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
4 |
5 | const multipleNum = n * m * x;
6 | const multipleList = multipleNum.toString().split('');
7 |
8 | const answer = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
9 | for (let i = 0; i < COMPARISON_LENGTH; i++) {
10 | for (let j = 0; j < COMPARISON_LENGTH; j++) {
11 | if (multipleList[i] === comparisonList[j]) answer[j] += 1;
12 | }
13 | }
14 | return answer;
15 | }
16 |
17 | console.log(solution(150, 266, 427));
--------------------------------------------------------------------------------
/coding-test/minjae/BackJoon/6단계-함수/셀프넘버.js:
--------------------------------------------------------------------------------
1 | const NUMBER_RANGE = 10000;
2 | const selfNumberList = [];
3 |
4 | function solution() {
5 | for (let i = 1; i <= NUMBER_RANGE; i++) {
6 | extractSelfNumber(i);
7 | }
8 |
9 | for (let i = 1; i <= NUMBER_RANGE; i++) {
10 | if (!selfNumberList.includes(i)) console.log(i);
11 | }
12 | }
13 |
14 | function extractSelfNumber(n) {
15 | let selfNumber = 0;
16 |
17 | if (n < 10) selfNumber = 2 * n;
18 | else if (n < 100) selfNumber = n + parseInt(n / 10) + (n % 10);
19 | else if (n < 1000) selfNumber = n + parseInt(n / 100) + parseInt((n % 100) / 10) + (n % 10);
20 | else selfNumber = n + parseInt(n / 1000) + parseInt((n % 1000) / 100) + parseInt((n % 100) / 10) + (n % 10);
21 |
22 | selfNumberList.push(selfNumber);
23 | }
24 |
25 | solution();
--------------------------------------------------------------------------------
/coding-test/minjae/BackJoon/6단계-함수/한수.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | //전역 변수
8 | const input = [];
9 |
10 | function solution(n) {
11 | const arithmeticSequence = [];
12 |
13 | let [one, ten, hundred] = [0, 0, 0];
14 |
15 | for (let i = 1; i <= n; i++) {
16 | if (i < 100) arithmeticSequence.push(i);
17 | else {
18 | hundred = parseInt(i / 100);
19 | ten = parseInt((i % 100) / 10);
20 | one = i % 10;
21 | if ((one - ten) === (ten - hundred)) arithmeticSequence.push(i);
22 | }
23 | }
24 | return arithmeticSequence.length;
25 | }
26 |
27 | rl.on("line", function (line) {
28 | input.push(line);
29 | }).on("close", function () {
30 | const range = parseInt(input.shift());
31 |
32 | console.log(solution(range));
33 | })
--------------------------------------------------------------------------------
/coding-test/minjae/BackJoon/7단계-문자열/그룹단어체커.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | rl.on("line", function (line) {
10 | input.push(line);
11 | }).on("close", function () {
12 | const testCase = parseInt(input.shift());
13 |
14 | let count = 0;
15 |
16 | for (let i = 0; i < testCase; i++) {
17 | const result = [];
18 | const word = input[i].split("");
19 |
20 | let checkGroupWord = true;
21 |
22 | word.map(el => {
23 | if (result.indexOf(el) === -1) result.push(el);
24 | else {
25 | if (result.indexOf(el) !== result.length - 1) checkGroupWord = false;
26 | }
27 | })
28 | if (checkGroupWord) count++;
29 | }
30 | console.log(count);
31 | });
--------------------------------------------------------------------------------
/coding-test/minjae/BackJoon/7단계-문자열/다이얼.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | rl.on("line", function (line) {
10 | input.push(line);
11 | }).on("close", function () {
12 | const alphabetList = input.shift().split("");
13 | const dial = [3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10];
14 | const asciiA = 'A'.charCodeAt();
15 |
16 | let result = 0;
17 | let asciiAlphabet = 0;
18 |
19 | alphabetList.map(alphabet => {
20 | asciiAlphabet = alphabet.charCodeAt(0);
21 | result += dial[asciiAlphabet - asciiA];
22 | });
23 |
24 | console.log(result);
25 | });
--------------------------------------------------------------------------------
/coding-test/minjae/BackJoon/7단계-문자열/단어공부.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | rl.on("line", function (line) {
10 | input.push(line);
11 | }).on("close", function () {
12 | const result = [];
13 | const word = input.shift().toUpperCase().split("");
14 |
15 | let obj = {};
16 | let maxWordCount = 0;
17 |
18 | for (let i = 0; i < word.length; i++) {
19 | obj[word[i]] = 0;
20 | }
21 |
22 | for (let i = 0; i < word.length; i++) {
23 | obj[word[i]]++;
24 | }
25 |
26 | maxWordCount = Math.max(...Object.values(obj));
27 |
28 | for (let el in obj) {
29 | if (obj[el] === maxWordCount) result.push(el);
30 | }
31 |
32 | if(result.length > 1) return console.log('?');
33 | else return console.log(result[0]);
34 | })
--------------------------------------------------------------------------------
/coding-test/minjae/BackJoon/7단계-문자열/문자열-반복.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | let input = [];
8 |
9 | function solution(repeatCount, str) {
10 | const result = [];
11 | const strList = str.split("");
12 |
13 | for (let i = 0; i < strList.length; i++) {
14 | for (let j = 0; j < repeatCount; j++) {
15 | result.push(strList[i]);
16 | }
17 | }
18 | return result.join("");
19 | }
20 |
21 | rl.on("line", function (line) {
22 | input.push(line);
23 | }).on("close", function () {
24 | const testCase = parseInt(input.shift());
25 |
26 | for (let i = 0; i < testCase; i++) {
27 | let [repeatCount, str] = input.shift().split(" ");
28 |
29 | console.log(solution(repeatCount, str));
30 | }
31 | })
--------------------------------------------------------------------------------
/coding-test/minjae/BackJoon/7단계-문자열/크로아티아알파벳.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | rl.on("line", function (line) {
10 | input.push(line);
11 | }).on("close", function () {
12 | const alphabetList = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z='];
13 |
14 | let word = input.shift();
15 |
16 | alphabetList.map(alphabet => {
17 | while (word.includes(alphabet)) {
18 | word = word.replace(alphabet, 'a');
19 | }
20 | })
21 |
22 | console.log(word.length);
23 | });
--------------------------------------------------------------------------------
/coding-test/minjae/Implement/구현-상하좌우.js:
--------------------------------------------------------------------------------
1 | function solution(n, a) {
2 | const answer = [1, 1];
3 | const moves = a.split('');
4 | const moveTypes = ['L', 'R', 'U', 'D'];
5 | const dx = [0, 0, -1, 1];
6 | const dy = [-1, 1, 0, 0];
7 |
8 | let x, y;
9 | x = y = 0;
10 | for (let move of moves) {
11 | for (let i = 0; i < moveTypes.length; i++) {
12 | if (move == moveTypes[i]) {
13 | x = answer[0] + dx[i];
14 | y = answer[1] + dy[i];
15 | }
16 | if (x < 1 || y < 1 || x > n || y > n) {
17 | continue;
18 | }
19 | answer[0] = x;
20 | answer[1] = y;
21 | }
22 | }
23 | return answer;
24 | }
25 |
26 | console.log(solution(5, "RRRRRDDDDDLL"));
27 | console.log(solution(5, "RRRUDD"));
--------------------------------------------------------------------------------
/coding-test/minjae/Implement/구현-시각.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let count = 0;
3 |
4 | for (let i = 0; i <= n; i++) {
5 | for (let j = 0; j < 60; j++) {
6 | for (let k = 0; k < 60; k++) {
7 | if ((i % 10 === 3)
8 | || (Math.floor(j / 10) === 3)
9 | || (j % 10 === 3)
10 | || (Math.floor(k / 10) === 3)
11 | || (k % 10) === 3) {
12 | count++;
13 | }
14 | }
15 | }
16 | }
17 | return count;
18 | }
19 | console.log(solution(5));
--------------------------------------------------------------------------------
/coding-test/minjae/Implement/구현-왕실의-게임.js:
--------------------------------------------------------------------------------
1 | function solution(n, m) {
2 | const chessLength = 8;
3 | const x = n.charCodeAt(0) - 'a'.charCodeAt(0) + 1;
4 | const y = m.charCodeAt(0) - '0'.charCodeAt(0);
5 | const stepList = [
6 | [-2 , -1 ], [-1 , -2], [1, -2], [2, -1 ],
7 | [2, 1 ], [1, 2], [-1, 2], [-2, 1]
8 | ];
9 |
10 | let count = 0;
11 | let nx, ny;
12 | nx = ny = 0;
13 | for (let i = 0; i < stepList.length; i++) {
14 | nx = x + stepList[i][0];
15 | ny = y + stepList[i][1];
16 |
17 | if (nx >= 1 && ny >= 1 && nx <= chessLength && ny <= chessLength) {
18 | count++;
19 | }
20 | }
21 | return count;
22 | }
23 | console.log(solution('a', '1'));
24 | console.log(solution('f', '6'));
25 | console.log(solution('h', '8'));
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/3진법-뒤집기.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | const reverseTernary = n.toString(3).split('').reverse();
3 | let answer = 0;
4 |
5 | let sum ='';
6 | reverseTernary.forEach(n => sum += n);
7 | return answer = parseInt(sum, 3);
8 | }
9 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/k번째수.js:
--------------------------------------------------------------------------------
1 | function solution(array, commands) {
2 | const answer = [];
3 |
4 | let arr = [];
5 | for(let command of commands){
6 | arr = array.slice(command[0] - 1, command[1]).sort((a, b) => a - b);
7 | answer.push(arr[command[2] - 1]);
8 | }
9 | return answer;
10 | }
11 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/가운데-글자-가져오기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | const middle = Math.floor(s.length / 2);
3 | if (s.length % 2) {
4 | return s.slice(middle, middle + 1)
5 | } else {
6 | return s.slice(middle - 1, middle + 1)
7 | }
8 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/나누어-떨어지는-숫자-배열.js:
--------------------------------------------------------------------------------
1 | function solution(arr, divisor) {
2 | const answer = [];
3 |
4 | for (let i = 0; i < arr.length; i++) {
5 | if (arr[i] % divisor === 0) {
6 | answer.push(arr[i]);
7 | }
8 | }
9 | if (answer.length === 0) {
10 | answer.push(-1);
11 | }
12 | return answer.sort((a, b) => a - b);
13 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/내적.js:
--------------------------------------------------------------------------------
1 | function solution(a, b) {
2 | const arr = [];
3 |
4 | let answer = 0;
5 | for (let i = 0; i < a.length; i++) {
6 | arr.push(a[i] * b[i]);
7 | }
8 | return arr.reduce((a, b) => a + b);
9 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/데모-테스트.js:
--------------------------------------------------------------------------------
1 | function solution(v) {
2 | const answer = [];
3 |
4 | for (let i = 0; i < v[i].length; i++) {
5 | if (v[0][i] == v[1][i]) answer.push(v[2][i]);
6 | if (v[1][i] == v[2][i]) answer.push(v[0][i]);
7 | if (v[2][i] == v[0][i]) answer.push(v[1][i]);
8 | }
9 | return answer;
10 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/두-수-사이의-합.js:
--------------------------------------------------------------------------------
1 | function solution(a, b) {
2 | const MIN = Math.min(a, b),
3 | MAX = Math.max(a, b);
4 |
5 | let answer = 0;
6 | for (let num = MIN; num <= MAX; num++) {
7 | answer += num;
8 | }
9 |
10 | return answer;
11 | }
12 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/두개-뽑아서-더하기.js:
--------------------------------------------------------------------------------
1 | function solution(numbers) {
2 | const set = new Set();
3 | let answer = [];
4 |
5 | for (let i = 0; i < numbers.length; i++) {
6 | for (let j = 0; j < numbers.length; j++) {
7 | if (i !== j) {
8 | set.add(numbers[i] + numbers[j]);
9 | }
10 | }
11 | }
12 |
13 | set.forEach(number => answer.push(number));
14 | answer = Array.from(set);
15 |
16 | return answer.sort((a, b) => (a - b));
17 | }
18 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/문자열-내-마음대로-정렬.js:
--------------------------------------------------------------------------------
1 | function solution(strings, n) {
2 | let answer = [];
3 | answer = strings.sort((a,b) => {
4 | if (a[n] > b[n]) {
5 | return 1
6 | } else if (a[n] < b[n]) {
7 | return -1
8 | } else {
9 | return a.localeCompare(b)
10 | }
11 | })
12 | return answer;
13 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/문자열-내림차순으로-배치.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | return s.split('').sort().reverse().join('');
3 | }
4 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/문자열-다루기-기본.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | const len = s.length;
3 | if (len === 4 || len === 6) {
4 | return s.split('').every(arr => !(isNaN(arr)));
5 | }
6 | return false;
7 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/문자열내-p와y-개수.js:
--------------------------------------------------------------------------------
1 | function solution(s){
2 | const lowerString = s.toLowerCase();
3 |
4 | let pCounter, yCounter;
5 | pCounter = yCounter = 0;
6 |
7 | for (let i = 0; i < lowerString.length; i++) {
8 | if (lowerString[i].includes('p')) {
9 | pCounter++;
10 | } else if (lowerString[i].includes('y')) {
11 | yCounter++;
12 | }
13 | }
14 | return pCounter === yCounter
15 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/서울에서-김서방-찾기.js:
--------------------------------------------------------------------------------
1 | function solution(seoul) {
2 | let answer = '';
3 | for (let i = 0; i < seoul.length; i++) {
4 | if (seoul[i] === "Kim") {
5 | answer = `김서방은 ${i}에 있다`;
6 | break;
7 | }
8 | }
9 | return answer;
10 | }
11 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/수박수박수.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let answer = '';
3 | for (let i = 0; i < n; i++) {
4 | if (i % 2) {
5 | answer += '박';
6 | } else if(!(i % 2)) {
7 | answer += '수';
8 | }
9 | }
10 |
11 | return answer;
12 | }
13 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/시저-암호.js:
--------------------------------------------------------------------------------
1 | function solution(s, n) {
2 | const arr = s.split('');
3 |
4 | let result = '';
5 | for (let i = 0; i < s.length; i++) {
6 | const ascii = arr[i].charCodeAt(); // 반복문 안에서의 변수 선언은 좋지 않습니다!ㅎㅎ
7 |
8 | if (arr[i] == ' ') {
9 | result += ' ';
10 | } else if (ascii > 90) {
11 | result += String.fromCharCode((ascii + n - 97) % 26 + 97);
12 | } else {
13 | result += String.fromCharCode((ascii + n - 65) % 26 + 65);
14 | }
15 | }
16 | return result
17 | }
18 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/약수의-합.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let answer = 0;
3 | for (let i = 1; i <= n; i++) {
4 | if (n % i == 0) {
5 | answer += i;
6 | }
7 | }
8 | return answer
9 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/예산.js:
--------------------------------------------------------------------------------
1 | function solution(d, budget) {
2 | let sum = 0;
3 | let arr = d.sort((a, b) => a - b);
4 | let count = 0;
5 |
6 | for (let el of arr) {
7 | sum += el
8 | if (sum <= budget) {
9 | count++;
10 | }
11 | }
12 | return count;
13 | }
14 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/완주하지-못한-선수-객체.js:
--------------------------------------------------------------------------------
1 | function solution(participant, completion) {
2 | const obj = {};
3 |
4 | for(let player of participant){
5 | if(!obj[player]){
6 | obj[player] = 1;
7 | } else {
8 | obj[player] += 1;
9 | }
10 | }
11 |
12 | for (let finish of completion){
13 | if(obj[finish]){
14 | obj[finish] -= 1;
15 | }
16 | }
17 |
18 | for (let player of participant) {
19 | if (obj[player] === 1) {
20 | return player;
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/완주하지-못한-선수.js:
--------------------------------------------------------------------------------
1 | function solution(participant, completion) {
2 | participant.sort();
3 | completion.sort();
4 |
5 | for (let i in participant) {
6 | if (participant[i] !== completion[i]) {
7 | return participant[i];
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/이상한-문자-만들기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | const array = s.split('');
3 | const answer = [];
4 |
5 | let count = 1;
6 | for (let i = 0; i < array.length; i++) {
7 | if (array[i] == ' ') {
8 | count = 0;
9 | answer.push(' ');
10 | } else if (count % 2 !== 0) {
11 | answer.push(array[i].toUpperCase())
12 | } else {
13 | answer.push(array[i].toLowerCase())
14 | }
15 | count++;
16 | }
17 | return answer.join('');
18 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/자릿수-더하기.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | const arr = n.toString().split('');
3 |
4 | let sum = 0;
5 | for (let el of arr) {
6 | sum += parseInt(el);
7 | }
8 | return sum;
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/자연수-뒤집어-배열로-만들기.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | const answer = [];
3 | const reverseArray = n.toString().split('').reverse();
4 |
5 | for (let el of reverseArray) {
6 | answer.push(parseInt(el))
7 | }
8 | return answer;
9 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/정수-제곱근-판별.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | const sqrtNum = Math.floor(Math.sqrt(n));
3 |
4 | let answer = -1;
5 | if (n / sqrtNum === sqrtNum) {
6 | answer = (sqrtNum + 1) * (sqrtNum + 1);
7 | }
8 | return answer
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/제일-작은수-제거.js:
--------------------------------------------------------------------------------
1 | function solution(arr) {
2 | const answer = [];
3 | const MIN = Math.min.apply(null,arr);
4 |
5 | if (arr.length == 1) {
6 | answer.push(-1);
7 | }
8 |
9 | for (let el of arr) {
10 | if (el !== MIN) {
11 | answer.push(el);
12 | }
13 | }
14 | return answer;
15 | }
16 |
17 |
18 | ==============================
19 | // 이렇게 할 수도 있습니다 ㅎㅎ
20 | function solution(arr) {
21 | arr.splice(arr.indexOf(Math.min(...arr)), 1);
22 | return arr.length === 0 ? [-1] : arr;
23 | }
24 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/최대공약수-최소공배수.js:
--------------------------------------------------------------------------------
1 | function solution(n, m) {
2 | let answer = [];
3 | answer.push(greatestCommonDivisor(n, m));
4 | answer.push(leastCommonMultiple(n, m));
5 |
6 | return answer;
7 |
8 | }
9 | //최대 공약수
10 | function greatestCommonDivisor(minNum, maxNum) {
11 | return (maxNum % minNum) === 0 ?
12 | minNum : greatestCommonDivisor(maxNum, minNum % maxNum);
13 | }
14 | //최소 공배수
15 | function leastCommonMultiple(minNum, maxNum) {
16 | return minNum * maxNum / greatestCommonDivisor(minNum, maxNum);
17 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/콜라츠-추측.js:
--------------------------------------------------------------------------------
1 | function solution(num) {
2 | let count = 0;
3 | while(true){
4 | if (num == 1) return count;
5 |
6 | if (num % 2 == 1) {
7 | num = num * 3 + 1;
8 | count++;
9 | } else if (num % 2 == 0) {
10 | num = num / 2;
11 | count++;
12 | }
13 | if (count > 500) return -1;
14 | }
15 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/하샤드-수.js:
--------------------------------------------------------------------------------
1 | function solution(x) {
2 | const arrSum = x.toString().split('').reduce((a, b) => parseInt(a) + parseInt(b));
3 |
4 | return x % arrSum === 0 ? true : false;
5 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/핸드폰-번호-가리기.js:
--------------------------------------------------------------------------------
1 | count MOBILE_BACK_NUMBER_LENGTH = -4;
2 |
3 | function solution(phoneNumber) {
4 | const starNum = phoneNumber.split('').slice(MOBILE_BACK_NUMBER_LENGTH);
5 | const phoneNumberLength = phoneNumber.length - MOBILE_BACK_NUMBER_LENGTH;
6 |
7 | for (let i = 0; i < phoneNumberLength; i++) {
8 | starNum.unshift('*');
9 | }
10 | return starNum.join('');
11 | }
12 |
--------------------------------------------------------------------------------
/coding-test/minjae/Level1/행렬의-덧셈.js:
--------------------------------------------------------------------------------
1 | function solution(arr1, arr2) {
2 | const answer = [];
3 |
4 | for (let i = 0; i < arr1.length; i++) {
5 | const temp = [];
6 |
7 | for (let j = 0; j < arr1[i].length; j++) {
8 | temp.push(arr1[i][j] + arr2[i][j]);
9 | }
10 | answer.push(temp);
11 | }
12 | return answer;
13 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level2/기능개발.js:
--------------------------------------------------------------------------------
1 | function solution(progresses, speeds) {
2 | const answer = [];
3 |
4 | //Queue
5 | while (speeds.length > 0) {
6 | for (let i = 0; i < speeds.length; i++) {
7 | if (progresses[i] < 100) {
8 | progresses[i] += speeds[i];
9 | }
10 | }
11 |
12 | let count = 0;
13 | while (progresses[0] >= 100) {
14 | progresses.shift();
15 | speeds.shift();
16 | count++;
17 | }
18 | if (count > 0) {
19 | answer.push(count);
20 | }
21 | }
22 | return answer;
23 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level2/다음큰숫자.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let answer = 0;
3 | let count = 0;
4 | let binaryNumber = n.toString(2);
5 |
6 | for(let i = 0; i < binaryNumber.length; i++) {
7 | if (binaryNumber[i] === '1') count++;
8 | }
9 |
10 | while (true) {
11 | let answerCount = 0;
12 |
13 | n += 1;
14 | binaryNumber = n.toString(2);
15 |
16 | for (let i = 0; i < binaryNumber.length; i++) {
17 | if (binaryNumber[i] === '1') answerCount++;
18 | }
19 |
20 | if (answerCount === count) {
21 | return answer = n;
22 | }
23 | }
24 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level2/멀쩡한-사각형.js:
--------------------------------------------------------------------------------
1 | function solution(w, h) {
2 | return w * h - ((w + h) - greatestCommonDivisor(w, h));
3 | }
4 |
5 | function greatestCommonDivisor(minNum, maxNum) {
6 | return (maxNum % minNum) === 0 ?
7 | minNum : greatestCommonDivisor(maxNum, minNum % maxNum);
8 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level2/올바른-괄호.js:
--------------------------------------------------------------------------------
1 | function solution(s){
2 | const bracketList = s.split('');
3 | const temp = [];
4 |
5 | if (bracketList[0] === ')'
6 | || bracketList[bracketList.length - 1] === '(') {
7 | return false;
8 | }
9 |
10 | bracketList.forEach((bracket, i) => {
11 | bracket === '(' ? temp.push(i) : temp.pop();
12 | })
13 |
14 | return temp.length > 0 ? false : true;
15 | }
--------------------------------------------------------------------------------
/coding-test/minjae/Level2/이진변환-반복하기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | const answer = [];
3 |
4 | let temp = []
5 | let binaryList = s.split("");
6 |
7 | let [repeatCount, deleteCount] = [-1, 0];
8 |
9 | while (true) {
10 | repeatCount++;
11 |
12 | if (binaryList.length === 1) break;
13 |
14 | binaryList.map(el => {
15 | if (el !== '0') temp.push(el);
16 | else deleteCount++;
17 | })
18 |
19 | binaryList = temp.length.toString(2).split("");
20 | temp = [];
21 | }
22 | answer.push(repeatCount, deleteCount);
23 |
24 | return answer;
25 | }
--------------------------------------------------------------------------------
/coding-test/minjae/binary-search/부품찾기.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | rl.on("line", function (line) {
10 | input.push(line);
11 | }).on("close", function () {
12 | const totalPartCount = parseInt(input[0]);
13 | const totalParts = input[1].split(" ").map(Number);
14 | const reqPartCount = parseInt(input[2]);
15 | const reqParts = input[3].split(" ").map(Number);
16 |
17 | let result = [];
18 | for (let part of reqParts) {
19 | totalParts.includes(part) ? result.push('yes') : result.push('no');
20 | }
21 |
22 | console.log(result.join(" "));
23 | });
--------------------------------------------------------------------------------
/coding-test/minjae/binary-search/순차탐색예제.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | rl.on("line", function (line) {
10 | input.push(line);
11 | }).on("close", function () {
12 | const inputData = input.shift().split(" ");
13 | const inputArray = input.shift().split(" ");
14 | const [n, target] = [parseInt(inputData[0]), inputData[1]];
15 |
16 | if (!inputArray.includes(target)) return console.log(-1);
17 |
18 | for (let el in inputArray) {
19 | if (inputArray[el] === target) return console.log(parseInt(el) + 1);
20 | }
21 |
22 | });
--------------------------------------------------------------------------------
/coding-test/minjae/binary-search/이진탐색예제1.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | function binarySearch(array, target, start, end) {
10 | const mid = Math.ceil((start + end) / 2);
11 |
12 | if (start > end) return -1 //원소 존재x
13 |
14 | if (array[mid] === target) return mid + 1;
15 | else if (array[mid] > target) return binarySearch(array, target, start, mid - 1);
16 | else return binarySearch(array, target, mid + 1, end);
17 | }
18 |
19 | rl.on("line", function (line) {
20 | input.push(line);
21 | }).on("close", function () {
22 | const [n, target] = input.shift().split(" ").map(Number);
23 | const inputArray = input.shift().split(" ").map(Number).sort((a, b) => a - b);
24 |
25 | console.log(binarySearch(inputArray, target, 0, n - 1));
26 | });
--------------------------------------------------------------------------------
/coding-test/minjae/binary-search/이진탐색예제2.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | function binarySearch(array, target, start, end) {
10 | let mid = 0;
11 |
12 | while(start <= end) {
13 | mid = Math.ceil((start + end) / 2);
14 |
15 | if (array[mid] === target) return mid + 1;
16 | else if (array[mid] > target) end = mid - 1;
17 | else start = mid + 1;
18 | }
19 | return -1; //원소 존재x
20 | }
21 |
22 | rl.on("line", function (line) {
23 | input.push(line);
24 | }).on("close", function () {
25 | const [n, target] = input.shift().split(" ").map(Number);
26 | const inputArray = input.shift().split(" ").map(Number).sort((a, b) => a - b);
27 |
28 | console.log(inputArray);
29 | console.log(binarySearch(inputArray, target, 0, n - 1));
30 | });
--------------------------------------------------------------------------------
/coding-test/minjae/dfs-bfs/BFS-예제.js:
--------------------------------------------------------------------------------
1 | const graph = {
2 | 1: [2, 3, 8],
3 | 2: [1, 7],
4 | 3: [1, 4, 5],
5 | 4: [3, 5],
6 | 5: [3, 4],
7 | 6: [7],
8 | 7: [2, 6, 8],
9 | 8: [1, 7],
10 | };
11 |
12 | //BFS는 큐 2개 사용
13 | function bfs(graph, startNode) {
14 | const [visitedQueue, needVisitQueue] = [[], []];
15 |
16 | needVisitQueue.push(startNode);
17 |
18 | while (needVisitQueue.length !== 0) {
19 | const node = needVisitQueue.shift(); //선입 선출
20 |
21 | if (!visitedQueue.includes(node)) {
22 | visitedQueue.push(node);
23 | needVisitQueue = [...needVisitQueue, ...graph[node]];
24 | }
25 | }
26 | return visitedQueue;
27 | }
28 |
29 | console.log(bfs(graph, 1));
--------------------------------------------------------------------------------
/coding-test/minjae/dfs-bfs/DFS-예제.js:
--------------------------------------------------------------------------------
1 | const graph = {
2 | 1: [2, 3, 8],
3 | 2: [1, 7],
4 | 3: [1, 4, 5],
5 | 4: [3, 5],
6 | 5: [3, 4],
7 | 6: [7],
8 | 7: [2, 6, 8],
9 | 8: [1, 7],
10 | };
11 |
12 | //DFS는 큐1개 스택1개 필요 or 재귀함수로 구현
13 | function dfs(graph, startNode) {
14 | const [visitedQueue, needVisitStack] = [[], []];
15 |
16 | needVisitStack.push(startNode);
17 |
18 | while (needVisitStack.length !== 0) {
19 | const node = needVisitStack.pop(); //후입 선출
20 |
21 | if (!visitedQueue.includes(node)) {
22 | visitedQueue.push(node);
23 | needVisitStack = [...needVisitStack, ...graph[node].reverse()];
24 | }
25 | }
26 | return visitedQueue;
27 | }
28 |
29 | console.log(dfs(graph, 1));
--------------------------------------------------------------------------------
/coding-test/minjae/dfs-bfs/stack-queue.js:
--------------------------------------------------------------------------------
1 | function solution() {
2 | //Stack(후입선출: LIFO)
3 | const stack = [];
4 |
5 | stack.push(5);
6 | stack.push(2);
7 | stack.push(3);
8 | stack.push(7);
9 | stack.pop();
10 | stack.push(1);
11 | stack.push(4);
12 | stack.pop();
13 |
14 | console.log(stack);
15 |
16 | //Queue(선입선출: FIFO)
17 | const queue = [];
18 |
19 | queue.push(5);
20 | queue.push(2);
21 | queue.push(3);
22 | queue.push(7);
23 | queue.shift();
24 | queue.push(1);
25 | queue.push(4);
26 | queue.shift();
27 |
28 | console.log(queue);
29 | }
30 | solution();
--------------------------------------------------------------------------------
/coding-test/minjae/greedy/그리디1-거스름돈.js:
--------------------------------------------------------------------------------
1 | const ARRAY_MONEYS = [500, 100, 50, 10];
2 |
3 | function solution(change) {
4 | let coinCount = 0;
5 |
6 | for (let money of ARRAY_MONEYS) {
7 | coinCount += parseInt(change / money);
8 | change %= money;
9 | }
10 | return coinCount;
11 | }
12 |
13 | console.log(solution(1260));
14 | console.log(solution(5270));
--------------------------------------------------------------------------------
/coding-test/minjae/greedy/그리디3-숫자-카드-게임.js:
--------------------------------------------------------------------------------
1 | function solution(row, column) {
2 | const RandomArrays = [];
3 | const minNumbers= [];
4 |
5 | let answer = 0;
6 |
7 | for (let i = 0; i < row; i++) {
8 |
9 | let temp = [];
10 | for (let j = 0; j < column; j++) {
11 | temp.push(Math.floor(Math.random() * 9 + 1));
12 | }
13 | RandomArrays.push(temp);
14 | }
15 |
16 | for (let i = 0; i < RandomArrays.length; i++) {
17 | minNumbers.push(Math.min.apply(null, RandomArrays[i]));
18 | }
19 |
20 | /* 출력 확인용 */
21 | console.log(RandomArrays);
22 | console.log(minNumbers);
23 |
24 | return answer = Math.max.apply(null, minNumbers);
25 | }
26 |
27 | console.log(solution(5, 4));
--------------------------------------------------------------------------------
/coding-test/minjae/greedy/그리디4-1이-될-때까지.js:
--------------------------------------------------------------------------------
1 | function solution(n, k) {
2 | let resultCount = 0;
3 |
4 | while (true) {
5 | if (n == 1) {
6 | break;
7 | }
8 |
9 | if (n % k !== 0) {
10 | n -= 1;
11 | resultCount++;
12 | } else {
13 | n /= k;
14 | resultCount++;
15 | }
16 | }
17 | return resultCount;
18 | }
19 |
20 | console.log(solution(25, 3));
--------------------------------------------------------------------------------
/coding-test/minjae/sort/계수정렬-예제.js:
--------------------------------------------------------------------------------
1 | function solution() {
2 | const list = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5 ,2];
3 | const result = [];
4 | const maxNum = Math.max(...list);
5 | const count = {};
6 |
7 | for (let i = 0; i < maxNum + 1; i++) {
8 | count[i] = 0;
9 | }
10 |
11 | for (let i = 0; i < list.length; i++) {
12 | count[list[i]]++;
13 | }
14 |
15 | for (let i = 0; i < maxNum + 1; i++) {
16 | for (let j = 0; j < count[i]; j++) {
17 | result.push(i);
18 | }
19 | }
20 | return result.join(" ");
21 | }
22 |
23 | console.log(solution());
--------------------------------------------------------------------------------
/coding-test/minjae/sort/삽입정렬-예제.js:
--------------------------------------------------------------------------------
1 | function solution() {
2 | let list = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8];
3 |
4 | for (let i = 1; i < list.length; i++) {
5 | for (let j = i; j > 0; j--) {
6 | if (list[j] < list[j - 1]) [list[j], list[j - 1]] = [list[j - 1], list[j]];
7 | else break;
8 | }
9 | }
10 | return list;
11 | }
12 | console.log(solution());
--------------------------------------------------------------------------------
/coding-test/minjae/sort/선택정렬-예제.js:
--------------------------------------------------------------------------------
1 | function soultion() {
2 | let list = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8];
3 |
4 | for (let i = 0; i < list.length; i++) {
5 | let minIndex = i;
6 | for (let j = i + 1; j < list.length; j++) {
7 | if (list[minIndex] > list[j]) minIndex = j
8 | }
9 | [list[i], list[minIndex]] = [list[minIndex], list[i]];
10 | }
11 | return list;
12 | }
13 |
14 | console.log(soultion());
--------------------------------------------------------------------------------
/coding-test/minjae/sort/성적이-낮은-순서.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | rl.on("line", function (line) {
10 | input.push(line);
11 | }).on("close", function () {
12 | const studentCount = parseInt(input.shift());
13 | const result = {};
14 |
15 | for (let i = 0; i < studentCount; i++) {
16 | let [studentName, studentPoint] = input[i].split(" ");
17 | result[studentPoint] = studentName;
18 | }
19 |
20 | console.log(Object.values(result).join(" "));
21 | });
22 |
23 | /*
24 | * 이걸 어찌 리뷰해드려야하나 하다가 주석으로 대신할게요!
25 | */
26 |
27 | /*
28 | * 일단 해당 알고리즘은 오답입니다!
29 | * 홍길동 50, 이순신 50 이라고 입력됐을 때 홍길동은 사라지게 돼요 ㅎㅎ
30 | * 근데 신기한게.. 점수로 정렬을 안해주는데도 정렬돼서 나오네요?? Object.values()로 호출하면 키로 정렬돼서 나오는 건가요? 내일 알려주세요 ㅎㅎ
31 | */
32 |
--------------------------------------------------------------------------------
/coding-test/minjae/sort/위에서아래로.js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 | const rl = readline.createInterface({
3 | input: process.stdin,
4 | output: process.stdout,
5 | });
6 |
7 | const input = [];
8 |
9 | rl.on("line", function (line) {
10 | input.push(line);
11 | }).on("close", function () {
12 | const count = parseInt(input.shift());
13 | const result = [];
14 |
15 | for (let i = 0; i < count; i++) {
16 | result.push(parseInt(input[i]));
17 | }
18 | console.log(result.sort((a, b) => b - a));
19 | })
--------------------------------------------------------------------------------
/coding-test/minjae/sort/퀵정렬-예제.js:
--------------------------------------------------------------------------------
1 | let list = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8];
2 |
3 | function solution(list, start, end) {
4 | let [pivot, left, right] = [start, start + 1, end];
5 |
6 | if (start >= end) return;
7 |
8 | while (left <= right) {
9 | while (left <= end && list[left] <= list[pivot]) {
10 | left++;
11 | }
12 | while (right > start && list[right] >= list[pivot]) {
13 | right--;
14 | }
15 | if (left >= right) [list[right], list[pivot]] = [list[pivot], list[right]];
16 | else [list[left], list[right]] = [list[right], list[left]];
17 | }
18 |
19 | solution(list, start, right - 1);
20 | solution(list, right + 1, end);
21 | }
22 | solution(list, 0, list.length - 1)
23 |
24 | console.log(list);
--------------------------------------------------------------------------------
/coding-test/sangjun/2016년.js:
--------------------------------------------------------------------------------
1 | function solution(a, b) {
2 | const date = new Date(`2016, ${a}, ${b}`);
3 |
4 | let answer= '';
5 | let days = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
6 |
7 | answer = (days[date.getDay()]);
8 | return answer;
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/sangjun/Implement/상하좌우.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | const N = parseInt(rl.question("n*n 행렬 숫자만 입력 :\n>> "));
4 | const movePlan = rl.question("L ,R ,U, D 입력으로 이동 :\n>> ").toUpperCase().split(" ");
5 |
6 | const moves = ['L', 'R', 'U', 'D'];
7 | let [x, y] = [1, 1];
8 |
9 | for (let i in moves) {
10 | if (movePlan[i] === moves[0]) {
11 | y = y - 1 === 0 ? 1 : y - 1;
12 | }
13 | if (movePlan[i] === moves[1]) {
14 | y + 1 === N + 1 ? y === 1 : y = y + 1;
15 | }
16 | if (movePlan[i] === moves[2]) {
17 | x - 1 === 0 ? x === 1 : x = x - 1;
18 | }
19 | if (movePlan[i] === moves[3]) {
20 | x + 1 === N + 1 ? x === 1 : x = x + 1;
21 | }
22 | console.log(`${x} ${y}`);
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/coding-test/sangjun/Implement/시각.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | const H = parseInt(rl.question("몇시까지 :\n>> "));
4 |
5 | let count = 0;
6 |
7 | for (let h = 0; h < H + 1; h++) {
8 | for (let m = 0; m < 60; m ++) {
9 | for (let s = 0; s < 60; s++) {
10 | let times = `${h} ${m} ${s}`
11 |
12 | if (times.includes(“3”)) {
13 | count++;
14 | }
15 | }
16 | }
17 | }
18 |
19 |
20 | console.log(count);
21 |
22 |
--------------------------------------------------------------------------------
/coding-test/sangjun/Implement/왕실의나이트.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | const currentLocation = rl.question("나이트의 현재 위치 입력 :\n>> ").toUpperCase().split("");
4 |
5 | const steps = [[-2, -1], [-1, -2], [1, -2], [2, -1], [2, 1], [1, 2], [-1, 2], [-2, 1]];
6 | const rows = ["A", "B", "C", "D", "E", "F", "G", "H"];
7 | const columns = ["1", "2", "3", "4", "5", "6", "7", "8"];
8 |
9 | let count, nextColumn, nextRow;
10 | count = nextColumn = nextRow = 0;
11 |
12 | for (let step of steps) {
13 | nextRow = rows.indexOf(currentLocation[0]) + 1 + step[0];
14 | nextColumn = columns.indexOf(currentLocation[1]) + 1 + step[1];
15 |
16 |
17 | if (nextRow > 0 && nextRow < 9 && nextColumn > 0 && nextColumn < 9) {
18 | count++;
19 | }
20 | }
21 |
22 | console.log(count);
23 |
24 |
--------------------------------------------------------------------------------
/coding-test/sangjun/binary-serach/떡볶이떡만들기.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const [n, m]= input[0].split(' ');
5 | const array = input[1].split(' ').map(Number).sort((a, b) => a - b);
6 |
7 | let start = 0;
8 | let end = Math.max.apply(0, array);
9 | let result = 0;
10 |
11 | while (start <= end) {
12 | const mid = parseInt((start + end) / 2);
13 | let total = 0;
14 | for (let i of array) {
15 | if (i > mid) total += i - mid;
16 | }
17 | if (total < m) end = mid - 1;
18 | else {
19 | result = mid;
20 | start = mid + 1;
21 | }
22 | }
23 |
24 | console.log(result);
25 |
--------------------------------------------------------------------------------
/coding-test/sangjun/binary-serach/부품찾기.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const n = input[0];
5 | const target = input[1].split(" ").map(Number).sort((a, b) => a - b);
6 | const m = input[2];
7 | const checkReq = input[3].split(" ").map(Number);
8 |
9 | const result = [];
10 |
11 |
12 | function binarySearch(target, array, start, end) {
13 | const mid = parseInt((start + end) / 2);
14 |
15 | if (target[mid] === array) return result.push("yes");
16 | if (mid < -1 || start >= end) return result.push("no");
17 |
18 | target[mid] < array ?
19 | binarySearch(target, array, mid + 1, end) : binarySearch(target, array, start, mid - 1);
20 | };
21 |
22 | for (let i of checkReq) {
23 | binarySearch(target, i, 0, n - 1);
24 | }
25 |
26 | console.log(result);
--------------------------------------------------------------------------------
/coding-test/sangjun/binary-serach/부품찾기set.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const n = input[0];
5 | let target = new Set(input[1].split(" ").map(Number).sort((a, b) => a - b));
6 | const m = input[2];
7 | const checkReq = input[3].split(" ").map(Number);
8 |
9 | target = Array.from(target);
10 | const result = []
11 |
12 | for (let i of checkReq) {
13 | target.includes(i) ?
14 | process.stdout.write("no") : process.stdout.write("yes");
15 | }
--------------------------------------------------------------------------------
/coding-test/sangjun/binary-serach/순차탐색.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const n = input[0];
5 | const m = input[1];
6 | const array = input[2].split(' ');
7 |
8 | function sequential(n, m, array) {
9 | for (let i = 0; i < n; i++) {
10 | if (array[i] === m) return (i + 1);
11 | }
12 | };
13 |
14 |
15 |
16 | console.log(sequential(n, m, array));
17 |
--------------------------------------------------------------------------------
/coding-test/sangjun/binary-serach/이진탐색.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const n = +input[0];
5 | const target = +input[1];
6 | const array = input[2].split(" ").map(Number).sort((a, b) => a - b);
7 |
8 |
9 | function binarySearch(target, array, start, end) {
10 | const mid = parseInt((start + end) / 2);
11 |
12 | if (start > end) return console.log("존재 x");
13 | if (array[mid] === target) return console.log(mid + 1);
14 |
15 | array[mid] < target ?
16 | binarySearch(target, array, mid, end) : binarySearch(target, array, start, mid);
17 | };
18 |
19 | binarySearch(target, array, 0, n - 1);
20 |
21 |
22 |
--------------------------------------------------------------------------------
/coding-test/sangjun/dfs-bfs/bfs.js:
--------------------------------------------------------------------------------
1 | const graphs = [[], [2, 3, 8], [1, 7], [1, 4, 5], [3, 5], [3, 4], [7], [2, 6 ,8], [1, 7]];
2 |
3 | const bfs = (graph, startNode) => {
4 | let visited = [];
5 | let visitedQueue = [];
6 |
7 | visitedQueue.push(startNode);
8 | while (visitedQueue.length !== 0) {
9 | const node = visitedQueue.shift();
10 | if (!visited.includes(node)) {
11 | visited.push(node);
12 | visitedQueue = [...visitedQueue, ...graph[node]];
13 | }
14 | }
15 | return visited;
16 | };
17 |
18 | bfs(graphs, "1");
19 |
20 |
--------------------------------------------------------------------------------
/coding-test/sangjun/dfs-bfs/dfs.js:
--------------------------------------------------------------------------------
1 | const graph = [[], [8, 3, 2], [1, 7], [5, 4, 1], [5, 3], [4, 3], [7], [8, 6 ,2], [7, 1]];
2 |
3 | const dfs = (graph, startNode) => {
4 | let visited = [];
5 | let visitedStack = [];
6 |
7 | visited.push(startNode);
8 |
9 | while (visited.length !== 0) {
10 | const node = visited.pop();
11 | if (!visitedStack.includes(node)) {
12 | visitedStack.push(node);
13 | visited = [...visited, ...graph[node]];
14 | }
15 | console.log(graph[node])
16 | }
17 | return visitedStack;
18 | };
19 |
20 | dfs(graph, "1");
--------------------------------------------------------------------------------
/coding-test/sangjun/dfs-bfs/음료수 얼려먹기.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | const N = rl.question("N*N 맵생성 :\n>> ").split(" ");
4 |
5 | const map = [];
6 | for (let i = 0; i < N; i++) {
7 | const vector = rl.question("얼음 배치 :\n>> ").split(" ") .map((el) => parseInt(el));
8 | map.push(vector);
9 | }
10 |
11 | let cnt = 0;
12 | // 상,하,좌,우
13 | let dx = [-1, 1, 0, 0];
14 | let dy = [0, 0, -1, 1];
15 |
16 | for (let i = 0; i < N; i++) {
17 | map.push(i);
18 | }
19 |
20 | function dfs(x, y) {
21 | if(x >= 0 && N > y >= 0 && map[x][y] === 0) {
22 | map[x][y] = 1
23 | dfs(x + 1, y)
24 | dfs(x - 1 ,y)
25 | dfs(x, y + 1)
26 | dfs(x, y - 1)
27 | return true;
28 | }
29 | return false;
30 | }
31 |
32 | for (let j = 0; j < N; j++) {
33 | for (let k = 0; k < N; k++) {
34 | if (dfs(j, k)) {
35 | cnt++;
36 | }
37 | }
38 | }
39 |
40 | console.log(cnt);
--------------------------------------------------------------------------------
/coding-test/sangjun/greedy/1이될때까지.js:
--------------------------------------------------------------------------------
1 | function untilOne(n, k) {
2 | let count = 0;
3 |
4 | while (n > 1) {
5 | if (n % k === 0) {
6 | n /= k;
7 | count += 1;
8 | } else {
9 | n -= 1;
10 | count += 1;
11 | }
12 | }
13 |
14 | return count;
15 | }
16 |
17 | console.log(untilOne(25, 5));
18 |
19 |
--------------------------------------------------------------------------------
/coding-test/sangjun/greedy/숫자카드게임.js:
--------------------------------------------------------------------------------
1 | function cardGame(row, column) {
2 | let cards = [];
3 |
4 | for (let i = 0; i < row; i++){
5 | let rowCards = [];
6 | for (let j = 0; j < column; j++){
7 | rowCards.push(Math.floor(Math.random() * 9 + 1));
8 | }
9 | cards.push(rowCards);
10 | }
11 | console.log(cards)
12 |
13 | return Math.max(...cards.map(rowCards => Math.min(...rowCards)));
14 | }
15 |
16 | console.log(cardGame(5, 4));
--------------------------------------------------------------------------------
/coding-test/sangjun/greedy/큰수의법칙.js:
--------------------------------------------------------------------------------
1 | function largeNumRule(n, m, k) {
2 | const randomNum = [];
3 |
4 | let result = 0;
5 |
6 | for (let i = 0; i < n; i++) {
7 | randomNum.push(Math.floor(Math.random() * 9 + 1));
8 | }
9 |
10 | const descendNum = randomNum.sort((a, b) => b - a);
11 |
12 | const first = descendNum[0];
13 | const second = descendNum[1];
14 |
15 | while (true) {
16 | for (let i = 0; i < k; i++) {
17 | if (m == 0) {
18 | break;
19 | }
20 |
21 | result += first
22 | m--;
23 | }
24 |
25 | if (m == 0) {
26 | break;
27 | }
28 |
29 | result += second;
30 | m--;
31 | }
32 |
33 | console.log(descendNum)
34 | return result;
35 |
36 | }
37 |
38 | console.log(largeNumRule(5, 4, 2));
39 |
--------------------------------------------------------------------------------
/coding-test/sangjun/같은숫자는싫어.js:
--------------------------------------------------------------------------------
1 | function solution(arr){
2 | let result = [];
3 |
4 | for (let i = 0; i < arr.length; i++){
5 | if (arr[i] !== arr [i + 1]){
6 | result.push(arr[i])
7 | }
8 | }
9 | return result;
10 | }
11 |
--------------------------------------------------------------------------------
/coding-test/sangjun/나누어떨어지는숫자베열.js:
--------------------------------------------------------------------------------
1 | function solution(arr, divisor) {
2 | const answer = [];
3 | arr.sort((a,b) => (a - b));
4 |
5 | for (let i = 0; i < arr.length; i++){
6 | if (arr[i] % divisor === 0){
7 | answer.push(arr[i]);
8 |
9 | }
10 | if (answer.length === 0){
11 | answer.push(-1);
12 | console.log(answer);
13 | }
14 | }
15 | return answer;
16 | }
17 |
--------------------------------------------------------------------------------
/coding-test/sangjun/두개뽑아서더하기.js:
--------------------------------------------------------------------------------
1 | function solution(numbers) {
2 | const answer = [];
3 | let sum = 0;
4 |
5 | for (let i = 0; i < numbers.length; i++) {
6 | for (let j = 1; j < numbers.length; j++) {
7 | if(i !== j){
8 | sum = numbers[i] + numbers[j];
9 | answer.push(sum)
10 | }
11 | }
12 | }
13 |
14 | let numberSet = new Set(answer);
15 | let arraySet = Array.from(numberSet);
16 | arraySet.sort((a, b) => (a - b));
17 | return arraySet;
18 | }
19 |
--------------------------------------------------------------------------------
/coding-test/sangjun/두정수사의합.js:
--------------------------------------------------------------------------------
1 | function solution(a, b) {
2 | let result = 0;
3 | let min = Math.min(a,b);
4 | let max = Math.max(a,b);
5 |
6 | for(let i = min; i <= max; i++){
7 | result += i;
8 | }
9 | return result;
10 | }
11 |
--------------------------------------------------------------------------------
/coding-test/sangjun/문자열내마음대로정렬하기.js:
--------------------------------------------------------------------------------
1 | function solution(strings, n) {
2 | strings.sort((a,b) => {
3 | if (a[n] === b[n]) {
4 | return a.localeCompare(b);
5 | } else {
6 | return a[n].localeCompare(b[n]);
7 | }
8 | });
9 |
10 | return strings;
11 | }
12 |
--------------------------------------------------------------------------------
/coding-test/sangjun/문자열다루기기본.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | let changeInt = s.replace( /[^0-9]/g, "" );
3 |
4 | if ( s.length === 4 || s.length === 6 ){
5 | if( changeInt === s ){
6 | return true;
7 | } else {
8 | return false;
9 | }
10 | } else {
11 | return false;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/coding-test/sangjun/삼진법뒤집기.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let ten;
3 | let three = n.toString(3).split('').reverse().join('');
4 |
5 | return ten = Number.parseInt(three, 3);
6 |
7 | }
8 |
--------------------------------------------------------------------------------
/coding-test/sangjun/예산.js:
--------------------------------------------------------------------------------
1 | function solution(d, budget) {
2 | let count = 0;
3 | d.sort((a, b) => a - b);
4 |
5 | for (let sortd of d) {
6 | budget -= sortd;
7 | if(budget < 0)
8 | break;
9 | count++;
10 | }
11 | return count;
12 | }
13 |
--------------------------------------------------------------------------------
/coding-test/sangjun/완주하지못한선수.js:
--------------------------------------------------------------------------------
1 | function solution(participant, completion) {
2 | const obj = {};
3 |
4 | for (let participants of participant) {
5 | if (participants in obj) {
6 | obj[participants] += 1;
7 | } else {
8 | obj[participants] = 1;
9 | }
10 | }
11 |
12 | for (let completions of completion) {
13 | obj[completions] -= 1;
14 | }
15 |
16 | for (let participants of participant) {
17 | if (obj[participants] >= 1) {
18 | return participants;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/coding-test/sangjun/자릿수더하기.js:
--------------------------------------------------------------------------------
1 | function solution(n){
2 | let sum = 0;
3 | const str = n.toString().split('');
4 | for (let i = 0; i < str.length; i++ ){
5 | sum += parseInt(str[i])
6 | }
7 | return sum
8 | }
9 |
--------------------------------------------------------------------------------
/coding-test/sangjun/정수내림차순배치.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 |
3 | return Number(n.toString().split('').sort().reverse().join(''))
4 | }
5 |
--------------------------------------------------------------------------------
/coding-test/soongu/K번째수.js:
--------------------------------------------------------------------------------
1 | function solution(array, commands) {
2 | const answer= [];
3 | for (let command of commands) {
4 | answer.push(array.slice(command[0] - 1, command[1]).sort((a, b) => a - b)[command[2] - 1]);
5 | }
6 | return answer;
7 | }
8 |
--------------------------------------------------------------------------------
/coding-test/soongu/binary-search/떡볶이떡만들기.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const [ N, M ] = input[0].split(' ').map(Number);
5 | const array = input[1].split(' ').map(Number);
6 | let start = 0;
7 | let end = Math.max.apply(0, array);
8 | let result = 0;
9 |
10 | while(start <= end) {
11 | const mid = parseInt((start + end) / 2);
12 | let total = 0;
13 | for (let i of array) {
14 | if (i > mid) total += i - mid;
15 | }
16 | if (total < M) end = mid - 1;
17 | else {
18 | result = mid;
19 | start = mid + 1;
20 | }
21 | }
22 |
23 | console.log(result);
24 |
--------------------------------------------------------------------------------
/coding-test/soongu/binary-search/부품탐색 set.js:
--------------------------------------------------------------------------------
1 | const fs= require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const N = parseInt(input[0]);
5 | let product = new Set(input[1].split(' ').map(Number));
6 | const M = parseInt(input[2]);
7 | const order = input[3].split(' ').map(Number);
8 |
9 | product = Array.from(product);
10 | for (let i of order) {
11 | if (product.includes(i) === false) process.stdout.write(`no `);
12 | else process.stdout.write(`yes `);
13 | }
--------------------------------------------------------------------------------
/coding-test/soongu/binary-search/부품탐색 계수정렬.js:
--------------------------------------------------------------------------------
1 | const fs= require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const N = parseInt(input[0]);
5 | const product = Array(1000000).fill(0);
6 | for (let i of input[1].split(' ')) {
7 | product[Number(i)] = 1;
8 | }
9 | const M = parseInt(input[2]);
10 | const order = input[3].split(' ').map(Number);
11 |
12 |
13 |
14 | for (let i of order) {
15 | if (product[i] === 1) process.stdout.write(`yes `);
16 | else process.stdout.write(`no `);
17 | }
--------------------------------------------------------------------------------
/coding-test/soongu/binary-search/부품탐색 이진탐색.js:
--------------------------------------------------------------------------------
1 | const fs= require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const N = parseInt(input[0]);
5 | const product = input[1].split(' ').map(Number);
6 | const M = parseInt(input[2]);
7 | const order = input[3].split(' ').map(Number);
8 |
9 | function binary_search(product, target, start, end) {
10 | const mid = parseInt((start + end) / 2);
11 | while (start <= end) {
12 | if (product.includes(target) === false) return undefined;
13 | if (product[mid] === target) return mid;
14 | if (product[mid] > target) end = mid - 1;
15 | else start = mid + 1;
16 | }
17 | }
18 |
19 | for (let i of order) {
20 | let result = binary_search(product, i, 0, N - 1);
21 | if (result === undefined) process.stdout.write(`no `);
22 | process.stdout.write(`yes `);
23 | }
24 |
--------------------------------------------------------------------------------
/coding-test/soongu/binary-search/순차탐색 예제.js:
--------------------------------------------------------------------------------
1 | function sequential_search(n, target, array) {
2 | for (let i = 0; i < n; i++) {
3 | if (array[i] === target) {
4 | return i + 1;
5 | }
6 | }
7 | }
8 |
9 | process.stdout.write("생성할 원소 개수를 입력한 다음 한 칸 띄고 찾을 문자열을 입력하세요\n");
10 |
11 | const fs = require('fs');
12 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
13 | const n = Number(input[0]);
14 | const target = input[1];
15 |
16 | const array = input[2].split(' ');
17 |
18 | console.log(sequential_search(n, target, array));
19 |
20 |
--------------------------------------------------------------------------------
/coding-test/soongu/binary-search/이진탐색 반복문.js:
--------------------------------------------------------------------------------
1 | function binary_search(array, target, start, end) {
2 | while (start <= end) {
3 | if (array[0] === target) return 0;
4 | mid = parseInt((start + end) / 2);
5 | if (array[mid] === target) return mid;
6 | else if (array[mid] > target) end = mid - 1;
7 | else start = mid + 1;
8 | }
9 | return undefined;
10 | }
11 |
12 | const fs = require('fs');
13 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
14 | const [ n, target ] = input[0].split(' ').map(Number);
15 | const arraySet = new Set(input[1].split(' ').map(Number));
16 | const array = Array.from(arraySet);
17 | const result = binary_search(array, target, 0, n - 1);
18 | if (result === undefined) {
19 | console.log("원소가 존재하지 않습니다");
20 | } else {
21 | console.log(result + 1);
22 | }
--------------------------------------------------------------------------------
/coding-test/soongu/binary-search/이진탐색 예제.js:
--------------------------------------------------------------------------------
1 | function binary_search(array, target, start, end) {
2 | if (array[0] === target) return 0;
3 | if (start > end) return undefined;
4 | mid = parseInt((start + end) / 2);
5 | if (array[mid] === target) return mid;
6 | else if (array[mid] > target) return binary_search(array, target, start, mid - 1);
7 | else return binary_search(array, target, mid + 1, end);
8 | }
9 |
10 | const fs = require('fs');
11 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
12 | const [ n, target ] = input[0].split(' ').map(Number);
13 | const arraySet = new Set(input[1].split(' ').map(Number));
14 | const array = Array.from(arraySet);
15 | const result = binary_search(array, target, 0, n - 1);
16 | if (result === undefined) {
17 | console.log("원소가 존재하지 않습니다");
18 | } else {
19 | console.log(result + 1);
20 | }
--------------------------------------------------------------------------------
/coding-test/soongu/dfs-bfs/음료수얼려먹기.js:
--------------------------------------------------------------------------------
1 | `use strict`
2 |
3 | const icePlace = Array.from(Array(4), () => Array(7).fill(0));
4 |
5 | const iceMaker = [
6 | [0, 0, 1, 1, 0, 1, 0],
7 | [0, 0, 0, 1, 1, 0, 0],
8 | [1, 1 ,1 ,1, 1, 1, 1],
9 | [0, 0, 0, 0, 0, 1 ,0]
10 | ];
11 | function dfs(x, y) {
12 | if (x <= -1 || x >= 4 || y <= -1 || y >= 7) {
13 | return false;
14 | }
15 |
16 | if (iceMaker[x][y] === 0) {
17 | iceMaker[x][y] = 1;
18 | dfs(x - 1, y);
19 | dfs(x, y - 1);
20 | dfs(x + 1, y);
21 | dfs(x, y + 1);
22 | return true;
23 | }
24 | return false;
25 | }
26 |
27 | let count = 0;
28 | for (let i = 0; i < 4; i++) {
29 | for (let j = 0; j < 7; j++) {
30 | if (dfs(i, j) === true) {
31 | count++;
32 | }
33 | }
34 | }
35 |
36 | console.log(count);
--------------------------------------------------------------------------------
/coding-test/soongu/greedy/1이 될 때까지.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | let [ n, k ] = rl.question("N과 K를 입력해주세요.\n>> ").split(',');
4 |
5 | let count = 0;
6 | console.log(n);
7 | while(true) {
8 | if (n % k == 0) {
9 | n = n / k;
10 | count++;
11 | } else {
12 | n--;
13 | count++;
14 | }
15 | if (n === 1) {
16 | break;
17 | }
18 | }
19 |
20 | console.log(count);
--------------------------------------------------------------------------------
/coding-test/soongu/greedy/숫자 카드 게임.js:
--------------------------------------------------------------------------------
1 |
2 | const rl = require("readline-sync");
3 |
4 | let [ n, m ] = rl.question("행과 열을 입력해주세요.\n>> ").split('');
5 | const result = [];
6 |
7 | for (let i = 0; i < n; i++) {
8 | let [ data ] = rl.question("데이터를 입력해주세요.\n>> ").split('');
9 | result.push(Math.min(data));
10 | }
11 | result.sort((a, b) => a - b);
12 | console.log(result[n - 1]);
--------------------------------------------------------------------------------
/coding-test/soongu/greedy/큰 수의 법칙1.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | let [ n, m, k] = rl.question("N, M, K 입력해주세요.\n>> ").split(',');
4 |
5 |
6 | let data = rl.question("data 입력해주세요.\n>> ").split('');
7 |
8 | for (let i = 0; i < data.length; i++) {
9 | data[i] = parseInt(data[i]);
10 | }
11 |
12 | n = parseInt(n);
13 | m = parseInt(m);
14 | data.sort((a, b) => a - b);
15 |
16 | let first = data[n - 1];
17 | let second = data[n - 2];
18 | let result = 0;
19 |
20 | while(true) {
21 | for (let i = 0; i < k; i++) {
22 | if (m === 0) {
23 | break;
24 | }
25 | result += first;
26 | m--;
27 | }
28 | if (m === 0) {
29 | break;
30 | }
31 | result += second;
32 | m--;
33 | }
34 | console.log(result);
--------------------------------------------------------------------------------
/coding-test/soongu/greedy/큰 수의 법칙2.js:
--------------------------------------------------------------------------------
1 | `use strict`
2 | // N = 배열의 크기
3 | // M = 숫자가 더해지는 횟수
4 | // K = 가장 큰 수 반복 제한 횟수
5 | const rl = require("readline-sync");
6 |
7 | let [ n, m, k] = rl.question("N, M, K 입력해주세요.\n>> ").split(',');
8 |
9 | let data = rl.question("data 입력해주세요.\n>> ").split('');
10 |
11 | for (let i = 0; i < data.length; i++) {
12 | data[i] = parseInt(data[i]);
13 | }
14 |
15 | n = parseInt(n);
16 | m = parseInt(m);
17 | k = parseInt(k);
18 | data.sort((a, b) => a - b);
19 |
20 | let first = data[n - 1];
21 | let second = data[n - 2];
22 |
23 | let count = parseInt(m / (k + 1) * k);
24 | count += m % (k + 1);
25 |
26 | let result = 0;
27 | result += (count) * first;
28 | result += (m - count) * second;
29 |
30 | console.log(result);
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/coding-test/soongu/implement/상하좌우.js:
--------------------------------------------------------------------------------
1 | `use strict`
2 |
3 | const rl = require("readline-sync");
4 |
5 | let n = rl.question("공간의 크기를 입력해주세요.\n>> ");
6 | let a = rl.question("이동할 방향을 입력해주세요.\n>> ").toUpperCase().split('');
7 |
8 | let traveler = [1, 1];
9 |
10 | for (let direction of a) {
11 | switch(direction) {
12 | case ‘R’ :
13 | traveler[1] += traveler[1] < n ? 1 : 0;
14 | break;
15 | case 'L' :
16 | traveler[1] -= traveler[1] > 1 ? 1 : 0;
17 | break;
18 | case 'U' :
19 | traveler[0] -= traveler[0] > 1 ? 1 : 0;
20 | break;
21 | case 'D' :
22 | traveler[0] += traveler[0] < n ? 1 : 0;
23 | break;
24 | default :
25 | break;
26 | }
27 | }
28 |
29 | console.log(traveler);
30 |
--------------------------------------------------------------------------------
/coding-test/soongu/implement/상하좌우2.js:
--------------------------------------------------------------------------------
1 | `use strict`
2 |
3 | const rl = require("readline-sync");
4 |
5 | const N = rl.question("공간의 크기를 입력해주세요.\n>> ");
6 | let [ x, y ] = [ 1, 1 ];
7 | const PLANS = rl.question("이동할 방향을 입력해주세요.\n>> ").toUpperCase().split('');
8 |
9 | const dx = [0, 0, -1, 1];
10 | const dy = [-1, 1, 0, 0];
11 | const move_types = ['L', 'R', 'U', 'D'];
12 |
13 | let [ nx, ny ] = [ 0 , 0 ];
14 |
15 | for (let plan of PLANS) {
16 | for (let i = 0; i < move_types.length; i++) {
17 | if (plan === move_types[i]) {
18 | nx = x + dx[i];
19 | ny = y + dy[i];
20 | }
21 | }
22 | if (nx < 1 || ny < 1 || nx > N || ny > N) {
23 | continue;
24 | }
25 | [ x, y ] = [ nx, ny ];
26 | }
27 |
28 | console.log(x, y);
--------------------------------------------------------------------------------
/coding-test/soongu/implement/시각.js:
--------------------------------------------------------------------------------
1 | `use strict`
2 |
3 | const N = 6;
4 | let count = 0;
5 | let str;
6 |
7 | for (let i = 0; i < N + 1; i++) {
8 | for (let j = 0; j < 60; j++) {
9 | for (let k = 0; k <60; k++) {
10 | str = `${i}${j}${k}`;
11 | if (str.includes(3)) {
12 | count++;
13 | }
14 | }
15 | }
16 | }
17 |
18 | console.log(count);
--------------------------------------------------------------------------------
/coding-test/soongu/implement/왕실의나이트.js:
--------------------------------------------------------------------------------
1 | `use strict`
2 |
3 | const rl = require("readline-sync");
4 | const data = rl.question("나이트의 위치를 입력해주세요.\n>> ").split('');
5 |
6 | let row = (data[0].charCodeAt() - 'a'.charCodeAt()) + 1;
7 | let column = parseInt(data[1]);
8 |
9 | let next_row = 0;
10 | let next_column = 0;
11 | let [next_row, next_column] = [0, 0];
12 | let count = 0;
13 |
14 | const steps = [[-2, -1], [-2, 1], [2, 1], [2, -1], [1, 2], [1, -2], [-1, 2], [-1, -2]];
15 |
16 | for (let step of steps) {
17 | next_row = row + step[0];
18 | next_column = column + step[1];
19 |
20 | if (next_row >= 1 && next_row <= 8 && next_column >= 1 && next_column <= 8) {
21 | count++;
22 | }
23 | <<<<<<< HEAD
24 | }
25 | =======
26 | }
27 | >>>>>>> master
28 |
--------------------------------------------------------------------------------
/coding-test/soongu/sort/두배열의원소교체.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const [N, K] = input[0].split(' ');
5 | input = input.slice(1);
6 |
7 |
8 | const firstArray = Array.from(input[0].split(' ').map(Number));
9 | const secondArray = Array.from(input[1].split(' ').map(Number));
10 |
11 | firstArray.sort((a, b) => a - b);
12 | secondArray.sort((a, b) => b - a);
13 |
14 | for (let i = 0; i < K; i++) {
15 | if (firstArray[i] < secondArray[i]) {
16 | [firstArray[i], secondArray[i]] = [secondArray[i], firstArray[i]];
17 | } else {
18 | break;
19 | }
20 | }
21 |
22 | const result = firstArray.reduce((prev, curr) => prev + curr);
23 | console.log(result);
--------------------------------------------------------------------------------
/coding-test/soongu/sort/성적이낮은순서도.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const N = input[0];
5 | input = input.slice(1);
6 |
7 | class Student {
8 | constructor (name, score) {
9 | this.name = name;
10 | this.score = score;
11 | }
12 | };
13 |
14 | const array = [];
15 | for (let i = 0; i < N; i++) {
16 | let inputData = input[i].split(' ');
17 | array.push(new Student(inputData[0], Number(inputData[1])));
18 | }
19 |
20 | array.sort((a, b) => a.score - b.score);
21 | process.stdout.write(` ${array.map((student) => student.name)} `);
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/coding-test/soongu/sort/위에서아래로.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | let input = fs.readFileSync("/dev/stdin").toString().split('\n');
3 |
4 | const N = input[0];
5 | input = input.slice(1);
6 | const array = [];
7 | for (let i = 0; i < N; i++) {
8 | array.push(input[i]);
9 | }
10 |
11 | array.sort((a, b) => b - a);
12 | array.forEach(el => process.stdout.write(`${el} `);
13 |
--------------------------------------------------------------------------------
/coding-test/soongu/가운데 글자 가져오기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | if (s.length % 2 == 1) {
3 | return s.substring(s.length/2, (s.length/2)+1);
4 | } else {
5 | return (s.substring((s.length/2)-1, (s.length/2)+1));
6 | }
7 | }
8 |
9 | // 최적화
10 |
11 | function solution(s) {
12 | if (s.length % 2) {
13 | return s.substring(s.length / 2, (s.length / 2) + 1);
14 | } else {
15 | return (s.substring((s.length / 2) -1, (s.length / 2) + 1));
16 | }
17 | }
18 |
19 | function solution(s) {
20 | return s.length % 2 ? s.substring(s.length / 2, (s.length / 2) + 1) : s.substring((s.length / 2) -1, (s.length / 2) + 1);
21 | }
22 |
23 | function solution(s) {
24 | return s.substring(parseInt((s.length-1) / 2), parseInt(s.length / 2)+1);
25 | }
26 |
--------------------------------------------------------------------------------
/coding-test/soongu/같은 숫자는 싫어.js:
--------------------------------------------------------------------------------
1 | /*
2 | * 변수명에 s만 붙임 -> 배열이기 때문.
3 | * new Array(); -> []; 이게 일반적이다.
4 | */
5 | function solution(arr) {
6 | let deduplications = new Array();
7 | for (let i = 0; i < arr.length; i++) {
8 | if (arr[i] !== arr[i + 1]) {
9 | deduplications.push(arr[i]);
10 | }
11 | }
12 | return deduplication;
13 | }
14 |
--------------------------------------------------------------------------------
/coding-test/soongu/거스름돈.js:
--------------------------------------------------------------------------------
1 | let money = 1893;
2 | let count = 0;
3 |
4 | const list = [500, 100, 50, 10];
5 |
6 | for (let coin of list) {
7 | count += parseInt(money / coin);
8 | money = money % coin
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/soongu/두-개-뽑아서-더하기.js:
--------------------------------------------------------------------------------
1 | function solution(numbers) {
2 | const mySet = new Set();
3 | for (let i = 0; i < numbers.length; i++) {
4 | for (let j = i + 1; j < numbers.length; j++) {
5 | mySet.add(numbers[i] + numbers[j]);
6 | }
7 | }
8 | const newArray = Array.from(mySet).sort((a, b) => a - b);
9 |
10 | return newArray;
11 | }
12 |
--------------------------------------------------------------------------------
/coding-test/soongu/문자열 내림차순.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | return s.split('').sort().reverse().join('');
3 | }
4 |
--------------------------------------------------------------------------------
/coding-test/soongu/문자열-p와-y의-개수.js:
--------------------------------------------------------------------------------
1 | function solution(s){
2 | return s.trim().toLowerCase().split('p').length ===
3 | s.trim().toLowerCase().split('y').length
4 | }
5 |
--------------------------------------------------------------------------------
/coding-test/soongu/문자열-다루기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | let answer = false;
3 | if ((s.length === 4 || s.length === 6)) {
4 | for (let i = 0; i < s.length; i++) {
5 | console.log(parseInt(s[i]));
6 | if (Number.isInteger(parseInt(s[i]))) {
7 | answer = true;
8 | } else {
9 | answer = false;
10 | break;
11 | }
12 | }
13 | } else {
14 | answer = answer;
15 | }
16 | return answer;
17 | }
18 |
--------------------------------------------------------------------------------
/coding-test/soongu/서울에서-김서방찾기.js:
--------------------------------------------------------------------------------
1 | function solution(seoul) {
2 | return `김서방은 ${seoul.indexOf('Kim')}에 있다`
3 | }
4 |
--------------------------------------------------------------------------------
/coding-test/soongu/수박수.js:
--------------------------------------------------------------------------------
1 | // 확장자 꼭 좀 입력해주세요...ㅋㅋㅋㅋㅋ
2 |
3 | function solution(n) {
4 | let answer = '';
5 | for (let i = 1; i < n+1; i++) {
6 | if (i % 2) {
7 | answer += "수";
8 | } else {
9 | answer += "박";
10 | }
11 | }
12 | return answer;
13 | }
14 |
15 | /*
16 | * return 들여쓰기
17 | */
18 |
19 | function solution(n) {
20 | let answer = '';
21 | for (let i = 1; i < n+1; i++) {
22 | if (i % 2) {
23 | answer += "수";
24 | } else {
25 | answer += "박";
26 | }
27 | }
28 | return answer;
29 | }
30 |
--------------------------------------------------------------------------------
/coding-test/soongu/약수의-합.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let answer = 0;
3 | for (let i = 1; i <= n; i++) {
4 | if (Number.isInteger(n / i)) {
5 | answer += n / i;
6 | }
7 | }
8 | return answer;
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/soongu/예산.js:
--------------------------------------------------------------------------------
1 | function solution(d, budget) {
2 | let result = 0;
3 | let temp = 0;
4 | for (let i = 0; i < d.length; i++) {
5 | for (let j = i + 1; j < d.length; j++) {
6 | if (d[i] > d[j]) {
7 | { d[j], d[i] } = { d[i], d[j] };
8 | }
9 | }
10 | } // 정렬 알고리즘
11 | for (let val of d) {
12 | budget = budget - val;
13 | if (budget >= 0) {
14 | result++;
15 | }
16 | }
17 | return result;
18 | }
19 |
--------------------------------------------------------------------------------
/coding-test/soongu/완주하지-못한-선수.js:
--------------------------------------------------------------------------------
1 | function solution(participants, completions) {
2 | let answer = '';
3 | const myMap = new Map();
4 |
5 | for (const participant of participants) {
6 | if (!myMap.get(participant)) {
7 | myMap.set(participant, 1);
8 | } else {
9 | myMap.set(participant, myMap.get(participant) + 1)
10 | }
11 | }
12 |
13 | for (const completion of completions) {
14 | if (myMap.get(completion)) {
15 | myMap.set(completion, myMap.get(completion) - 1);
16 | }
17 | }
18 |
19 | for(const participant of participants){
20 | if(myMap.get(participant) && myMap.get(participant) >=1 ){
21 | answer = participant;
22 | }
23 | }
24 | return answer;
25 | }
26 |
--------------------------------------------------------------------------------
/coding-test/soongu/완주하지못한선수(object).js:
--------------------------------------------------------------------------------
1 | function solution(participants, completions) {
2 | let answer = '';
3 | const obj = {};
4 |
5 | for (let participant of participants) {
6 | if (!obj[participant]) {
7 | obj[participant] = 1;
8 | } else {
9 | obj[participant] += 1;
10 | }
11 | }
12 |
13 | for (let completion of completions) {
14 | if (obj[completion]) {
15 | obj[completion] -= 1;
16 | }
17 | }
18 |
19 | for (let participant of participants) {
20 | if (obj[participant] >= 1) {
21 | answer = participant;
22 | }
23 | }
24 | return answer;
25 | }
26 |
--------------------------------------------------------------------------------
/coding-test/soongu/이상한-문자-만들기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | let answer = '';
3 | let results = '';
4 | answer = s.split(" ");
5 | for (let i = 0; i < answer.length; i++) {
6 | for (let j = 0; j < answer[i].length; j++) {
7 | if (j % 2 === 0) {
8 | results += answer[i][j].toUpperCase();
9 | } else {
10 | results += answer[i][j].toLowerCase();
11 | }
12 | }
13 | results += " ";
14 | }
15 | return results.slice(0, results.length - 1);
16 | }
17 |
--------------------------------------------------------------------------------
/coding-test/soongu/자릿수 더하기.js:
--------------------------------------------------------------------------------
1 | function solution(n)
2 | {
3 | n = n.toString().split('');
4 | let total = 0;
5 | for (let i = 0; i < n.length; i++) {
6 | total += parseInt(n[i]);
7 | }
8 | return total;
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/soongu/정수-제곱근-판별.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let answer = 0;
3 | let squareRoot = 0;
4 | while (squareRoot * squareRoot < n) {
5 | squareRoot++;
6 | if (squareRoot * squareRoot === n) {
7 | answer = ++squareRoot;
8 | return answer * answer;
9 | }
10 | }
11 | return -1;
12 | }
13 |
--------------------------------------------------------------------------------
/coding-test/soongu/평균구하기.js:
--------------------------------------------------------------------------------
1 | function solution(arr) {
2 | const sum = arr.reduce((prev, curr) => prev + curr, 0);
3 | return sum / arr.length;
4 | }
5 |
--------------------------------------------------------------------------------
/coding-test/soongu/행렬의 덧셈.js:
--------------------------------------------------------------------------------
1 | function solution(arr1, arr2) {
2 | return arr1.map((a, i) => a.map((b, j) => b + arr2[i][j]));
3 | }
4 |
--------------------------------------------------------------------------------
/coding-test/wonji/dfs-bfs/bfs예제.js:
--------------------------------------------------------------------------------
1 | const graph = [
2 | [1],
3 | [2, 3, 8],
4 | [1, 7],
5 | [1, 4, 5],
6 | [3, 5],
7 | [3, 4],
8 | [7],
9 | [2, 6, 8],
10 | [1, 7],
11 | ];
12 |
13 | const queue = [];
14 |
15 | const visited = [];
16 |
17 | for (let x = 0; x < graph.length; x++) {
18 | for (let y = 0; y < graph[x].length; y++) {
19 | if (x === graph.length - 1) {
20 | visited.push(...queue);
21 | break;
22 | }
23 | if (visited.includes(graph[x][y])) {
24 | continue;
25 | }
26 | if (queue.includes(graph[x][y])) {
27 | visited.push(queue[0]);
28 | queue.shift();
29 | continue;
30 | }
31 | queue.push(graph[x][y]);
32 | }
33 | }
34 |
35 | console.log(visited);
--------------------------------------------------------------------------------
/coding-test/wonji/dfs-bfs/dfs예제.js:
--------------------------------------------------------------------------------
1 | const graph = [
2 | [],
3 | [2, 3, 8],
4 | [1, 7],
5 | [1, 4, 5],
6 | [3, 5],
7 | [3, 4],
8 | [7],
9 | [2, 6, 8],
10 | [1, 7],
11 | ];
12 |
13 | const visited = [];
14 |
15 | function dfs(graph, v, visited) {
16 | visited[v] = true;
17 | process.stdout.write(`${v} `);
18 | for (let i of graph[v]){
19 | if (!visited[i]){
20 | dfs(graph, i, visited);
21 | }
22 | }
23 | }
24 |
25 | dfs(graph, 1, visited);
--------------------------------------------------------------------------------
/coding-test/wonji/dfs-bfs/음료수얼려먹기.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 | const n = parseInt(rl.question("세로 N입력.\n>>"));
3 | const m = parseInt(rl.question("가로 M입력.\n>>"));
4 |
5 | const graph = [];
6 |
7 | for (let i = 0; i < n; i++){
8 | let ice = rl.question("얼음틀 입력.\n").split("").map(Number);
9 | graph.push(ice);
10 | }
11 |
12 | // console.log(graph);
13 |
14 | function dfs(x, y){
15 | if( x <= - 1 || x >= n || y <= -1 || y >= m ){
16 | return false;
17 | }
18 | if( graph[x][y] === 0 ){
19 | graph[x][y] = 2;
20 | dfs(x -1, y);
21 | dfs(x, y - 1);
22 | dfs(x + 1, y);
23 | dfs(x, y + 1);
24 | return true;
25 | }
26 | return false;
27 | }
28 |
29 | let result = 0;
30 |
31 | for (let a = 0; a < n; a++){
32 | for (let b = 0; b < m; b++){
33 | if (dfs(a,b) === true){
34 | result += 1;
35 | }
36 | }
37 | }
38 |
39 | // console.log(result);
40 | // console.log(graph);
--------------------------------------------------------------------------------
/coding-test/wonji/greedy/1이될때까지.js:
--------------------------------------------------------------------------------
1 | // const N = prompt(`나뉠 수 입력`);
2 | // const K = prompt(`나눌 수 입력`);
3 |
4 | // function solution(N,K){
5 | // let result = 0;
6 | // while (N > 1) {
7 | // if (N % K === 0 ){
8 | // N /= K;
9 | // result += 1
10 | // } else {
11 | // N -= 1
12 | // result += 1
13 | // }
14 | // }
15 | // return result;
16 | // }
17 |
18 | // console.log(solution(N,K));
19 |
20 |
21 | const N = prompt(`나뉠 수 입력`);
22 | const K = prompt(`나눌 수 입력`);
23 |
24 | function solution(N, K){
25 | let cnt = 0;
26 | while (N !== 1) {
27 | N = N % K ? N - 1 : N / K;
28 | // N이 K로 나눠지지 않으면 N에서 1을 빼고, 나눠지면 N / K를 수행하여 N에 대입한다.
29 | cnt++;
30 | }
31 | return cnt;
32 | }
33 |
34 | console.log(solution(N, K));
--------------------------------------------------------------------------------
/coding-test/wonji/greedy/거스름돈.js:
--------------------------------------------------------------------------------
1 | const money = prompt(`거슬러 줘야 할 돈을 입력해주세요.
2 | (만원 이하로)`);
3 |
4 | const COINS = [5000, 1000, 500, 100, 50, 10];
5 |
6 | function solution(money) {
7 | const change = [];
8 |
9 | for (let i = 0; money !== 0; i++) {
10 | const count = Math.floor(money / coins[i]);
11 |
12 | change[i] = {
13 | 거스름돈: coins[i],
14 | 갯수: count,
15 | };
16 |
17 | if (count > 0) {
18 | money %= coins[i];
19 | }
20 | }
21 | return change;
22 | }
--------------------------------------------------------------------------------
/coding-test/wonji/implement/시각.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 | const h = parseInt(rl.question("N값 입력(시간).\n>>"));
3 | console.log(h);
4 |
5 | let count = 0;
6 |
7 | for (let i = 0; i < h + 1; i ++){
8 | for (let j = 0; j < 60; j ++){
9 | for (let k = 0; k < 60; k ++){
10 | let hms = `${i}+${j}+${k}`;
11 | if (hms.match(3)){
12 | count += 1;
13 | }
14 | }
15 | }
16 | }
17 |
18 | console.log(count);
19 |
20 |
--------------------------------------------------------------------------------
/coding-test/wonji/implement/왕실의나이트.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 | const input_data = rl.question("현재 나이트의 위치를 입력하시오.\n>>").toLowerCase();
3 |
4 | // console.log(input_data);
5 |
6 | const column = parseInt(input_data[0].charCodeAt(0)) - parseInt('a'.charCodeAt(0)) + 1;
7 | const row = parseInt(input_data[1]);
8 |
9 | // console.log(column);
10 | // console.log(row);
11 |
12 | const steps = [ [-2, -1], [-1, -2], [1, -2], [2, -1],
13 | [2, 1], [1, 2], [-1, 2], [-2, 1] ];
14 |
15 | // console.log(steps);
16 | // console.log(steps[0]);
17 |
18 | let result = 0;
19 | let next_row, next_column = 0;
20 |
21 | for (let i = 0; i < 8; i++){
22 | next_column = column + steps[i][1];
23 | next_row = row + steps[i][0];
24 |
25 | if (next_row >= 1 && next_row <= 8 && next_column >= 1 && next_column <= 8){
26 | result += 1;
27 | }
28 | }
29 |
30 | console.log(result);
31 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/k번째-수.js:
--------------------------------------------------------------------------------
1 | function solution(array, commands) {
2 | const answer = [];
3 | let list;
4 |
5 | for (let i = 0; i < commands.length; i++) {
6 | list = array.slice(commands[i][0] - 1, commands[i][1]).sort((a, b) => {
7 | return a - b;
8 | });
9 |
10 | list = array
11 | .slice(commands[i][0] - 1, commands[i][1])
12 | .sort(function (a, b) {
13 | return a - b;
14 | });
15 |
16 | answer.push(list[commands[i][2] - 1]);
17 | }
18 | return answer;
19 | }
20 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/가운데-글자-가져오기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | const middle = s.length / 2;
3 | if (s.length % 2 === 0) {
4 | return s.slice(middle - 1, middle + 1);
5 | } else {
6 | return s.substr(middle, 1);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/같은숫자는싫어.js:
--------------------------------------------------------------------------------
1 | function solution(arr)
2 | {
3 | const answer = []
4 | for (let i = 0; i < arr.length; i++){
5 | if(arr[i] !== arr[i + 1]){
6 | answer.push(arr[i]);
7 | }
8 | }
9 | return answer;
10 | }
11 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/두-개-뽑아서-더하기.js:
--------------------------------------------------------------------------------
1 | function solution(numbers) {
2 | const num = [];
3 |
4 | for(let i = 0; i < numbers.length - 1; i++){
5 | for(let j = i + 1; j < numbers.length; j++){
6 | const sum = numbers[i] + numbers[j] ;
7 | num.push(sum);
8 | }
9 | }
10 | const result = new Set(num);
11 | return [...result].sort((a, b) => a - b);
12 | }
13 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/두-정수-사이의-합.js:
--------------------------------------------------------------------------------
1 | function solution(a, b) {
2 | let result = 0;
3 | if (a > b){
4 | for (let i=b; i<=a; i++) {
5 | result = result + i;
6 | }
7 | return result;
8 | } else if (a < b){
9 | for (let i=a; i<=b; i++) {
10 | result = result + i;
11 | }
12 | return result;
13 | } else {
14 | return a
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/문자열-내-마음대로-정렬하기.js:
--------------------------------------------------------------------------------
1 | const solution = (strings, n) => strings.sort((a, b) => a[n] === b[n] ? a.localeCompare(b) : a[n].localeCompare(b[n]));
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/문자열-내림차순으로-배치하기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | return s.split('').sort().reverse().join('');
3 | }
4 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/문자열-다루기-기본-2.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | const len = s.length;
3 | if(len === 4 || len === 6){
4 | return s.split("").every((c)=>!isNaN(c));
5 | }
6 | return false;
7 | }
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/문자열-다루기-기본.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 | const isString = isNaN(s);
3 | if (s.length === 4 || s.length === 6) {
4 | if (isString) {
5 | return false;
6 | } else if (isString) {
7 | return true;
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/문자열내p와y의개수.js:
--------------------------------------------------------------------------------
1 | function solution(s){
2 |
3 | const p = s.match(/p/ig).length;
4 | const y = s.match(/y/ig).length;
5 | const P = s.match(/P/ig).length;
6 | const Y = s.match(/Y/ig).length;
7 | const pP = p + P
8 | const yY = y + Y
9 |
10 | if(pP !== null && yY != null) {
11 | return pP === yY
12 | }
13 | }
14 |
15 | /*
16 | * i : ignore, g : group
17 | * "abcABC".match(/a/gi); -> a를 대소문자를 무시(구분하지 않고)하여 하나의 그룹으로 반환해준다.
18 | * 단, "abcABC".match(/q/gi); -> 이와 같이 지정해준 패턴의 문자가 문자열 내에 없을 경우 null을 반환한다.
19 | * null에는 ".length"를 사용할 수 없기 때문에 런타임에러가 발생한 것.
20 | * 따라서 null인지를 먼저 검사한 후에 ".length"를 사용해주어야 한다.
21 | */
22 | function solution(s){
23 | let p = s.match(/p/ig),
24 | y = s.match(/y/ig);
25 |
26 | p = p === null ? 0 : p.length;
27 | y = y === null ? 0 : y.length;
28 |
29 | return p === y;
30 | }
31 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/문자열을-정수로-바꾸기.js:
--------------------------------------------------------------------------------
1 | function solution(s) {
2 |
3 | return Number(s);
4 | }
5 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/서울에서-김서방-찾기.js:
--------------------------------------------------------------------------------
1 | function solution(seoul) {
2 | return "김서방은 " + seoul.indexOf("Kim") + "에 있다";
3 | }
4 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/수박수박수.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | return "수박".repeat(n).slice(0, n);
3 | }
4 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/약수의 합.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | const answer = [];
3 | for (let i = 0; i <= n; i++) {
4 | if (n % i === 0) {
5 | answer.push(i);
6 | }
7 | }
8 | const sum = answer.reduce((a,b) => a + b, 0);
9 | return sum;
10 | }
11 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/완주하지-못한-선수(object).js:
--------------------------------------------------------------------------------
1 | function solution(participant, completion) {
2 | const ob = {
3 | name1 : participant.sort(),
4 | name2 : completion.sort()
5 | };
6 |
7 | for(let i=0; i < ob.name1.length; i++){
8 | if(ob.name1[i] !== ob.name2[i]){
9 | return ob.name1[i];
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/완주하지_못한_선수(object2).js:
--------------------------------------------------------------------------------
1 | function solution(participant, completion) {
2 | const ob = {};
3 | for (let player of participant) {
4 | if (player in ob) {
5 | ob[player] += 1;
6 | } else {
7 | ob[player] = 1;
8 | }
9 | }
10 |
11 | for (let finisher of completion) {
12 | ob[finisher] -= 1;
13 | }
14 |
15 | for (let player of participant) {
16 | if (ob[player] === 1) {
17 | return player;
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/자릿수-더하기.js:
--------------------------------------------------------------------------------
1 | function solution(n) {
2 | let answer = 0;
3 | const str = String(n);
4 |
5 | for (let i = 0; i < str.length; i++) {
6 | answer += parseInt(str[i]);
7 | }
8 | return answer;
9 | }
10 |
--------------------------------------------------------------------------------
/coding-test/wonji/level-1/체육복-1.js:
--------------------------------------------------------------------------------
1 | //여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 = reserve
2 | //체육복을 도난당한 학생들의 번호가 담긴 배열 = lost
3 |
4 | function solution(n, lost, reserve) {
5 | //진짜 체육복이 없는 학생들의 번호가 담긴 배열
6 | const realLost = lost.filter(a => !reserve.includes(a));
7 | //진짜 체육복을 두개 가지고 있는 학생들의 번호가 담긴 배열
8 | let realReserve = reserve.filter(a => !lost.includes(a));
9 |
10 | //전체 학생의 수 - 체육복이 없는 학생들중 체육복 못빌린 학생 수
11 | return n - realLost.filter(a => {
12 | let b = realReserve.find(r => Math.abs(r-a) <= 1);
13 | if(!b) return true;
14 | realReserve = realReserve.filter(r => r !== b);
15 | }).length;
16 | }
--------------------------------------------------------------------------------
/coding-test/woorim/binary-search/binary-search.js:
--------------------------------------------------------------------------------
1 | const arr = [1, 2, 4, 6, 8, 10, 13, 16, 187, 267];
2 |
3 | const target = 30897;
4 | function binarySearch(start, end) {
5 | if (start > end) return -1;
6 |
7 | const mid = parseInt((start + end) / 2);
8 | if (target > arr[mid]) return binarySearch(mid + 1, end);
9 | if (target < arr[mid]) return binarySearch(start, mid - 1);
10 | return mid;
11 | }
12 |
13 | console.log(binarySearch(0, arr.length - 1));
14 |
15 |
--------------------------------------------------------------------------------
/coding-test/woorim/binary-search/떡볶이-떡-만들기.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const input = fs.readFileSync("/dev/stdin").toString().split("\n");
3 |
4 | const [N, M] = input[0].split(" ").map(Number);
5 | const cakes = input[1]
6 | .split(" ")
7 | .map(Number)
8 | .sort((a, b) => a - b);
9 |
10 | const result = [];
11 | function binarySearch(target, start, end) {
12 | if (start > end) return -1;
13 | const mid = parseInt((start + end) / 2);
14 |
15 | let total = 0;
16 | for (let cake of cakes) {
17 | if (cake > mid) {
18 | total += cake - mid;
19 | }
20 | }
21 |
22 | if (total === target) result.push(mid);
23 | if (total > target) {
24 | result.push(mid);
25 | return binarySearch(target, mid + 1, end);
26 | }
27 | if (total < target) return binarySearch(target, start, mid - 1);
28 | }
29 |
30 | binarySearch(M, 0, cakes[cakes.length - 1]);
31 | console.log(result[result.length - 1]);
32 |
33 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/bfs.js:
--------------------------------------------------------------------------------
1 | const graph = [
2 | [],
3 | [2, 3, 8],
4 | [1, 7],
5 | [1, 4, 5],
6 | [3, 5],
7 | [3, 4],
8 | [7],
9 | [2, 6, 8],
10 | [1, 7]
11 | ]
12 | const visited = new Array(9).fill(false);
13 |
14 | function bfs(start) {
15 | const queue = [start];
16 | visited[start] = true;
17 |
18 | while (queue.length !== 0) {
19 | const v = queue.shift();
20 | process.stdout.write(`${v} `);
21 |
22 | for (let child of graph[v]) {
23 | if (!visited[child]) {
24 | queue.push(child);
25 | visited[child] = true;
26 | }
27 | }
28 | }
29 | }
30 |
31 | bfs(1);
32 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/dfs.js:
--------------------------------------------------------------------------------
1 | const graph = [
2 | [],
3 | [2, 3, 8],
4 | [1, 7],
5 | [1, 4, 5],
6 | [3, 5],
7 | [3, 4],
8 | [7],
9 | [2, 6, 8],
10 | [1, 7]
11 | ]
12 | const visited = new Array(9).fill(false);
13 |
14 | function dfs(v) {
15 | visited[v] = true;
16 | process.stdout.write(`${v} `);
17 |
18 | for (let child of graph[v]) {
19 | if (!visited[child]) dfs(child);
20 | }
21 | }
22 |
23 | dfs(1);
24 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/queue.js:
--------------------------------------------------------------------------------
1 | class Queue {
2 | #arr;
3 |
4 | constructor() {
5 | this.#arr = [];
6 | }
7 | enqueue(item) {
8 | this.#arr.push(item);
9 | }
10 | dequeue() {
11 | return this.#arr.shift();
12 | }
13 | }
14 |
15 | const queue = new Queue();
16 | queue.enqueue(1);
17 | queue.enqueue(2);
18 | queue.enqueue(3);
19 | queue.dequeue(); // 1
20 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/recursive.js:
--------------------------------------------------------------------------------
1 | function factorialIteractive(n) {
2 | result = 1;
3 | for (let i = 2; i <= n; i++) {
4 | result *= i;
5 | }
6 | return result;
7 | }
8 |
9 | function factorialRecursive(n) {
10 | if (n <= 2) return 2;
11 | return n * factorialRecursive(n - 1);
12 | }
13 |
14 | console.log(factorialIteractive(5));
15 | console.log(factorialRecursive(5));
16 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/stack.js:
--------------------------------------------------------------------------------
1 | class Stack {
2 | #arr;
3 |
4 | constructor() {
5 | this.#arr = [];
6 | }
7 | push(item) {
8 | this.#arr.push(item);
9 | }
10 | pop() {
11 | return this.#arr.pop();
12 | }
13 | peek() {
14 | return this.#arr[this._arr.length - 1];
15 | }
16 | }
17 |
18 | const stack = new Stack();
19 | stack.push(1);
20 | stack.push(2);
21 | stack.push(3);
22 | stack.pop(); // 3
23 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/tree.js:
--------------------------------------------------------------------------------
1 | class Node {
2 | constructor(content, children = []) {
3 | this.content = content;
4 | this.children = children;
5 | }
6 | }
7 |
8 | const tree = new Node('hello', [
9 | new Node('world'),
10 | new Node('and'),
11 | new Node('fun', [
12 | new Node('javascript!')
13 | ])
14 | ]);
15 |
16 | function traverse(node) {
17 | console.log(node.content);
18 | for (let child of node.children) {
19 | traverse(child);
20 | }
21 | }
22 |
23 | traverse(tree);
24 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/바이러스(백준-2606).js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const input = fs.readFileSync('/dev/stdin').toString().split('\n');
3 |
4 | const [N] = input[0].split(" ").map(val => parseInt(val));
5 | const [M] = input[1].split(" ").map(val => parseInt(val));
6 |
7 | const graph = Array.from(new Array(N + 1), () => new Array());
8 | let visited;
9 |
10 | for (let i = 2; i <= M + 1; i++) {
11 | const [node1, node2] = input[i].split(" ").map(val => parseInt(val));
12 | graph[node1].push(node2);
13 | graph[node2].push(node1);
14 | }
15 |
16 | graph.map((v) => v.sort((a, b) => a - b));
17 |
18 | const visitingNodeByDfs = [];
19 | function dfs(v) {
20 | visited[v] = true;
21 | visitingNodeByDfs.push(v);
22 | for (let child of graph[v]) {
23 | if (!visited[child]) {
24 | dfs(child);
25 | }
26 | }
27 | }
28 |
29 | visited = new Array(N + 1).fill(false);
30 | dfs(1);
31 | console.log(visitingNodeByDfs.length - 1)
32 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/음료수-얼려-먹기.js:
--------------------------------------------------------------------------------
1 | const rl = require("readline-sync");
2 |
3 | const [n, m] = rl.question(">> ").split(" ");
4 | const [dx, dy] = [
5 | [-1, +1, 0, 0],
6 | [0, 0, -1, +1]
7 | ];
8 |
9 | let ices = [
10 | [0, 0, 1],
11 | [0, 1, 0],
12 | [1, 0, 1]
13 | ];
14 |
15 | function 음료수_얼려_먹기(x, y) {
16 | if (x <= -1 || x >= n || y <= -1 || y >= m) return false;
17 |
18 | if (ices[x][y] === 0) {
19 | ices[x][y] = 1;
20 |
21 | for (let i = 0; i < 4; i++) {
22 | 음료수_얼려_먹기(x + dx[i], y + dy[i]);
23 | }
24 | return true;
25 | }
26 | return false;
27 | }
28 |
29 | let cnt = 0;
30 | for (let i = 0; i < n; i++) {
31 | for (let j = 0; j < m; j++) {
32 | if (음료수_얼려_먹기(i, j)) cnt++;
33 | }
34 | }
35 |
36 | console.log(cnt);
37 |
--------------------------------------------------------------------------------
/coding-test/woorim/dfs-bfs/타겟-넘버(프로그래머스).js:
--------------------------------------------------------------------------------
1 | let _numbers;
2 | let _numbersLength;
3 | let _target;
4 | let cnt = 0;
5 |
6 | function solution(numbers, target) {
7 | _numbers = numbers;
8 | _numbersLength = _numbers.length;
9 | _target = target;
10 |
11 | dfs(0, 0)
12 | return cnt;
13 | }
14 |
15 | function dfs(idx, total) {
16 | if (idx === _numbersLength) {
17 | if (total === _target) cnt++;
18 | return;
19 | }
20 | dfs(idx + 1, total + _numbers[idx]);
21 | dfs(idx + 1, total - _numbers[idx]);
22 | }
23 |
--------------------------------------------------------------------------------
/coding-test/woorim/greedy/input.txt:
--------------------------------------------------------------------------------
1 | 11
2 | 1 4
3 | 3 5
4 | 0 6
5 | 5 7
6 | 3 8
7 | 5 9
8 | 6 10
9 | 8 11
10 | 8 12
11 | 2 13
12 | 12 14
--------------------------------------------------------------------------------
/coding-test/woorim/greedy/거스름돈.js:
--------------------------------------------------------------------------------
1 | const STANDARD_MONEYS = [10000, 5000, 1000, 500, 100, 50, 10];
2 |
3 | function solution(change) {
4 | let cnt = 0;
5 | for (let stdMoney of STANDARD_MONEYS) {
6 | cnt += parseInt(change / stdMoney);
7 | change %= stdMoney;
8 | }
9 | return cnt;
10 | }
11 |
12 | console.log(solution(1260));
13 | console.log(solution(800));
14 | console.log(solution(10000));
15 |
--------------------------------------------------------------------------------
/coding-test/woorim/greedy/주유소.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const input = fs.readFileSync("/dev/stdin").toString().split("\n");
3 |
4 | const [N] = input[0].split(" ").map(Number);
5 |
6 | const roadLengthes = input[1].split(" ").map(BigInt);
7 | const pricePerRoads = input[2].split(" ").map(BigInt);
8 |
9 | function solution() {
10 | let minPrice = pricePerRoads[0];
11 | let total = BigInt(0);
12 | for (let i = 0; i < N - 1; i++) {
13 | if (pricePerRoads[i] < minPrice) {
14 | minPrice = pricePerRoads[i];
15 | }
16 | total += minPrice * roadLengthes[i];
17 | }
18 | return total;
19 | }
20 |
21 | console.log(`${solution()}`);
22 |
23 |
--------------------------------------------------------------------------------
/coding-test/woorim/greedy/회의실배정-BOJ-1931.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
3 | let input = fs.readFileSync(filePath).toString().split("\n");
4 |
5 | const N = parseInt(input[0]);
6 | const M = [];
7 | for (let i = 1; i < input.length; i++) {
8 | M.push(input[i].split(" ").map((v) => parseInt(v)));
9 | }
10 |
11 | function solution(N, M) {
12 | // 풀이
13 | M.sort(([a1, a2], [b1, b2]) => {
14 | if (a2 === b2) {
15 | return a1 - b1;
16 | }
17 | return a2 - b2;
18 | });
19 |
20 | let count = 1;
21 | let endTime = M[0][1];
22 |
23 | for (let i = 1; i < M.length; i++) {
24 | if (M[i][0] >= endTime) {
25 | count++;
26 | endTime = M[i][1];
27 | }
28 | }
29 |
30 | return count;
31 | }
32 |
33 | console.log(solution(N, M));
34 |
--------------------------------------------------------------------------------
/coding-test/woorim/implement/상하좌우.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | const rl = require("readline-sync");
3 |
4 | const N = parseInt(rl.question("공간의 크기(조건: 숫자)\n>> "));
5 | const moves = rl.question("이동 좌표(조건: 공백을 기준으로 알파벳)\n>> ").toUpperCase().split(" ");
6 |
7 | const [RL, UD] = [["R", "L"], ["U", "D"]];
8 | const [dx, dy] = [
9 | { "R": 1, "L": -1 },
10 | { "U": -1, "D": 1 }
11 | ];
12 |
13 | function 상하좌우(N, moves) {
14 | let [x, y, nx, ny] = [1, 1, 0, 0];
15 | for (let mv of moves) {
16 | nx = RL.includes(mv) ? x + dx[mv] : x;
17 | ny = UD.includes(mv) ? y + dy[mv] : y;
18 | x = nx < 1 || nx > N ? x : nx;
19 | y = ny < 1 || ny > N ? y : ny;
20 | }
21 |
22 | return [x, y];
23 | }
24 |
25 | console.log(상하좌우(N, moves));
26 |
27 |
--------------------------------------------------------------------------------
/coding-test/woorim/implement/시각.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | function 시각(hour) {
4 | let cnt = 0;
5 | for (let h = 0; h <= hour; h++) {
6 | for (let m = 0; m <= 59; m++) {
7 | for (let s = 0; s <= 59; s++) {
8 | if ((String(h) + String(m) + String(s)).includes("3")) cnt++;
9 | }
10 | }
11 | }
12 | return cnt;
13 | }
14 |
15 | console.log(시각(5));
16 |
--------------------------------------------------------------------------------
/coding-test/woorim/implement/왕실의-나이트.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | const rl = require("readline-sync");
3 |
4 | const place = rl.question("말의 위치\n>> ");
5 |
6 | const column = { "a": 0, "b": 1, "c": 2, "d": 3, "e": 4, "f": 5, "g": 6, "h": 7 };
7 |
8 | const steps = [
9 | [-2, -1], [-2, +1], [+2, -1], [+2, +1], [-1, -2], [+1, -2], [-1, +2], [+1, +2]
10 | ];
11 |
12 | function 왕실의_나이트(place) {
13 | const [col, row] = [column[place[0]], place[1] - 1];
14 |
15 | let cnt = 0;
16 | for (let step of steps) {
17 | const nx = col + step[0];
18 | const ny = row + step[1];
19 | if (nx >= 0 && nx <= 7 && ny >= 0 && ny <= 7) cnt++;
20 | }
21 | return cnt;
22 | }
23 |
24 | console.log(왕실의_나이트(place));
25 |
--------------------------------------------------------------------------------
/coding-test/woorim/implement/해치웠나(소마-데모).js:
--------------------------------------------------------------------------------
1 | const readline = require("readline");
2 |
3 | const rl = readline.createInterface({
4 | input: process.stdin,
5 | output: process.stdout,
6 | });
7 |
8 | rl.on("line", function (x) {
9 | let [cnt1, cnt2] = [0, 0];
10 | for (let el of x) {
11 | if (el === "(") cnt1++;
12 | else if (el === ")") cnt2++;
13 | }
14 | console.log(cnt1 === cnt2 ? "YES" : "NO")
15 | rl.close();
16 | }).on("close", function () {
17 | process.exit();
18 | });
19 |
20 |
--------------------------------------------------------------------------------
/coding-test/woorim/sort/countSort.js:
--------------------------------------------------------------------------------
1 | const arr = [7, 1, 5, 4, 8, 6, 3, 2, 9, 8, 0];
2 |
3 | function countSort() {
4 | const countedArr = new Array(arr.length - 1).fill(0);
5 | const countSortedArr = [];
6 |
7 | for (let ar of arr) {
8 | countedArr[ar]++;
9 | }
10 |
11 | for (let i = 0; i < countedArr.length; i++) {
12 | for (let j = 0; j < countedArr[i]; j++) {
13 | countSortedArr.push(i);
14 | }
15 | }
16 | return countSortedArr;
17 | }
18 |
19 | const countSortedArr = countSort();
20 | console.log(countSortedArr);
21 |
22 |
--------------------------------------------------------------------------------
/coding-test/woorim/sort/insertionSort.js:
--------------------------------------------------------------------------------
1 | const arr = [7, 1, 5, 6, 2, 0, 3, 4, 9, 8];
2 |
3 | // 삽입 정렬 : 원소가 정렬될 위치에 배치되는 알고리즘.
4 | // 나보다 큰 원소를 만나면 위치를 바꾸고 작은 워소를 만나면 그 자리에서 멈춘다.
5 | for (let i = 1; i < arr.length; i++) {
6 | for (let j = i; j > 0; j--) {
7 | if (arr[j] < arr[j - 1]) {
8 | [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]]
9 | } else {
10 | break;
11 | }
12 | }
13 | }
14 |
15 | console.log(arr);
16 |
--------------------------------------------------------------------------------
/coding-test/woorim/sort/quickSort.js:
--------------------------------------------------------------------------------
1 | const arr = [7, 1, 5, 4, 8, 6, 3, 2, 9, 8, 0];
2 |
3 | function quickSort(arr, start, end) {
4 | if (start >= end) return;
5 |
6 | const pivot = start;
7 | let [left, right] = [start + 1, end];
8 |
9 | while (left <= right) {
10 | while (left <= end && arr[left] <= arr[pivot]) {
11 | left++;
12 | }
13 | while (right > start && arr[right] >= arr[pivot]) {
14 | right--;
15 | }
16 | if (left > right) {
17 | [arr[pivot], arr[right]] = [arr[right], arr[pivot]];
18 | } else {
19 | [arr[left], arr[right]] = [arr[right], arr[left]];
20 | }
21 | }
22 | quickSort(arr, start, right - 1);
23 | quickSort(arr, left, end);
24 | }
25 |
26 | quickSort(arr, 0, arr.length - 1);
27 | console.log(arr);
28 |
29 |
--------------------------------------------------------------------------------
/coding-test/woorim/sort/selectionSort.js:
--------------------------------------------------------------------------------
1 | const arr = [7, 1, 5, 6, 2, 0, 3, 4, 9, 8];
2 |
3 | for (let i = 0; i < arr.length; i++) {
4 | let idx = i;
5 | for (let j = i + 1; j < arr.length; j++)
6 | if (arr[j] < arr[idx])
7 | idx = j;
8 | [arr[i], arr[idx]] = [arr[idx], arr[i]]
9 | }
10 |
11 | console.log(arr);
12 |
--------------------------------------------------------------------------------
/coding-test/woorim/sort/두-배열의-원소-교체.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const input = fs.readFileSync("/dev/stdin").toString().split("\n");
3 |
4 | const [N, K] = input[0].split(" ").map(Number);
5 |
6 | const A = input[1].split(" ").map(Number).sort((a, b) => a - b);
7 | const B = input[2].split(" ").map(Number).sort((a, b) => b - a);
8 |
9 | for (let i = 0; i < K; i++) {
10 | if (A[i] < B[i]) {
11 | [A[i], B[i]] = [B[i], A[i]];
12 | } else {
13 | break;
14 | }
15 | }
16 |
17 | const total = A.reduce((acc, el) => acc + el);
18 | console.log(total);
19 |
20 |
--------------------------------------------------------------------------------
/coding-test/woorim/sort/성적이-낮은-순서로-학생-출력하기(정렬라이브러리사용).js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const input = fs.readFileSync("/dev/stdin").toString().split("\n");
3 |
4 | const [N] = input[0].split(" ").map((val) => parseInt(val));
5 |
6 | const students = [];
7 | for (let i = 1; i <= N; i++) {
8 | const [name, grade] = input[i].split(" ");
9 | students.push([name, Number(grade)]);
10 | }
11 |
12 | students.sort((a, b) => a[1] - b[1]);
13 | students.forEach((el) => process.stdout.write(`${el[0]} `));
14 |
15 |
--------------------------------------------------------------------------------
/coding-test/woorim/sort/위에서-아래로.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const input = fs.readFileSync("/dev/stdin").toString().split("\n");
3 |
4 | const N = Number(input[0]);
5 |
6 | const unsorted = [];
7 | for (let i = 1; i <= N; i++) {
8 | unsorted.push(Number(input[i]));
9 | }
10 |
11 | unsorted.sort((a, b) => b - a);
12 |
13 | console.log(unsorted);
14 |
15 |
--------------------------------------------------------------------------------
/sql/README.md:
--------------------------------------------------------------------------------
1 | # 👨🏻💻 우아한 SQL
2 | 프로그래머스의 "SQL 고득점 kit"을 활용한다.
3 |
4 | [SQL 공부하러가기](https://programmers.co.kr/learn/challenges)
5 |
--------------------------------------------------------------------------------
/sql/kimjiwon/GROUP_BY/고양이와개는몇마리.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
3 | FROM ANIMAL_INS
4 | GROUP BY ANIMAL_TYPE
5 | ORDER BY ANIMAL_TYPE ASC;
--------------------------------------------------------------------------------
/sql/kimjiwon/GROUP_BY/동명동물수찾기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT NAME, COUNT(NAME) AS COUNT
3 | FROM ANIMAL_INS
4 | GROUP BY NAME
5 | HAVING COUNT(NAME) > 1
6 | ORDER BY NAME ASC;
--------------------------------------------------------------------------------
/sql/kimjiwon/GROUP_BY/입양시간구하기(1).sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT HOUR(DATETIME) AS HOUR,COUNT(HOUR(DATETIME)) AS COUNT
3 | FROM ANIMAL_OUTS
4 | WHERE HOUR(DATETIME) > 8 AND HOUR(DATETIME) < 20
5 | GROUP BY HOUR(DATETIME)
6 | ORDER BY HOUR(DATETIME) ASC;
--------------------------------------------------------------------------------
/sql/kimjiwon/GROUP_BY/입양시간구하기(2).sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SET @hour := -1;
3 | -- := 오른쪽 값을 왼쪽에 대입
4 | SELECT (@hour := @hour + 1) AS HOUR,
5 | (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS COUNT
6 | FROM ANIMAL_OUTS
7 | WHERE @hour < 23;
--------------------------------------------------------------------------------
/sql/kimjiwon/ISNULL/NULL처리하기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_TYPE, IFNULL(NAME,'No name') AS NAME, SEX_UPON_INTAKE
3 | FROM ANIMAL_INS;
--------------------------------------------------------------------------------
/sql/kimjiwon/ISNULL/이름이없는동물의아이디.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID
3 | FROM ANIMAL_INS
4 | WHERE NAME IS NULL;
--------------------------------------------------------------------------------
/sql/kimjiwon/ISNULL/이름이있는동물의아이디.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID
3 | FROM ANIMAL_INS
4 | WHERE NAME IS NOT NULL
5 | ORDER BY ANIMAL_ID ASC;
--------------------------------------------------------------------------------
/sql/kimjiwon/JOIN/보호소에서중성화한동물.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.ANIMAL_TYPE, ANIMAL_OUTS.NAME
3 | FROM ANIMAL_OUTS
4 | LEFT JOIN ANIMAL_INS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
5 | WHERE ANIMAL_INS.SEX_UPON_INTAKE != ANIMAL_OUTS.SEX_UPON_OUTCOME
6 | ORDER BY ANIMAL_OUTS.ANIMAL_ID;
--------------------------------------------------------------------------------
/sql/kimjiwon/JOIN/없어진기록찾기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
3 | FROM ANIMAL_OUTS
4 | LEFT JOIN ANIMAL_INS ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
5 | WHERE ANIMAL_INS.ANIMAL_ID IS NULL;
--------------------------------------------------------------------------------
/sql/kimjiwon/JOIN/오랜기간보호한동물(1).sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME
3 | FROM ANIMAL_INS
4 | LEFT JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
5 | WHERE ANIMAL_OUTS.ANIMAL_ID IS NULL
6 | ORDER BY ANIMAL_INS.DATETIME ASC LIMIT 3;
--------------------------------------------------------------------------------
/sql/kimjiwon/JOIN/있었는데요없었습니다.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
3 | FROM ANIMAL_OUTS
4 | INNER JOIN ANIMAL_INS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
5 | WHERE ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME
6 | ORDER BY ANIMAL_INS.DATETIME ASC;
7 |
--------------------------------------------------------------------------------
/sql/kimjiwon/SELECT/동물의아이디와이름.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID;
--------------------------------------------------------------------------------
/sql/kimjiwon/SELECT/모든레코드조회.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT * from ANIMAL_INS;
--------------------------------------------------------------------------------
/sql/kimjiwon/SELECT/상위n개레코드.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1;
--------------------------------------------------------------------------------
/sql/kimjiwon/SELECT/아픈동물찾기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION='Sick';
--------------------------------------------------------------------------------
/sql/kimjiwon/SELECT/어린동물찾기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION != 'Aged';
--------------------------------------------------------------------------------
/sql/kimjiwon/SELECT/여러기준으로정렬하기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY NAME ASC, DATETIME DESC;
--------------------------------------------------------------------------------
/sql/kimjiwon/SELECT/역순정렬하기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC;
--------------------------------------------------------------------------------
/sql/kimjiwon/SUM,MAX,MIN/동물수구하기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT COUNT(INTAKE_CONDITION) AS COUNT FROM ANIMAL_INS;
--------------------------------------------------------------------------------
/sql/kimjiwon/SUM,MAX,MIN/중복제거하기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT COUNT(DISTINCT NAME) AS COUNT FROM ANIMAL_INS;
--------------------------------------------------------------------------------
/sql/kimjiwon/SUM,MAX,MIN/최댓값구하기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT MAX(DATETIME) FROM ANIMAL_INS;
--------------------------------------------------------------------------------
/sql/kimjiwon/SUM,MAX,MIN/최소값구하기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT MIN(DATETIME) FROM ANIMAL_INS;
--------------------------------------------------------------------------------
/sql/kimjiwon/String,Date/DATETIME에서DATE로형변환.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') as '날짜'
3 | FROM ANIMAL_INS
4 | ORDER BY ANIMAL_ID;
--------------------------------------------------------------------------------
/sql/kimjiwon/String,Date/루시와엘라찾기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
3 | FROM ANIMAL_INS
4 | WHERE NAME = 'Lucy' or NAME = 'Pickle' or NAME = 'Rogan' or NAME = 'Sabrina' or NAME = 'Mitty' or NAME = 'Ella';
--------------------------------------------------------------------------------
/sql/kimjiwon/String,Date/오랜기간보호한동물(2).sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT OUTS.ANIMAL_ID, OUTS.NAME
3 | FROM ANIMAL_OUTS OUTS
4 | INNER JOIN ANIMAL_INS INS
5 | ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
6 | WHERE DATEDIFF(OUTS.DATETIME, INS.DATETIME) > 0
7 | ORDER BY DATEDIFF(OUTS.DATETIME, INS.DATETIME) DESC LIMIT 2;
--------------------------------------------------------------------------------
/sql/kimjiwon/String,Date/이름에EL들어가는동물찾기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT ANIMAL_ID, NAME
3 | FROM ANIMAL_INS
4 | WHERE NAME = "el" AND ANIMAL_TYPE = 'Dog'
5 | ORDER BY NAME ASC;
--------------------------------------------------------------------------------
/sql/kimjiwon/String,Date/중성화여부파악하기.sql:
--------------------------------------------------------------------------------
1 | -- 코드를 입력하세요
2 | SELECT
3 | ANIMAL_ID,
4 | NAME,
5 | CASE
6 | WHEN SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%'
7 | THEN 'O'
8 | ELSE 'X'
9 | END AS '중성화'
10 | FROM ANIMAL_INS
11 | ORDER BY ANIMAL_ID;
--------------------------------------------------------------------------------
/sql/soongu/groupby/고양이와개는몇마리있을까.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_TYPE, count(ANIMAL_TYPE) as count
2 | from ANIMAL_INS
3 | group by ANIMAL_TYPE
4 | order by
5 | CASE ANIMAL_TYPE
6 | WHEN 'Cat' THEN 1
7 | WHEN 'DOG' THEN 2
8 | ELSE 3
9 | END;
--------------------------------------------------------------------------------
/sql/soongu/groupby/동명동물수찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT NAME, count(NAME) as COUNT
2 | from ANIMAL_INS
3 | group by NAME
4 | having count(NAME) >= 2
5 | order by NAME;
--------------------------------------------------------------------------------
/sql/soongu/groupby/입양시각구하기(1).sql:
--------------------------------------------------------------------------------
1 | SELECT hour(DATETIME) as HOUR, count(hour(DATETIME)) as COUNT
2 | from ANIMAL_OUTS
3 | where hour(DATETIME) between '9' and '19'
4 | group by hour(DATETIME)
5 | order by hour asc;
--------------------------------------------------------------------------------
/sql/soongu/groupby/입양시각구하기(2).sql:
--------------------------------------------------------------------------------
1 | SET @hour = -1;
2 | SELECT
3 | (@hour :=@hour+1) as HOUR,
4 | (SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS COUNT
5 | FROM
6 | ANIMAL_OUTS
7 | WHERE
8 | @hour < 23;
--------------------------------------------------------------------------------
/sql/soongu/isnull/null처리하기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_TYPE, IFNULL(NAME, "No name") AS NAME, SEX_UPON_INTAKE
2 | FROM ANIMAL_INS
--------------------------------------------------------------------------------
/sql/soongu/isnull/이름이없는동물의아이디.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID
2 | from ANIMAL_INS
3 | where NAME is NULL
4 | ORDER BY ANIMAL_ID ASC;
--------------------------------------------------------------------------------
/sql/soongu/isnull/이름이있는동물의아이디.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID
2 | FROM ANIMAL_INS
3 | WHERE NAME IS NOT NULL
4 | ORDER BY ANIMAL_ID ASC;
--------------------------------------------------------------------------------
/sql/soongu/join/보호소에서중성화한동물.sql:
--------------------------------------------------------------------------------
1 | SELECT AO.ANIMAL_ID, AO.ANIMAL_TYPE, AO.NAME
2 | FROM ANIMAL_INS AI
3 | RIGHT JOIN ANIMAL_OUTS AO
4 | ON AI.ANIMAL_ID = AO.ANIMAL_ID
5 | WHERE AI.SEX_UPON_INTAKE != AO.SEX_UPON_OUTCOME
6 | ORDER BY AO.ANIMAL_ID
--------------------------------------------------------------------------------
/sql/soongu/join/없어진기록찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT AO.ANIMAL_ID, AO.NAME
2 | FROM ANIMAL_OUTS AO
3 | LEFT OUTER JOIN ANIMAL_INS AI
4 | ON AO.ANIMAL_ID = AI.ANIMAL_ID
5 | WHERE AI.ANIMAL_ID is NULL
6 | ORDER BY AO.ANIMAL_ID
--------------------------------------------------------------------------------
/sql/soongu/join/오랜기간보호한동물(1).sql:
--------------------------------------------------------------------------------
1 | SELECT AI.NAME, AI.DATETIME
2 | FROM ANIMAL_INS AI
3 | LEFT JOIN ANIMAL_OUTS AO
4 | ON AI.ANIMAL_ID = AO.ANIMAL_ID
5 | WHERE AO.ANIMAL_ID IS NULL
6 | ORDER BY AI.DATETIME
7 | LIMIT 3;
--------------------------------------------------------------------------------
/sql/soongu/join/있었는데요없었습니다.sql:
--------------------------------------------------------------------------------
1 | SELECT AI.ANIMAL_ID, AI.NAME
2 | FROM ANIMAL_INS AI
3 | JOIN ANIMAL_OUTS AO
4 | ON AI.ANIMAL_ID = AO.ANIMAL_ID AND abs(AI.DATETIME) > abs(AO.DATETIME)
5 | ORDER BY AI.DATETIME
--------------------------------------------------------------------------------
/sql/soongu/select/동물의아이디와이름.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME
2 | FROM ANIMAL_INS
3 | ORDER BY ANIMAL_ID;
--------------------------------------------------------------------------------
/sql/soongu/select/모든레코드조회하기.sql:
--------------------------------------------------------------------------------
1 | SELECT *
2 | FROM ANIMAL_INS
3 | ORDER BY ANIMAL_ID ASC;
--------------------------------------------------------------------------------
/sql/soongu/select/상위n개 레코드.sql:
--------------------------------------------------------------------------------
1 | SELECT NAME
2 | FROM ANIMAL_INS
3 | WHERE DATETIME IN (SELECT MIN(DATETIME)
4 | FROM ANIMAL_INS);
--------------------------------------------------------------------------------
/sql/soongu/select/아픈동물찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME
2 | from ANIMAL_INS
3 | WHERE INTAKE_CONDITION like "sick";
--------------------------------------------------------------------------------
/sql/soongu/select/어린동물찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME
2 | from ANIMAL_INS
3 | WHERE INTAKE_CONDITION != "Aged";
--------------------------------------------------------------------------------
/sql/soongu/select/여러기준으로정렬하기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME, DATETIME
2 | from ANIMAL_INS
3 | ORDER BY NAME, DATETIME DESC;
--------------------------------------------------------------------------------
/sql/soongu/select/역순정렬하기.sql:
--------------------------------------------------------------------------------
1 | SELECT NAME, DATETIME
2 | from ANIMAL_INS
3 | ORDER BY ANIMAL_ID DESC;
--------------------------------------------------------------------------------
/sql/soongu/string,date/datetime에서date로형변환.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
2 | FROM ANIMAL_INS
--------------------------------------------------------------------------------
/sql/soongu/string,date/루시와엘라찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
2 | FROM ANIMAL_INS
3 | WHERE NAME = "Lucy" OR NAME = "Ella"
4 | OR NAME = "Pickle" OR NAME = "Rogan"
5 | OR NAME = "Sabrina" OR NAME = "Mitty";
--------------------------------------------------------------------------------
/sql/soongu/string,date/오랜기간보호한동물(2).sql:
--------------------------------------------------------------------------------
1 | SELECT AI.ANIMAL_ID, AI.NAME
2 | FROM ANIMAL_INS AI
3 | JOIN ANIMAL_OUTS AO
4 | ON AI.ANIMAL_ID = AO.ANIMAL_ID
5 | ORDER BY abs(AO.DATETIME - AI.DATETIME) DESC
6 | LIMIT 2;
--------------------------------------------------------------------------------
/sql/soongu/string,date/이름에EL이들어가는동물찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME
2 | FROM ANIMAL_INS
3 | WHERE ANIMAL_TYPE = "Dog" AND NAME LIKE "%el%"
4 | ORDER BY NAME
--------------------------------------------------------------------------------
/sql/soongu/string,date/중성화여부파악하기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME,
2 | CASE
3 | WHEN SEX_UPON_INTAKE LIKE "%Neutered%" OR SEX_UPON_INTAKE LIKE "%Spayed%"
4 | THEN "O"
5 | ELSE 'X' END AS "중성화"
6 | FROM ANIMAL_INS
7 | ORDER BY ANIMAL_ID
--------------------------------------------------------------------------------
/sql/soongu/sum,max,min/동물수구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT count(ANIMAL_ID)
2 | from ANIMAL_INS;
--------------------------------------------------------------------------------
/sql/soongu/sum,max,min/중복제거하기.sql:
--------------------------------------------------------------------------------
1 | SELECT count(DISTINCT NAME)
2 | from ANIMAL_INS
3 | where NAME is NOT NULL;
--------------------------------------------------------------------------------
/sql/soongu/sum,max,min/최대값구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT MAX(DATETIME)
2 | FROM ANIMAL_INS;
--------------------------------------------------------------------------------
/sql/soongu/sum,max,min/최솟값구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT DATETIME as 시간
2 | from ANIMAL_INS
3 | order by abs(now() - DATETIME) desc
4 | limit 1;
--------------------------------------------------------------------------------
/sql/wonji/group-by/고양이와-개는-몇-마리-있을까.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_type, count(animal_type) as count
2 | from animal_ins
3 | group by animal_type
4 | order by case animal_type when "cat" then 1 when "dog" then 2 end;
--------------------------------------------------------------------------------
/sql/wonji/group-by/동명-동물-수-찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT name, count(name) as count
2 | from animal_ins
3 | where name is not null
4 | group by name having count(name) >= 2
5 | order by name;
--------------------------------------------------------------------------------
/sql/wonji/group-by/입양-시각-구하기(1).sql:
--------------------------------------------------------------------------------
1 | SELECT hour(datetime) as hour, count(datetime) as count
2 | from animal_outs
3 | group by hour(datetime) having hour >= 9 and hour <= 19
4 | order by hour(datetime);
--------------------------------------------------------------------------------
/sql/wonji/group-by/입양-시각-구하기(2).sql:
--------------------------------------------------------------------------------
1 | set @hour := -1;
2 | SELECT (@hour := @hour + 1) as hour,
3 | (select count(*) from animal_outs where @hour = hour(datetime)) as count
4 | from animal_outs
5 | where @hour < 23
--------------------------------------------------------------------------------
/sql/wonji/is-null/null-처리하기.sql:
--------------------------------------------------------------------------------
1 | select animal_type, ifnull(name, "No name") as name, sex_upon_intake
2 | from animal_ins
3 | order by animal_id;
--------------------------------------------------------------------------------
/sql/wonji/is-null/이름이-없는-동물의-아이디.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id from animal_ins where name is null;
--------------------------------------------------------------------------------
/sql/wonji/is-null/이름이-있는-동물의-아이디.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id from animal_ins where name is not null;
--------------------------------------------------------------------------------
/sql/wonji/join/보호소에서-중성화한-동물.sql:
--------------------------------------------------------------------------------
1 | SELECT ins.animal_id, ins.animal_type, ins.name
2 | from animal_ins ins
3 | left join animal_outs outs
4 | on ins.animal_id = outs.animal_id
5 | where ins.sex_upon_intake like "%intact%"
6 | and (outs.sex_upon_outcome like "%spayed%" or outs.sex_upon_outcome like "%neutered%")
7 | order by ins.animal_id;
--------------------------------------------------------------------------------
/sql/wonji/join/없어진-기록-찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT outs.animal_id, outs.name
2 | from animal_outs outs
3 | left join animal_ins ins
4 | on ins.animal_id = outs.animal_id
5 | where ins.animal_id is null
6 | order by outs.animal_id;
--------------------------------------------------------------------------------
/sql/wonji/join/오랜기간-보호한-동물(1).sql:
--------------------------------------------------------------------------------
1 | SELECT ins.name, ins.datetime
2 | from animal_ins ins
3 | left join animal_outs outs
4 | on ins.animal_id = outs.animal_id
5 | where outs.animal_id is null
6 | order by ins.datetime limit 3;
--------------------------------------------------------------------------------
/sql/wonji/join/있었는데요-없었습니다.sql:
--------------------------------------------------------------------------------
1 | SELECT ins.animal_id, ins.name
2 | from animal_ins ins
3 | inner join animal_outs outs
4 | on ins.animal_id = outs.animal_id
5 | where ins.datetime > outs.datetime
6 | order by ins.datetime;
--------------------------------------------------------------------------------
/sql/wonji/select/동물의아이디와이름.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id, name from animal_ins order by animal_id;
--------------------------------------------------------------------------------
/sql/wonji/select/모든레코드조회하기.sql:
--------------------------------------------------------------------------------
1 | SELECT * from animal_ins order by animal_id;
--------------------------------------------------------------------------------
/sql/wonji/select/상위n개레코드.sql:
--------------------------------------------------------------------------------
1 | SELECT name from animal_ins order by datetime limit 1;
--------------------------------------------------------------------------------
/sql/wonji/select/아픈동물찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id, name from animal_ins where intake_condition = "sick" order by animal_id;
--------------------------------------------------------------------------------
/sql/wonji/select/어린동물찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id, name from animal_ins where intake_condition != "aged" order by animal_id;
--------------------------------------------------------------------------------
/sql/wonji/select/여러기준으로정렬하기.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id, name, datetime from animal_ins order by name, datetime desc;
--------------------------------------------------------------------------------
/sql/wonji/select/역순정렬하기.sql:
--------------------------------------------------------------------------------
1 | SELECT name, datetime from animal_ins order by animal_id desc;
--------------------------------------------------------------------------------
/sql/wonji/string-data/datetime에서-date로-형-변환.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id, name, date_format(datetime, "%Y-%m-%d") as 날짜
2 | from animal_ins
3 | order by animal_id;
--------------------------------------------------------------------------------
/sql/wonji/string-data/루시와-엘라-찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id, name, sex_upon_intake
2 | from animal_ins
3 | /*
4 | where name = "Lucy" or name = "Ella" or name = "Pickle" or name = "Rogan" or name = "Sabrina" or name = "Mitty";
5 | */
6 | where name in ("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty")
7 | order by animal_id;
--------------------------------------------------------------------------------
/sql/wonji/string-data/오랜기간-보호한-동물(2).sql:
--------------------------------------------------------------------------------
1 | SELECT outs.animal_id, outs.name
2 | from animal_outs outs
3 | left join animal_ins ins
4 | on ins.animal_id = outs.animal_id
5 | order by outs.datetime - ins.datetime desc
6 | limit 2;
--------------------------------------------------------------------------------
/sql/wonji/string-data/이름에-el이-들어가는-동물-찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id, name
2 | from animal_ins
3 | where name like "%el%" and animal_type = "dog"
4 | order by name;
--------------------------------------------------------------------------------
/sql/wonji/string-data/중성화-여부-파악하기.sql:
--------------------------------------------------------------------------------
1 | SELECT animal_id, name,
2 | case when sex_upon_intake like "%neutered%" or sex_upon_intake like "%spayed%" then "O" else "X" end
3 | as 중성화
4 | from animal_ins;
--------------------------------------------------------------------------------
/sql/wonji/sum-max-min/동물-수-구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT count(*) from animal_ins;
--------------------------------------------------------------------------------
/sql/wonji/sum-max-min/중복-제거하기.sql:
--------------------------------------------------------------------------------
1 | SELECT count(distinct name) as count
2 | from animal_ins
3 | where name is not null;
--------------------------------------------------------------------------------
/sql/wonji/sum-max-min/최대값-구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT max(datetime) as 시간 from animal_ins;
--------------------------------------------------------------------------------
/sql/wonji/sum-max-min/최솟값-구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT min(datetime) as 시간 from animal_ins ;
--------------------------------------------------------------------------------
/sql/woorim/group-by/고양이와-개는-몇마리있을까.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS count FROM ANIMAL_INS
2 | GROUP BY ANIMAL_TYPE
3 | ORDER BY(
4 | CASE ANIMAL_TYPE
5 | WHEN 'Cat' THEN 1
6 | WHEN 'Dog' THEN 2
7 | END
8 | );
9 |
10 |
--------------------------------------------------------------------------------
/sql/woorim/group-by/동명-동물-수-찾기.js:
--------------------------------------------------------------------------------
1 | SELECT NAME, COUNT(NAME) FROM ANIMAL_INS
2 | GROUP BY NAME
3 | HAVING COUNT(NAME) >= 2
4 | ORDER BY NAME;
5 |
--------------------------------------------------------------------------------
/sql/woorim/group-by/입양-시각-구하기(2).sql:
--------------------------------------------------------------------------------
1 | SET @hour := -1;
2 | SELECT
3 | (@hour := @hour + 1) AS HOUR,
4 | (SELECT COUNT(DATETIME) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS COUNT
5 | FROM ANIMAL_OUTS
6 | WHERE @hour < 23;
7 |
--------------------------------------------------------------------------------
/sql/woorim/group-by/입양-시각-구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME)
2 | FROM ANIMAL_OUTS
3 | WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
4 | GROUP BY HOUR(DATETIME)
5 | ORDER BY HOUR(DATETIME);
6 |
7 |
--------------------------------------------------------------------------------
/sql/woorim/is-null/NULL-처리하기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_TYPE, IFNULL(NAME, "No name"), SEX_UPON_INTAKE
2 | FROM ANIMAL_INS
3 | ORDER BY ANIMAL_ID ASC;
4 |
--------------------------------------------------------------------------------
/sql/woorim/is-null/이름이-없는-아이디.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID FROM ANIMAL_INS
2 | WHERE NAME is NULL;
3 |
--------------------------------------------------------------------------------
/sql/woorim/is-null/이름이-있는-동물의-아이디.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID
2 | FROM ANIMAL_INS
3 | WHERE NAME is not NULL
4 | ORDER BY ANIMAL_ID ASC;
5 |
--------------------------------------------------------------------------------
/sql/woorim/join/보호소에서-중성화한-동물.sql:
--------------------------------------------------------------------------------
1 | SELECT i.ANIMAL_ID, i.ANIMAL_TYPE, i.NAME
2 | FROM ANIMAL_INS AS i
3 | JOIN ANIMAL_OUTS AS o
4 | ON i.ANIMAL_ID = o.ANIMAL_ID
5 | WHERE i.SEX_UPON_INTAKE != o.SEX_UPON_OUTCOME;
6 | # WHERE i.SEX_UPON_INTAKE regexp "^Intact" AND o.SEX_UPON_OUTCOME not regexp "^Intact"
7 |
--------------------------------------------------------------------------------
/sql/woorim/join/없어진-기록-찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT o.ANIMAL_ID AS ANIMAL_ID, O.NAME AS NAME
2 | FROM ANIMAL_OUTS as o
3 | LEFT JOIN ANIMAL_INS AS i
4 | ON i.ANIMAL_ID = o.ANIMAL_ID
5 | WHERE i.ANIMAL_ID is NULL;
6 |
--------------------------------------------------------------------------------
/sql/woorim/join/오랜-기간-보호한-동물.sql:
--------------------------------------------------------------------------------
1 | SELECT i.NAME AS NAME, i.DATETIME AS DATETIME
2 | FROM ANIMAL_INS AS i
3 | LEFT JOIN ANIMAL_OUTS AS o
4 | ON i.ANIMAL_ID = o.ANIMAL_ID
5 | WHERE o.ANIMAL_ID is NULL
6 | ORDER BY i.DATETIME
7 | LIMIT 3;
8 |
--------------------------------------------------------------------------------
/sql/woorim/join/있었는데요-없었습니다.sql:
--------------------------------------------------------------------------------
1 | SELECT i.ANIMAL_ID, i.NAME
2 | FROM ANIMAL_INS AS i
3 | JOIN ANIMAL_OUTS AS o
4 | ON i.ANIMAL_ID = o.ANIMAL_ID
5 | WHERE i.DATETIME > o.DATETIME
6 | ORDER BY i.DATETIME;
7 |
--------------------------------------------------------------------------------
/sql/woorim/select/동물의-아이디와-이름.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
2 | ORDER BY ANIMAL_ID;
3 |
--------------------------------------------------------------------------------
/sql/woorim/select/모든-레코드-조회하기.sql:
--------------------------------------------------------------------------------
1 | SELECT * FROM ANIMAL_INS;
2 |
--------------------------------------------------------------------------------
/sql/woorim/select/상위-n개-레코드.sql:
--------------------------------------------------------------------------------
1 | SELECT NAME FROM ANIMAL_INS
2 | ORDER BY DATETIME
3 | LIMIT 1;
4 |
--------------------------------------------------------------------------------
/sql/woorim/select/아픈-동물-찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
2 | WHERE INTAKE_CONDITION = "Sick"
3 | ORDER BY ANIMAL_ID;
4 |
--------------------------------------------------------------------------------
/sql/woorim/select/어린-동물-찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
2 | WHERE INTAKE_CONDITION != "Aged"
3 | ORDER BY ANIMAL_ID;
4 |
--------------------------------------------------------------------------------
/sql/woorim/select/여러-기준으로-정렬하기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS
2 | ORDER BY NAME ASC, DATETIME DESC;
3 |
--------------------------------------------------------------------------------
/sql/woorim/select/역순-정렬하기.sql:
--------------------------------------------------------------------------------
1 | SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC;
2 |
--------------------------------------------------------------------------------
/sql/woorim/string-date/DATETIME에서-DATE로-형변환.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, "%Y-%m-%d") AS 날짜
2 | FROM ANIMAL_INS
3 | ORDER BY ANIMAL_ID;
4 |
--------------------------------------------------------------------------------
/sql/woorim/string-date/루시와-엘라-찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
2 | FROM ANIMAL_INS
3 | WHERE NAME regexp "^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$"
4 | ORDER BY ANIMAL_ID;
5 |
--------------------------------------------------------------------------------
/sql/woorim/string-date/오랜-기간-보호한-동물(2).sql:
--------------------------------------------------------------------------------
1 | SELECT i.ANIMAL_ID, i.NAME
2 | FROM ANIMAL_INS AS i
3 | JOIN ANIMAL_OUTS AS o
4 | ON i.ANIMAL_ID = o.ANIMAL_ID
5 | ORDER BY (o.DATETIME - i.DATETIME) DESC
6 | LIMIT 2;
7 |
--------------------------------------------------------------------------------
/sql/woorim/string-date/이름에-el이-들어가는-이름찾기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME
2 | FROM ANIMAL_INS
3 | WHERE NAME regexp "(el)" AND ANIMAL_TYPE = "Dog"
4 | ORDER BY NAME;
5 |
--------------------------------------------------------------------------------
/sql/woorim/string-date/중성화-여부-파악하기.sql:
--------------------------------------------------------------------------------
1 | SELECT ANIMAL_ID, NAME,
2 | CASE
3 | WHEN SEX_UPON_INTAKE regexp "^(Neutered|Spayed)"
4 | THEN "O"
5 | ELSE 'X' END AS "중성화"
6 | FROM ANIMAL_INS
7 | ORDER BY ANIMAL_ID;
8 |
--------------------------------------------------------------------------------
/sql/woorim/sum-max-min/동물-수-구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT COUNT(ANIMAL_ID) AS count FROM ANIMAL_INS;
2 |
--------------------------------------------------------------------------------
/sql/woorim/sum-max-min/중복-제거하기.sql:
--------------------------------------------------------------------------------
1 | SELECT COUNT(DISTINCT NAME) AS count FROM ANIMAL_INS;
2 |
--------------------------------------------------------------------------------
/sql/woorim/sum-max-min/최댓값-구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT MAX(DATETIME) AS 시간 FROM ANIMAL_INS;
2 |
--------------------------------------------------------------------------------
/sql/woorim/sum-max-min/최솟값-구하기.sql:
--------------------------------------------------------------------------------
1 | SELECT MIN(DATETIME) AS 시간 FROM ANIMAL_INS;
2 |
--------------------------------------------------------------------------------
/task/baseball-game/jaeseong/CSS.css:
--------------------------------------------------------------------------------
1 | body {
2 | text-align: center;
3 | font-family: cursive;
4 | background-color: cornsilk;
5 | }
6 |
7 | #app {
8 | text-align: center;
9 | }
10 | #app h1 {
11 | animation-duration: 3s;
12 | animation-name: slidein;
13 | background-color: blanchedalmond;
14 | }
15 | #app p {
16 | background-color: crimson;
17 | }
18 |
19 | @keyframes slidein {
20 | from {
21 | margin-left: 100%;
22 | width: 300;
23 | }
24 | to {
25 | margin-left: 0%;
26 | width: 100%;
27 | }
28 | }
29 |
30 | #app button {
31 | background-color: rgb(92, 71, 34);
32 | border: none;
33 | color: white;
34 | padding: 5px 10px;
35 | text-decoration: none;
36 | display: inline-block;
37 | font-size: 10px;
38 | cursor: pointer;
39 | }
40 | #app button:hover {
41 | background-color: rgb(236, 214, 176);
42 | }
43 |
--------------------------------------------------------------------------------
/task/baseball-game/jaeseong/README.md:
--------------------------------------------------------------------------------
1 | +document.querySelector를 이용해 html에 있는 값들 불러오기
2 | +user-input, submit, result
3 | +컴퓨터가 출력할 랜덤숫자 만들기(comNum)
4 | +가져온 user-input값 유효성 확인
5 | +길이 3
6 | +중복값 확인
7 | +0~9까지 숫자값이 아닌 다른값이 들어가는지 확인
8 | +comNum과 userNum 비교하여 스트라이크와 볼 카운트
9 | +결과물 출력하고 게임종료시 재시작 버튼 활성화
10 | +객체화하여 파일별로 만들기
11 | +document.querySelector를 DOM.js파일로 만들기 O
12 | +클래스로 출력할 수 있도록 만들기
13 | +BaseBallGame클래스를 BaseBallGamejs로 분리
14 | +userNum
15 | +Random
16 | +Error
17 | +간단한 CSS작업
18 |
--------------------------------------------------------------------------------
/task/baseball-game/jaeseong/classes/DOM.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | export const userInput = document.querySelector("#user-input");
3 | export const btnClick = document.querySelector("#submit");
4 | export const result = document.querySelector('#result');
5 |
--------------------------------------------------------------------------------
/task/baseball-game/jaeseong/classes/Random.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const MIN = 1;
4 | const MAX = 9;
5 | export default class Random {
6 | static question() {
7 | let count = 3;
8 | let numbers = "";
9 | while (count > 0) {
10 | let number = parseInt(Math.random() * (MAX - MIN) + MIN);
11 |
12 | if (!numbers.includes(number)) {
13 | numbers += number;
14 | count--;
15 | }
16 | }
17 | return numbers;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/task/baseball-game/jaeseong/classes/UserNum.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | import { userInput } from "./DOM.js";
3 |
4 | export default class User {
5 | static inputValue() {
6 | let user = userInput.value;
7 | return user;
8 | }
9 | }
10 |
11 |
--------------------------------------------------------------------------------
/task/baseball-game/jaeseong/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 숫자 야구 게임
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
⚾ 숫자 야구 게임⚾
17 |
18 | 1~9까지의 수 를 중복없이 3개 를
19 | 작성해주세요.
20 | 올바른 예) 139
21 | 틀린 예) 122
22 |
23 |
아래 입력창에 입력해주세요
24 |
25 |
제출
26 |
27 |
📄 결과
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/task/baseball-game/jaeseong/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | import Random from "./classes/Random.js";
4 | import { btnClick } from "./classes/DOM.js";
5 | import Error from "./classes/Error.js";
6 | import User from "./classes/UserNum.js";
7 |
8 | const comNum = Random.question();
9 |
10 | function run() {
11 | console.log(comNum);
12 | btnClick.addEventListener("click", ()=> {
13 | let userNum = User.inputValue();
14 | Error.validationAndPlay(comNum, userNum);
15 | });
16 | }
17 |
18 | run();
19 |
--------------------------------------------------------------------------------
/task/baseball-game/jiwon/README.md:
--------------------------------------------------------------------------------
1 | #🎨기능 구현
2 |
3 | -DOM으로 html의 값들 전달
4 | - 컴퓨터 랜덤값 받기
5 | -Math.random()은 계속 바뀌어야되기때문에 함수 못뺌
6 | -0~9니까 랜덤함수에 곱하기 9 + 1
7 | - text를 가져오는 DOM
8 | - 가져온 text에 입력된 값 가져와서 object에 넣기
9 | - 비교 연산자로 만들기
10 | - class안에 constructor로 class안의 변수 지정
11 | -밖에서 쓸때는 생성자.변수
12 | - 결과
13 | - js에서 결과나오게 createElement해주기
14 | -createElement : 요소 만들기
15 | -createTextNode : 요소 안의 값
16 | -appendChild: 안에 넣으려는 값 요소 안에 자식으로 넣어주기
17 | - 잘못 입력한 경우 alert 뜨게 하기
18 | - 맞추면 div태그와 게임 재시작 버튼 나오게 하기
19 | - 재시작 버튼 기능 구현하기(reset no) reload yes!
20 | - 모듈 이용해서 js를 html에 넣기
21 |
22 | -live-server로 실시간 확인
23 |
--------------------------------------------------------------------------------
/task/baseball-game/jiwon/origin/classes/DOM.js:
--------------------------------------------------------------------------------
1 | export const inputTxt = document.querySelector('#user-input');
2 | export const inputBtn = document.querySelector('#submit');
3 | export const result = document.querySelector('#result');
--------------------------------------------------------------------------------
/task/baseball-game/jiwon/origin/classes/error/ErrorMessage.js:
--------------------------------------------------------------------------------
1 | import { inputTxt, result } from "../DOM.js";
2 |
3 | export default class ErrorMessage {
4 |
5 | static notNumber() {
6 | alert("숫자가 아닙니다.");
7 | inputTxt.value = "";
8 | result.innerHTML = " ";
9 | }
10 |
11 | static overThreeNumber() {
12 | alert("세자리 수를 입력해주세요");
13 | inputTxt.value = "";
14 | result.innerHTML = " ";
15 | }
16 |
17 | static overlapNumber() {
18 | alert("숫자가 중복되었습니다.");
19 | inputTxt.value = "";
20 | result.innerHTML = " ";
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/task/baseball-game/jiwon/origin/classes/error/ErrorValidator.js:
--------------------------------------------------------------------------------
1 | export default class ErrorValidator {
2 |
3 | static isThreeNumber(inputValue) {
4 | if (inputValue.length === 3) {
5 | return true;
6 | }
7 | return false;
8 | }
9 |
10 | static isoverlapNumber(inputValue) {
11 | let deduplication = new Set(inputValue);
12 | if (inputValue.split("").length !== deduplication.size) {
13 | return true;
14 | }
15 | return false;
16 | }
17 |
18 | static isNotNumber(inputValue) {
19 | if (isNaN(inputValue)) {
20 | return true;
21 | }
22 | return false;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/task/baseball-game/jiwon/origin/classes/random/computer.js:
--------------------------------------------------------------------------------
1 | export default class Computer {
2 | static getRandomNumbers() {
3 | const computerNumbers = new Set([]);
4 | while (computerNumbers.size != 3) {
5 | computerNumbers.add(Math.floor(Math.random() * 9 + 1) + "");
6 | }
7 | return Array.from(computerNumbers).join("");
8 | }
9 | }
--------------------------------------------------------------------------------
/task/baseball-game/jiwon/origin/image/황당.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/woorim960/modern-agile-codingtest/053154d2153e530d5e8025071f669e94ebbf8a1a/task/baseball-game/jiwon/origin/image/황당.jpg
--------------------------------------------------------------------------------
/task/baseball-game/jiwon/origin/index.css:
--------------------------------------------------------------------------------
1 | *{
2 | margin: 0;
3 | padding: 0;
4 | box-sizing: border-box;
5 | }
6 |
7 | html, body{
8 | height: 100%;
9 | }
10 | body {
11 | justify-content: center;
12 | text-align: center;
13 | align-items: center;
14 | background-color: aliceblue;
15 |
16 | }
17 |
18 | h1 {
19 | display: inline;
20 | font-size: 60px;
21 | }
22 |
23 | #baseballTxt {
24 | background: url("https://images0.pixlis.com/background-image-angled-lines-and-stripes-seamless-tileable-deep-sky-blue-lavender-pink-22zk6w.png");
25 | -webkit-background-clip: text;
26 | background-clip: text;
27 | -webkit-text-fill-color: transparent;
28 | animation: animate 3s linear infinite;
29 | }
30 |
31 | @keyframes animate {
32 | from {
33 | background-position: 0% 50%;
34 | }
35 | to {
36 | background-position: 100% 50% 0%;
37 | }
38 | }
--------------------------------------------------------------------------------
/task/baseball-game/jiwon/origin/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | 숫자 야구 게임
9 |
10 |
11 |
12 |
⚾
13 |
숫자 야구 게임
14 |
⚾
15 |
16 | 1~9까지의 수 를 중복없이 3개 를
17 | 작성해주세요.
18 | 올바른 예) 139
19 | 틀린 예) 122
20 |
21 |
22 |
확인
23 |
📄 결과
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/task/baseball-game/minjae/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 숫자 야구 게임
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
⚾ 숫자 야구 게임 ⚾
18 |
19 | 1~9까지의 수 를 중복없이 3개 를
20 | 작성해주세요.
21 | 올바른 예) 139
22 | 틀린 예) 122
23 |
24 |
25 |
확인
26 |
📄 결과
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/task/baseball-game/minjae/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | import BaseballGame from './main/BaseballGame.js';
4 |
5 | const baseballgame = new BaseballGame();
6 | baseballgame.gameInit();
7 |
--------------------------------------------------------------------------------
/task/baseball-game/minjae/src/CounterCheck.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | export default class CounterCheck {
4 | static getBallAndStrikeCount = (computerInput, userInput) => {
5 | let ballCount = 0;
6 | let strikeCount = 0;
7 |
8 | for (let i = 0; i < computerInput.length; i++) {
9 | if(computerInput.includes(userInput[i])) {
10 | ballCount++;
11 | }
12 | if (computerInput[i] == userInput[i]) {
13 | ballCount--;
14 | strikeCount++;
15 | }
16 | }
17 | return { ballCount, strikeCount };
18 | }
19 | }
--------------------------------------------------------------------------------
/task/baseball-game/minjae/src/Random.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const NUMBER_SIZE = 3;
4 |
5 | export default class RandomNumbers {
6 | static getRandomNumbers = () => {
7 | const randomNumbers = [];
8 |
9 | let computerInputNumbers = '';
10 | while (randomNumbers.length < NUMBER_SIZE) {
11 | const candidate = Math.floor((Math.random() * 9) + 1);
12 |
13 | if (!randomNumbers.includes(candidate)) {
14 | randomNumbers.push(candidate);
15 | }
16 | }
17 | computerInputNumbers = randomNumbers.join('');
18 |
19 | return computerInputNumbers;
20 | }
21 | }
--------------------------------------------------------------------------------
/task/baseball-game/minjae/src/User.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | import { userInput } from '../utils/DOM.js';
4 |
5 | export default class User {
6 | static getUserInput () {
7 | return userInput.value;
8 | }
9 | }
--------------------------------------------------------------------------------
/task/baseball-game/minjae/src/Validator.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const NUMBER_SIZE = 3;
4 |
5 | export default class Validator {
6 | static numberValidator = userInput => {
7 | const userInputNumbersArray = userInput.split('');
8 | const setUserInput = new Set(userInput);
9 |
10 | userInputNumbersArray.some(value => {
11 | if (isNaN(parseInt(value))) {
12 | alert( "숫자만 입력해주세요.");
13 | }
14 | return false;
15 | });
16 |
17 | if (userInput.length !== NUMBER_SIZE) {
18 | alert("숫자 길이가 다릅니다.");
19 | return false;
20 | }
21 |
22 | if (setUserInput.size !== NUMBER_SIZE) {
23 | alert("숫자가 중복됩니다.");
24 | return false;
25 | }
26 | return true;
27 | }
28 | }
--------------------------------------------------------------------------------
/task/baseball-game/minjae/utils/DOM.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | export const appSection = document.querySelector('#app');
4 | export const userInput = document.querySelector('#user-input');
5 | export const submitBtn = document.querySelector('#submit');
6 | export const resultSection = document.querySelector('#result');
7 | export const restartForm = document.querySelector('.restart-section');
--------------------------------------------------------------------------------
/task/baseball-game/origin/classes/BaseballGame.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | export default class BaseballGame {
4 | play(computerInputNumbers, userInputNumbers) {
5 | return "결과 값 String";
6 | }
7 | }
8 |
9 | new BaseballGame();
10 |
--------------------------------------------------------------------------------
/task/baseball-game/origin/index.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/woorim960/modern-agile-codingtest/053154d2153e530d5e8025071f669e94ebbf8a1a/task/baseball-game/origin/index.html
--------------------------------------------------------------------------------
/task/baseball-game/origin/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | import BaseballGame from "./classes/BaseballGame.js"; // export defult
4 |
5 | // 기능 구현
6 |
--------------------------------------------------------------------------------
/task/baseball-game/sangjun/README.md:
--------------------------------------------------------------------------------
1 | *.컴퓨터가 중복되지않는 1~9의 랜덤숫자 생성
2 | *DOM 사용
3 | *input값 받아서 유효성검사
4 | -3자리 숫자가 맞는지
5 | -중복된숫자
6 | -숫자외에 다른입력
7 | *스트라이크,볼,낫싱 출력
8 | *정답시 재시작 기능 생성
9 | *export, import 문을 사용하여 파일분리
10 | *모듈화로 인한 live-server사용
11 |
12 |
13 | **개인참고링크
14 | *[live-server] https://recoveryman.tistory.com/359
15 |
16 |
--------------------------------------------------------------------------------
/task/baseball-game/sangjun/classes/BaseballGame.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | import { resultSpace } from "../classes/DOM.js";
4 | import Output from "./Output.js";
5 |
6 | export default class BaseballGame {
7 | play(computerNumber, userNumbers) {
8 | this.countStrikeBall(computerNumber, userNumbers);
9 | }
10 |
11 | countStrikeBall(computerNumber, userNumbers) {
12 | let strikeCount = 0;
13 | let ballCount = 0;
14 |
15 | for (let i = 0; i < 3; i++) {
16 | if (userNumbers[i] === computerNumber[i]) {
17 | strikeCount++;
18 | } else if (computerNumber.includes(userNumbers[i])) {
19 | ballCount++;
20 | }
21 | }
22 | Output.readout(strikeCount, ballCount);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/task/baseball-game/sangjun/classes/DOM.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | export const inputTxt = document.querySelector("#user-input");
4 | export const inputBtn = document.querySelector("#submit");
5 | export const resultSpace = document.querySelector("#result");
--------------------------------------------------------------------------------
/task/baseball-game/sangjun/classes/Random.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | export default class Random {
4 | static number() {
5 | let numbers = "";
6 | let count = 3;
7 | while (count > 0) {
8 | const number = Math.floor(Math.random() * (9 - 1) + 1);
9 | if (!numbers.includes(number)) {
10 | numbers += number;
11 | count--;
12 | }
13 | }
14 | return numbers;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/task/baseball-game/sangjun/classes/Validator.js:
--------------------------------------------------------------------------------
1 | import { resultSpace, inputTxt } from "../classes/DOM.js";
2 | import Output from "./Output.js";
3 |
4 | export default class Validator {
5 |
6 | static isThreeNumber(userNumbers) {
7 | if (userNumbers.length === 3) {
8 | return true;
9 | }
10 | return false;
11 | }
12 |
13 | static isDuplicate(userNumbers) {
14 | const deletedDuplicate = new Set(userNumbers);
15 | if (userNumbers.length !== deletedDuplicate.size) {
16 | return true;
17 | }
18 | return false;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/task/baseball-game/sangjun/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #81BEF7;
3 | }
4 | #title {
5 | display: flex;
6 | justify-content: center;
7 | align-items: center;
8 | }
9 |
10 | .titleexplantion {
11 | display: flex;
12 | justify-content: center;
13 | align-items: center;
14 | }
15 |
16 | .submitbtn {
17 | display: flex;
18 | justify-content: center;
19 | align-items: center;
20 | }
21 |
22 | #result {
23 | display: flex;
24 | justify-content: center;
25 | align-items: center;
26 | }
27 |
28 |
--------------------------------------------------------------------------------
/task/baseball-game/sangjun/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 숫자 야구 게임
8 |
9 |
10 |
11 |
⚾ 숫자 야구 게임
12 |
13 |
14 | 1~9까지의 수 를 중복없이 3개 를
15 | 작성해주세요.
16 | 올바른 예) 139
17 | 틀린 예) 122
18 |
19 |
20 | 확인
21 |
22 |
23 |
📄 결과
24 |
25 |
26 |
--------------------------------------------------------------------------------
/task/baseball-game/soongu/README.md:
--------------------------------------------------------------------------------
1 | #미션 - 숫자 야구 게임
2 | 1. 1 ~ 9 까지의 3자리 수만 입력받는다.
3 | 2. 컴퓨터에게 랜덤한 3자리 숫자를 부여한다.
4 | 3. 사용자는 3자리 숫자를 입력한다.
5 | 4. 사용자가 컴퓨터와 일치한 숫자를 입력할 때 까지 반복해서 비교입력한다.
6 | 5. reset 버튼을 만든다.
7 | 6. reset 버튼은 게임을 다시 시작할 수 있다.
8 | 7. 유효조건 검사를 한다.
9 |
--------------------------------------------------------------------------------
/task/baseball-game/soongu/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 숫자 야구 게임
11 |
12 |
13 |
14 |
⚾ 숫자 야구 게임
15 |
16 | 1~9까지의 수 를 중복없이 3개 를
17 | 작성해주세요.
18 | 올바른 예) 139
19 | 틀린 예) 122
20 |
21 |
22 |
확인
23 |
📄 결과
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/task/baseball-game/soongu/inputNumber/ComputerInputNumbers.js:
--------------------------------------------------------------------------------
1 | `use strict`;
2 | import { NUMBER_LENGTH } from "../util/NumberLength.js";
3 |
4 | export default class ComputerInputNumbers {
5 | random() {
6 | const computerInputNumbers = new Set();
7 |
8 | while (computerInputNumbers.size != NUMBER_LENGTH) {
9 | computerInputNumbers.add(Math.floor(Math.random() * (10 - 1) + 1) + "");
10 | }
11 | return Array.from(computerInputNumbers).join("");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/task/baseball-game/soongu/inputNumber/UserInputNumber.js:
--------------------------------------------------------------------------------
1 | `use strict`;
2 | import { inputTxt } from "../util/DOM.js";
3 |
4 | export default class UserInputNumbers {
5 | getInputNumber() {
6 | return inputTxt.value;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/task/baseball-game/soongu/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: purple;
3 | text-align: center;
4 | }
5 |
6 | #result {
7 | font-size: x-large;
8 | font-weight: bold;
9 | }
10 |
11 | #user-input {
12 | background-color: #4CAF50;
13 | padding: 15px 32px;
14 | font-size: 30px;
15 | border: none;
16 | text-align: center;
17 | text-decoration: none;
18 | display: inline-block;
19 | }
20 |
21 | #submit {
22 | background-color: #4CAF50; /* Green */
23 | border: none;
24 | color: white;
25 | padding: 15px 32px;
26 | text-align: center;
27 | text-decoration: none;
28 | display: inline-block;
29 | font-size: 15px;
30 | }
31 |
--------------------------------------------------------------------------------
/task/baseball-game/soongu/util/DOM.js:
--------------------------------------------------------------------------------
1 | export const inputTxt = document.querySelector("#user-input");
2 | export const btnSubmit = document.querySelector("#submit");
3 | export const result = document.querySelector("#result");
--------------------------------------------------------------------------------
/task/baseball-game/soongu/util/NumberLength.js:
--------------------------------------------------------------------------------
1 | export const NUMBER_LENGTH = 3;
2 |
--------------------------------------------------------------------------------
/task/baseball-game/soongu/util/Restart.js:
--------------------------------------------------------------------------------
1 | export default class Restart {
2 | reset() {
3 | const button = document.createElement("button");
4 | button.innerText = "다시 시작하시겠습니까?";
5 | button.addEventListener("click", this.run);
6 | document.body.appendChild(button);
7 | }
8 |
9 | run() {
10 | window.location.reload();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/task/baseball-game/soongu/util/Validator.js:
--------------------------------------------------------------------------------
1 | import { NUMBER_LENGTH } from "./NumberLength.js";
2 |
3 | export default class Validator {
4 | static isNumber(value) {
5 | return !isNaN(value);
6 | }
7 |
8 | static isInputLength(value) {
9 | return value.length === NUMBER_LENGTH;
10 | }
11 | }
--------------------------------------------------------------------------------
/task/baseball-game/wonji/README.md:
--------------------------------------------------------------------------------
1 | # ⚾ 미션 - 숫자 야구 게임
2 |
3 | ## 🎯 기능
4 |
5 |
6 |
7 | - 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.
8 | - 같은 수가 같은 자리에 있으면 `스트라이크`, 다른 자리에 있으면 `볼`, 같은 수가 전혀 없으면 `낫싱`이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
9 | - 예) 상대방(컴퓨터)의 수가 425일 때
10 | - 123을 제시한 경우 : 1스트라이크
11 | - 456을 제시한 경우 : 1볼 1스트라이크
12 | - 789를 제시한 경우 : 낫싱
13 | - 위 숫자 야구게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
14 | - 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
15 | - 게임을 종료한 후 게임을 다시 시작할 수 있다.
16 | - 게임을 종료한 후 id가 `game-restart-button`인 버튼을 클릭함으로써 게임을 다시 시작할 수 있다.
17 | - `예) 재시작 `
18 |
19 |
--------------------------------------------------------------------------------
/task/baseball-game/wonji/class/Check.js:
--------------------------------------------------------------------------------
1 | export default class Check {
2 | static error(inputValue) {
3 | let nonOverlap = new Set(inputValue);
4 | if (inputValue.split("").length !== 3) {
5 | return true;
6 | }
7 | if (isNaN(parseInt(inputValue))) {
8 | return true;
9 | }
10 | if (inputValue.split("").length !== nonOverlap.size) {
11 | return true;
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/task/baseball-game/wonji/class/Computer.js:
--------------------------------------------------------------------------------
1 | export default class Computer {
2 | static random() {
3 | const computerPick = [];
4 | computerPick[0] = Math.floor(Math.random() * 9 + 1) + "";
5 | do {
6 | computerPick[1] = Math.floor(Math.random() * 9 + 1) + "";
7 | } while (computerPick[0] === computerPick[1]);
8 |
9 | do {
10 | computerPick[2] = Math.floor(Math.random() * 9 + 1) + "";
11 | } while (
12 | computerPick[2] === computerPick[0] ||
13 | computerPick[1] === computerPick[2]
14 | );
15 |
16 | return computerPick;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/task/baseball-game/wonji/class/Output.js:
--------------------------------------------------------------------------------
1 | export default class Output {
2 | static warning(inputValue) {
3 | alert("다시 입력해주세요");
4 | inputValue = "";
5 | }
6 |
7 | static stikeMessage() {
8 | result.innerHTML = `😘 정답 😘
9 | 🥳 게임을 재시작하시려면 밑의 재시작 버튼을 누르세요 🥳`;
10 | }
11 |
12 | static nothingMessage() {
13 | result.innerHTML = "😛 낫싱 😛";
14 | }
15 |
16 | static ballAndStrikeMessage(ball, strike) {
17 | result.innerHTML = `😶 ${ball}볼 ${strike}스트라이크 😶`;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/task/baseball-game/wonji/class/countStrikeBall.js:
--------------------------------------------------------------------------------
1 | export default class countStrikeBall {
2 | static num(inputValue,computerPick){
3 | let strike = 0,
4 | ball = 0;
5 | for (let i = 0; i < computerPick.length; i++) {
6 | if(inputValue[i] === computerPick[i]) {
7 | strike += 1 ;
8 | } else if (inputValue.includes(computerPick[i])) {
9 | ball += 1 ;
10 | }
11 | }
12 | return { strike , ball } ;
13 | }
14 | }
15 |
16 |
17 |
--------------------------------------------------------------------------------
/task/baseball-game/wonji/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | 숫자 야구 게임
9 |
10 |
11 |
12 |
⚾ 숫자 야구 게임 ⚾
13 |
14 | 1~9까지의 수 를 중복없이 3개 를
15 | 작성해주세요.
16 | 올바른 예) 139
17 | 틀린 예) 122
18 |
19 |
20 |
확인
21 |
📄 결과 📄
22 |
23 |
재시작
24 |
25 |
26 |
--------------------------------------------------------------------------------
/task/baseball-game/wonji/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | background: beige;
3 | }
4 |
5 | #app{
6 | text-align: center;
7 | }
8 |
9 | #app{
10 | position:absolute;
11 | top:35%; left:48%;
12 | margin-top:-100px; margin-left:-100px;
13 | }
14 |
15 | button:hover{
16 | color: red;
17 | background: plum;
18 | cursor:pointer
19 | }
20 |
21 | #user-input:focus {
22 | border: 5px solid plum;
23 | color: plum;
24 | }
--------------------------------------------------------------------------------
/task/baseball-game/woorim/classes/User.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | import { userInput } from "./utils/DOM.js";
4 |
5 | export default class User {
6 | getInputNumber() {
7 | return userInput.value;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/task/baseball-game/woorim/classes/utils/DOM.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | export const userInput = document.querySelector("#user-input");
4 | export const submitBtn = document.querySelector("#submit");
5 | export const result = document.querySelector("#result");
6 |
--------------------------------------------------------------------------------
/task/baseball-game/woorim/classes/utils/Random.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const MIN = 1;
4 | const MAX = 9;
5 |
6 | export default class Random {
7 | static shakeNumber(count) {
8 | let numbers = "";
9 | while (count > 0) {
10 | let number = parseInt(Math.random() * (MAX - MIN) + MIN);
11 |
12 | if (!numbers.includes(number)) {
13 | numbers += number;
14 | count--;
15 | }
16 | }
17 | return numbers;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/task/baseball-game/woorim/classes/utils/Validator.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | export default class Validator {
4 | static isNumber(value) {
5 | return !isNaN(value);
6 | }
7 |
8 | static isThreeLength(value) {
9 | return value.length === 3;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/task/baseball-game/woorim/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 숫자 야구 게임
8 |
9 |
10 |
11 |
⚾ 숫자 야구 게임
12 |
13 | 1~9까지의 수 를 중복없이 3개 를
14 | 작성해주세요.
15 | 올바른 예) 139
16 | 틀린 예) 122
17 |
18 |
19 |
확인
20 |
📄 결과
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/task/baseball-game/woorim/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | import BaseballGame from "./classes/BaseballGame.js"; // export defult
4 | import User from "./classes/User.js"; // export defult
5 | import Random from "./classes/utils/Random.js"; // export defult
6 | import { userInput, submitBtn, result } from "./classes/utils/DOM.js"; // export
7 |
8 | const SHAKE_COUNT_NUMBER = 3;
9 | const computerInputNumbers = Random.shakeNumber(SHAKE_COUNT_NUMBER);
10 |
11 | submitBtn.addEventListener("click", run);
12 |
13 | function run() {
14 | const baseballGame = new BaseballGame();
15 | const user = new User();
16 |
17 | const userInputNumbers = user.getInputNumber();
18 | const endingMessage = baseballGame.play(
19 | computerInputNumbers,
20 | userInputNumbers
21 | );
22 |
23 | printEnding(endingMessage);
24 | }
25 |
26 | function printEnding(endingMessage) {
27 | userInput.value = "";
28 | result.innerHTML = endingMessage;
29 | }
30 |
--------------------------------------------------------------------------------
/task/calculator/jaeseong/procedure.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 절차지향식 계산기 프로그램
11 |
12 |
13 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/task/calculator/jiwon/procedure.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 절차지향식 계산기 프로그램
11 |
12 |
13 |
24 |
25 |
--------------------------------------------------------------------------------
/task/calculator/sangjun/procedure.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | 절차지향식 계산기 프로그램
12 |
13 |
14 |
23 |
24 |
--------------------------------------------------------------------------------
/task/calculator/soongu/procedure.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 절차지향식 계산기 프로그램
11 |
12 |
13 | Soongu Calculator
14 |
26 |
27 |
--------------------------------------------------------------------------------
/task/calculator/wonji/procedure.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 절차지향식 계산기 프로그램
11 |
12 |
13 |
24 |
25 |
26 |
--------------------------------------------------------------------------------