diff --git a/tkddbs587/Array/Divisible_number_array.js b/tkddbs587/Array/Divisible_number_array.js new file mode 100644 index 0000000..9d14aee --- /dev/null +++ b/tkddbs587/Array/Divisible_number_array.js @@ -0,0 +1,10 @@ +function solution(arr, divisor) { + let newArr = arr.filter((el) => el % divisor === 0); // 나누어 떨어지는 엘리먼트가 담긴 새 배열 반환 + + // 나누어 떨어지는 엘리먼트 없으면 그냥 [-1] 반환 + if (newArr.length === 0) { + return [-1]; + } + + return newArr.sort((a, b) => a - b); // 오름차순 정렬 +} diff --git a/tkddbs587/Array/Length_of_array_elements.js b/tkddbs587/Array/Length_of_array_elements.js new file mode 100644 index 0000000..f4ec8ad --- /dev/null +++ b/tkddbs587/Array/Length_of_array_elements.js @@ -0,0 +1,3 @@ +function solution(strlist) { + return strlist.map((str) => str.length); +} diff --git a/tkddbs587/Hash/Make_b_from_a.js b/tkddbs587/Hash/Make_b_from_a.js new file mode 100644 index 0000000..fbab280 --- /dev/null +++ b/tkddbs587/Hash/Make_b_from_a.js @@ -0,0 +1,8 @@ +function solution(before, after) { + // 1. 문자열을 배열로 변환 + // 2. 오름차순 정렬 + // 3. 정렬한 배열 문자열로 변환 후 비교 + return before.split("").sort().join("") === after.split("").sort().join("") + ? 1 + : 0; +} diff --git a/tkddbs587/Hash/Morse_code.js b/tkddbs587/Hash/Morse_code.js new file mode 100644 index 0000000..28c67bd --- /dev/null +++ b/tkddbs587/Hash/Morse_code.js @@ -0,0 +1,39 @@ +function solution(letter) { + // 모스 부호 객체 + morse = { + ".-": "a", + "-...": "b", + "-.-.": "c", + "-..": "d", + ".": "e", + "..-.": "f", + "--.": "g", + "....": "h", + "..": "i", + ".---": "j", + "-.-": "k", + ".-..": "l", + "--": "m", + "-.": "n", + "---": "o", + ".--.": "p", + "--.-": "q", + ".-.": "r", + "...": "s", + "-": "t", + "..-": "u", + "...-": "v", + ".--": "w", + "-..-": "x", + "-.--": "y", + "--..": "z", + }; + + // letter의 모스 부호가 공백 기준으로 나눠져있으므로 split를 통해 배열로 변환 + // 변환된 배열을 map을 통해 순회하며 morse 객체의 키와 일치하는 영어 문자열 value로 이루어진 새 배열 반환 + // 영어 배열을 join을 통해 문자열로 변환 + return letter + .split(" ") + .map((el) => morse[el]) + .join(""); +} diff --git a/tkddbs587/Hash/Ranking.js b/tkddbs587/Hash/Ranking.js new file mode 100644 index 0000000..da1a280 --- /dev/null +++ b/tkddbs587/Hash/Ranking.js @@ -0,0 +1,10 @@ +function solution(score) { + // score의 평균 점수 구하기 + let average = score.map((el) => (el[0] + el[1]) / 2); + + // 평균을 내림차순으로 정렬한 배열 선언 slice() 통해 average 배열 얕은 복사(원본 배열은 변경되지 않음) + let sortedAverage = average.slice().sort((a, b) => b - a); + + // average의 요소와 동일한 sortedAverage 배열의 index 값에 1을 더하기 + return average.map((el) => sortedAverage.indexOf(el) + 1); +} diff --git a/tkddbs587/Hash/Set_treatment_order.js b/tkddbs587/Hash/Set_treatment_order.js new file mode 100644 index 0000000..fb4cf18 --- /dev/null +++ b/tkddbs587/Hash/Set_treatment_order.js @@ -0,0 +1,6 @@ +function solution(emergency) { + let sorted = [...emergency].sort((a, b) => b - a); // 배열 내림차순 정렬 + + return emergency.map((v) => sorted.indexOf(v) + 1); + // 기존 배열의 각 요소를 내림차순 정렬된 배열에 매칭되는 요소로 접근하여 index + 1 로 순서대로 순위 매기고 map() 메서드를 통해 순위가 담긴 새 배열 반환 +} diff --git a/tkddbs587/Queue/Card_bundle.js b/tkddbs587/Queue/Card_bundle.js new file mode 100644 index 0000000..d773d3b --- /dev/null +++ b/tkddbs587/Queue/Card_bundle.js @@ -0,0 +1,15 @@ +function solution(cards1, cards2, goal) { + let index1 = 0; // 카드1의 인덱스 + let index2 = 0; // 카드2의 인덱스 + + for (let i = 0; i < goal.length; i++) { + if (cards1[index1] === goal[i]) { + // 카드1의 인덱스 0부터 순서대로 골의 인덱스 i와 같으면 + index1++; // 카드 1의 인덱스 1 증가 + } else if (cards2[index2] === goal[i]) { + // 카드2의 인덱스 0부터 순서대로 골의 인덱스 i와 같으면 + index2++; // 카드 2의 인덱스 1 증가 + } else return "No"; // 순서대로 비교하다가 더 이상 일치하는 인덱스가 없으면 만들 수 없는 문장이므로 No 반환 + } + return "Yes"; // goal의 인덱스만큼 순회를 성공적으로 마치면 문장을 만들 수 있으므로 Yes 반환 +} diff --git a/tkddbs587/Queue/Find_point_position.js b/tkddbs587/Queue/Find_point_position.js new file mode 100644 index 0000000..08506f7 --- /dev/null +++ b/tkddbs587/Queue/Find_point_position.js @@ -0,0 +1,23 @@ +function solution(dot) { + const [x, y] = dot; // x, y 값 + + if (Math.sign(x) === 1) { + // x값이 양수일때 + if (Math.sign(y) === 1) { + // y값도 양수면 + return 1; // 1사분면 + } else { + return 4; // x값은 양수고 y값은 음수 -> 4사분면 + } + } + + if (Math.sign(x) === -1) { + // x값이 음수일때 + if (Math.sign(y) === -1) { + // y값도 음수면 + return 3; // 3사분면 + } else { + return 2; // y값은 양수고 x값은 음수 -> 2사분면 + } + } +} diff --git a/tkddbs587/Queue/Login_success.js b/tkddbs587/Queue/Login_success.js new file mode 100644 index 0000000..bff96c8 --- /dev/null +++ b/tkddbs587/Queue/Login_success.js @@ -0,0 +1,13 @@ +function solution(id_pw, db) { + const [id, pw] = id_pw; // 아이디, 패스워드 분리 + const map = new Map(db); // db를 기반으로 Map 객체 생성 + console.log(map); + + if (map.has(id)) { + // map 객체에 id 가 있을때 + if (map.get(id) === pw) { + // 아이디와 패스워드가 일치하면 + return "login"; // 'login' 반환 + } else return "wrong pw"; // 아이디는 같은데 패스워드만 틀리면 'wrong pw' 반환 + } else return "fail"; // 둘 다 틀리면 'fail' 반환 +} diff --git a/tkddbs587/Queue/Make_burger.js b/tkddbs587/Queue/Make_burger.js new file mode 100644 index 0000000..ef2f085 --- /dev/null +++ b/tkddbs587/Queue/Make_burger.js @@ -0,0 +1,18 @@ +function solution(ingredient) { + let stack = []; // 스택 + let count = 0; // 햄버거 포장 갯수 + for (let i = 0; i < ingredient.length; i++) { + stack.push(ingredient[i]); // ingredient 인덱스 순서대로 스택에 추가 + if (stack.length >= 4) { + // 스택에 재료가 4개 이상 쌓였을때 + const hamburger = stack.slice(-4).join(""); // 스택의 끝에서부터 4개의 요소 문자열로 추출 + + if (hamburger === "1231") { + // 추출한 문자열이 1231 순서와 일치하면 + count++; // 포장 갯수 1 증가 + stack.splice(-4); // 스택에서 포장된 햄버거 제거 + } + } + } + return count; // 총 포장 갯수 반환 +} diff --git a/tkddbs587/Queue/Number_of_ordered_pairs.js b/tkddbs587/Queue/Number_of_ordered_pairs.js new file mode 100644 index 0000000..c70ec58 --- /dev/null +++ b/tkddbs587/Queue/Number_of_ordered_pairs.js @@ -0,0 +1,12 @@ +function solution(n) { + let count = 0; + + for (let i = 1; i <= n; i++) { + if (n % i === 0) { + // n의 약수 구하기 + count++; // 약수 구할때마다 카운트업 + } + } + + return count; // 순서쌍 갯수 반환 +} diff --git a/tkddbs587/Stack/Control_z.js b/tkddbs587/Stack/Control_z.js new file mode 100644 index 0000000..af73a72 --- /dev/null +++ b/tkddbs587/Stack/Control_z.js @@ -0,0 +1,13 @@ +function solution(s) { + let answer = 0; + const arr = s.split(" "); // 공백을 기준으로 문자열을 배열로 변환 + for (let i = 0; i < arr.length; i++) { + if (arr[i] !== "Z") { + // 배열 요소가 'Z' 가 아니면 + answer += Number(arr[i]); // Number 타입으로 변환 후 변수에 더하기 + } else { + answer -= Number(arr[i - 1]); // 'Z' 면 현재 인덱스 하나 전 인덱스의 숫자 빼기 + } + } + return answer; // 최종 숫자 반환 +} diff --git a/tkddbs587/Stack/Crane_claw_machine_game.js b/tkddbs587/Stack/Crane_claw_machine_game.js new file mode 100644 index 0000000..d91164b --- /dev/null +++ b/tkddbs587/Stack/Crane_claw_machine_game.js @@ -0,0 +1,32 @@ +function solution(board, moves) { + // 2차원 배열 board를 각 열마다 스택 생성 5x5일 경우 총 5개의 스택 생성 + let stack = [...Array(board[0].length)].map(() => []); + + for (let i = board.length - 1; i >= 0; i--) { + for (let j = 0; j < board[0].length; j++) { + if (board[i][j] !== 0) { + // 0이 아닐때만 각 스택에 추가 + stack[j].push(board[i][j]); // 스택의 각 열에 맞춰 board의 요소들 추가 + } + } + } + + let removeCount = 0; + let bucket = []; + + for (let m of moves) { + if (stack[m - 1].length > 0) { + // 스택의 열에 인형이 존재하면 + const doll = stack[m - 1].pop(); // 맨 위의 인형 집어서 + // 바구니에 인형이 있고 맨 위의 인형이 지금 넣으려는 인형과 같으면 + if (bucket.length > 0 && bucket[bucket.length - 1] === doll) { + bucket.pop(); // 바구니 맨 위의 인형 제거 + removeCount += 2; // 제거한 갯수 2개 추가 + } else { + bucket.push(doll); // 바구니에 인형이 없거나 맨 위 인형과 같지 않은 인형이면 추가 + } + } + } + + return removeCount; +} diff --git a/tkddbs587/Stack/Dart_game.js b/tkddbs587/Stack/Dart_game.js new file mode 100644 index 0000000..823a4d8 --- /dev/null +++ b/tkddbs587/Stack/Dart_game.js @@ -0,0 +1,35 @@ +function solution(d) { + let arr = d.split(""); + let stack = []; + let score = 0; + + for (let i = 0; i < arr.length; i++) { + if (!isNaN(arr[i])) { + if (arr[i] === "1" && arr[i + 1] === "0") { + // 점수가 10인 경우 + score = 10; // 총 스코어에 10점 추가 + i++; // 0 건너뛰기 + } else score = arr[i]; + } else if (arr[i] === "S") { + stack.push(Math.pow(score, 1)); // Single -> 1제곱 + } else if (arr[i] === "D") { + stack.push(Math.pow(score, 2)); // Double -> 2제곱 + } else if (arr[i] === "T") { + stack.push(Math.pow(score, 3)); // Triple -> 3제곱 + } else if (arr[i] === "#") { + // 아차상일 경우 + stack[stack.length - 1] *= -1; // 해당 점수 빼기 + } else if (arr[i] === "*") { + // 스타상일 경우 + stack[stack.length - 1] *= 2; // 해당 점수 2배 + stack[stack.length - 2] *= 2; // 바로 전 점수도 2배 + } + } + + let result = 0; + for (let i = 0; i < stack.length; i++) { + result += stack[i]; // 총 점수 구하기 + } + + return result; // 총 점수 반환 +} diff --git a/tkddbs587/Stack/I_hate_english.js b/tkddbs587/Stack/I_hate_english.js new file mode 100644 index 0000000..b6dbc36 --- /dev/null +++ b/tkddbs587/Stack/I_hate_english.js @@ -0,0 +1,26 @@ +function solution(numbers) { + let numArr = [ + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + ]; // 0 ~ 9 배열 생성 + let strNum = ""; // 숫자를 문자열로 표현한 numbers를 인덱스 순서대로 담을 변수 + let result = ""; // 숫자 단어에 해당하는 숫자를 담을 변수 + for (let i = 0; i < numbers.length; i++) { + strNum += numbers[i]; // 변수에 numbers 인덱스 순서대로 담기 + + if (numArr.includes(strNum)) { + // 차례대로 담다가 배열에 해당하는 숫자가 있으면 + result += numArr.indexOf(strNum); // 해당 숫자 인덱스를 변수에 추가 + strNum = ""; // numbers에 있는 다음 숫자 단어를 더해주기 위해 초기화 + } + } + return Number(result); // 문자열로 돼있는 숫자 변수를 number 타입으로 변환 후 결과 반환 +} diff --git a/tkddbs587/Stack/String_calculation.js b/tkddbs587/Stack/String_calculation.js new file mode 100644 index 0000000..8eeadcc --- /dev/null +++ b/tkddbs587/Stack/String_calculation.js @@ -0,0 +1,17 @@ +function solution(my_string) { + let arr = my_string.split(" "); // 공백을 기준으로 배열 생성 + console.log(arr); + let result = Number(arr[0]); // 0번 인덱스 숫자로 변환 = 첫번째 숫자 구하고 + for (let i = 1; i < arr.length; i += 2) { + // 홀수 인덱스 접근 = 연산자에 접근 + let operator = arr[i]; // 현재 연산자 + let NextNum = Number(arr[i + 1]); // 연산자 오른쪽 숫자 + if (operator === "+") { + // 연산자가 + 면 더하고 + result += NextNum; + } else { + result -= NextNum; // - 면 빼기 + } + } + return result; // 결과 반환 +} diff --git a/tkddbs587/Stack/String_reversal.js b/tkddbs587/Stack/String_reversal.js new file mode 100644 index 0000000..f188f0d --- /dev/null +++ b/tkddbs587/Stack/String_reversal.js @@ -0,0 +1,8 @@ +function solution(str) { + var answer = ""; + for (let i = str.length - 1; i >= 0; i--) { + // 문자열 변수 str의 마지막 인덱스부터 한글자씩 접근 + answer += str[i]; // 문자열 변수 answer에 추가 + } + return answer; // 뒤집은 문자열 반환 +} diff --git a/tkddbs587/Stack/Valid_parentheses.js b/tkddbs587/Stack/Valid_parentheses.js new file mode 100644 index 0000000..ac985da --- /dev/null +++ b/tkddbs587/Stack/Valid_parentheses.js @@ -0,0 +1,19 @@ +function solution(s) { + let stack = []; // 스택 + let arr = s.split(""); // 괄호 별로 잘라서 배열 생성 + for (let i = 0; i < arr.length; i++) { + if (arr[i] === "(") { + // 열린 괄호일때 + stack.push(arr[i]); // 스택에 열린 괄호 추가 + } else { + // 닫힌 괄호일때 + stack.pop(); // 스택에 쌓아둔 열린 괄호 제거 + } + } + if (stack.length === 0) { + // 스택이 비어있으면 짝이 맞다는 뜻이므로 length가 0 + return true; // 결과 반환 + } else { + return false; + } +}