├── .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 |
14 |
15 |

* 계산식을 입력해 주십시오(예시 : 1 + 2 | 종료 : exit).

16 | 17 | 18 | 19 | 20 |

21 |
22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /task/calculator/jiwon/procedure.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 절차지향식 계산기 프로그램 11 | 12 | 13 |
14 |
15 |

* 계산식을 입력해 주십시오(예시 : 1 + 2 | 종료 : exit). 사칙연산가능 소수점 첫째자리까지만

16 | 17 | 18 | 19 | 20 | 21 |

22 |
23 |
24 | 25 | -------------------------------------------------------------------------------- /task/calculator/sangjun/procedure.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 절차지향식 계산기 프로그램 12 | 13 | 14 |
15 |
16 |

사칙연산( + - * / )\계산기
exit입력시 종료.(띄어쓰기 금지)

17 | 18 | 19 | 20 |

21 |
22 |
23 | 24 | -------------------------------------------------------------------------------- /task/calculator/soongu/procedure.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 절차지향식 계산기 프로그램 11 | 12 | 13 |

Soongu Calculator

14 |
15 |
16 | 계산식을 입력해 주십시오(예시 : 1 + 2 | 종료 : exit). 17 |

* 소수점 둘째자리 까지 계산됩니다.

18 | 19 | 20 | 21 | 22 | 23 |

24 |
25 |
26 | 27 | -------------------------------------------------------------------------------- /task/calculator/wonji/procedure.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 절차지향식 계산기 프로그램 11 | 12 | 13 |
14 |
15 |

* 계산식을 입력해 주십시오(예시 : 1 + 2 | 종료 : exit).(단,한자릿수 계산만 가능) 16 |

17 | 18 | 19 | 20 | 21 |

22 |
23 |
24 | 25 | 26 | --------------------------------------------------------------------------------