diff --git "a/\353\217\204\354\234\244/week5/[Lv 1] MemoryScore.js" "b/\353\217\204\354\234\244/week5/[Lv 1] MemoryScore.js" new file mode 100644 index 0000000..0d2a3ad --- /dev/null +++ "b/\353\217\204\354\234\244/week5/[Lv 1] MemoryScore.js" @@ -0,0 +1,15 @@ +// Lv 1. 추억 점수 - 연습문제 +function solution(name, yearning, photo) { + let missingScore = []; + let tmpScr = 0; + for (let i = 0; i < photo.length; i++) { + tmpScr = 0; + for (let j = 0; j < photo[i].length; j++) { + if (name.includes(photo[i][j])) { + tmpScr += yearning[name.indexOf(photo[i][j])]; + } + } + missingScore.push(tmpScr); + } + return missingScore; +} diff --git "a/\353\217\204\354\234\244/week5/[Lv 1] SecretCode.js" "b/\353\217\204\354\234\244/week5/[Lv 1] SecretCode.js" new file mode 100644 index 0000000..518e86d --- /dev/null +++ "b/\353\217\204\354\234\244/week5/[Lv 1] SecretCode.js" @@ -0,0 +1,13 @@ +// Lv 1. 둘만의 암호 - 연습문제 +function solution(s, skip, index) { + let answer = ""; + const alphArr = Array(26) + .fill() + .map((v, i) => String.fromCharCode(i + 97)) + .filter((elm) => !skip.includes(elm)); + s.split("").forEach((elm, idx) => { + let newIdx = (alphArr.indexOf(elm) + index) % alphArr.length; + answer += alphArr[newIdx]; + }); + return answer; +} diff --git "a/\353\217\204\354\234\244/week5/[Lv 1] Test.js" "b/\353\217\204\354\234\244/week5/[Lv 1] Test.js" new file mode 100644 index 0000000..d6b0747 --- /dev/null +++ "b/\353\217\204\354\234\244/week5/[Lv 1] Test.js" @@ -0,0 +1,23 @@ +// Lv 1. 모의고사 - 완전탐색 +function solution(answers) { + const sol1 = [1, 2, 3, 4, 5], + sol2 = [2, 1, 2, 3, 2, 4, 2, 5], + sol3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]; + let cnt1 = 0, + cnt2 = 0, + cnt3 = 0; + const answer = []; + + answers.forEach((elm, idx) => { + if (sol1[idx % sol1.length] === elm) cnt1++; + if (sol2[idx % sol2.length] === elm) cnt2++; + if (sol3[idx % sol3.length] === elm) cnt3++; + }); + + const max = Math.max(cnt1, cnt2, cnt3); + if (cnt1 === max) answer.push(1); + if (cnt2 === max) answer.push(2); + if (cnt3 === max) answer.push(3); + + return answer; +} diff --git "a/\353\217\204\354\234\244/week5/[Lv 2] Fibonacci.js" "b/\353\217\204\354\234\244/week5/[Lv 2] Fibonacci.js" new file mode 100644 index 0000000..b86ff59 --- /dev/null +++ "b/\353\217\204\354\234\244/week5/[Lv 2] Fibonacci.js" @@ -0,0 +1,13 @@ +// Lv 2. 피보나치 수 - 연습문제 +function solution(n) { + let add1 = 0, + add2 = 1, + sum = 0, + mod = 0; + for (let i = 2; i <= n; i++) { + sum = (add1 + add2) % 1234567; + add1 = add2; + add2 = sum; + } + return sum; +} diff --git "a/\353\217\204\354\234\244/week5/[Lv 2] NextBigNumber.js" "b/\353\217\204\354\234\244/week5/[Lv 2] NextBigNumber.js" new file mode 100644 index 0000000..fb322cd --- /dev/null +++ "b/\353\217\204\354\234\244/week5/[Lv 2] NextBigNumber.js" @@ -0,0 +1,22 @@ +// Lv 2. 다음 큰 숫자 - 연습문제 +function solution(n) { + const findCnt = (num) => { + return num + .toString(2) + .split("") + .filter((elm) => elm === "1").length; + }; + + let start = n + 1; + let oneCnt = 0; + + while (true) { + oneCnt = findCnt(start); + if (oneCnt === findCnt(n)) { + break; + } + start++; + } + + return start; +} diff --git "a/\353\217\204\354\234\244/week6/[Lv 1] FoodFight.js" "b/\353\217\204\354\234\244/week6/[Lv 1] FoodFight.js" new file mode 100644 index 0000000..55d2004 --- /dev/null +++ "b/\353\217\204\354\234\244/week6/[Lv 1] FoodFight.js" @@ -0,0 +1,8 @@ +// Lv 1. 푸드 파이트 대회 - 연습문제 +function solution(food) { + let perFood = []; + for (let i = 1; i < food.length; i++) { + perFood.push(i.toString().repeat(Math.floor(food[i] / 2))); + } + return perFood.join("") + "0" + perFood.reverse().join(""); +} diff --git "a/\353\217\204\354\234\244/week6/[Lv 1] Noncompletion.js" "b/\353\217\204\354\234\244/week6/[Lv 1] Noncompletion.js" new file mode 100644 index 0000000..494f94b --- /dev/null +++ "b/\353\217\204\354\234\244/week6/[Lv 1] Noncompletion.js" @@ -0,0 +1,30 @@ +// Lv 1. 완주하지 못한 선수 - 해시 +function solution(participant, completion) { + let answer = ""; + + participant.sort(); + completion.sort(); + + for (let i = 0; i < participant.length; i++) { + if (participant[i] !== completion[i]) { + answer = participant[i]; + break; + } + } + return answer; +} + +// 첫번째 풀이 - 효율성 검사 통과 X +// function solution(participant, completion){ +// let idx = -1; +// let answer = ""; +// participant.forEach((elm)=> { +// if(completion.includes(elm)){ +// idx = completion.indexOf(elm); +// completion.splice(idx, 1); +// }else{ +// answer = elm; +// } +// }) +// return answer; +// } diff --git "a/\353\217\204\354\234\244/week6/[Lv 1] Paint.js" "b/\353\217\204\354\234\244/week6/[Lv 1] Paint.js" new file mode 100644 index 0000000..6b550d8 --- /dev/null +++ "b/\353\217\204\354\234\244/week6/[Lv 1] Paint.js" @@ -0,0 +1,12 @@ +// Lv 1. 덧칠하기 - 연습문제 +function solution(n, m, section) { + let paint = 0, + answer = 0; + section.forEach((elm) => { + if (elm > paint) { + paint = elm + (m - 1); + answer++; + } + }); + return answer; +} diff --git "a/\353\217\204\354\234\244/week6/[Lv 1] Ranking .js" "b/\353\217\204\354\234\244/week6/[Lv 1] Ranking .js" new file mode 100644 index 0000000..1313ad2 --- /dev/null +++ "b/\353\217\204\354\234\244/week6/[Lv 1] Ranking .js" @@ -0,0 +1,12 @@ +// Lv 1. 명예의 전당 (1) - 연습문제 +function solution(k, score) { + let rank = [], + answer = []; + + for (let i = 0; i < score.length; i++) { + rank.push(score[i]); + rank = rank.sort((a, b) => b - a).slice(0, k); + answer.push(Math.min(...rank)); + } + return answer; +} diff --git "a/\353\217\204\354\234\244/week6/[Lv 2] Bracket.js" "b/\353\217\204\354\234\244/week6/[Lv 2] Bracket.js" new file mode 100644 index 0000000..5c5f379 --- /dev/null +++ "b/\353\217\204\354\234\244/week6/[Lv 2] Bracket.js" @@ -0,0 +1,25 @@ +// Lv 2. 올바른 괄호 - 스택/큐 +function solution(s) { + const stack = []; + + for (let i = 0; i < s.length; i++) { + stack[stack.length - 1] === "(" && s[i] === ")" + ? stack.pop() + : stack.push(s[i]); + } + + return stack.length === 0 ? true : false; +} + +/* +효율성 검사 통과 풀이 +function solution(s){ + const stack = []; + + for(let i = 0; i < s.length; i++){ + (stack[stack.length-1] === "(" && s[i] === ")") ? stack.pop() : stack.push(s[i]); + + } + + return !stack.length; +} */ diff --git "a/\353\217\204\354\234\244/week6/[Lv 2] PairEliminate.js" "b/\353\217\204\354\234\244/week6/[Lv 2] PairEliminate.js" new file mode 100644 index 0000000..401608e --- /dev/null +++ "b/\353\217\204\354\234\244/week6/[Lv 2] PairEliminate.js" @@ -0,0 +1,13 @@ +// Lv 2. 짝지어 제거하기 - 2017 탑스타운 +function solution(s) { + //stack 사용 + const stack = []; + for (let i = 0; i < s.length; i++) { + if (stack[stack.length - 1] !== s[i]) { + stack.push(s[i]); + } else { + stack.pop(); + } + } + return stack.length === 0 ? 1 : 0; +} diff --git "a/\353\217\204\354\234\244/week7/[Lv 1] BunchOfCared.js" "b/\353\217\204\354\234\244/week7/[Lv 1] BunchOfCared.js" new file mode 100644 index 0000000..d527974 --- /dev/null +++ "b/\353\217\204\354\234\244/week7/[Lv 1] BunchOfCared.js" @@ -0,0 +1,16 @@ +// Lv 1. 카드 뭉치 - 연습문제 +function solution(cards1, cards2, goal) { + let answer = ""; + for (let i = 0; i < goal.length; i++) { + if (cards1[0] === goal[i]) { + cards1.shift(); + } else if (cards2[0] === goal[i]) { + cards2.shift(); + } else { + answer = "No"; + break; + } + answer = "Yes"; + } + return answer; +} diff --git "a/\353\217\204\354\234\244/week7/[Lv 1] Clothes.js" "b/\353\217\204\354\234\244/week7/[Lv 1] Clothes.js" new file mode 100644 index 0000000..2612d38 --- /dev/null +++ "b/\353\217\204\354\234\244/week7/[Lv 1] Clothes.js" @@ -0,0 +1,29 @@ +// Lv 1. 체육복 - 탐욕법(Greedy) +function solution(n, lost, reserve) { + //가져왔는데 도난당한 경우 (reserve와 lost에서 모두 제거) + let newReserve = reserve + .filter((elm) => { + return !lost.includes(elm); + }) + .sort((a, b) => a - b); + + let newLost = lost + .filter((elm) => { + return !reserve.includes(elm); + }) + .sort((a, b) => a - b); + + //answer의 초기값: 총 n명 중 가져오지 않은 사람(가져왔는데 도난당한 사람 제외) + let answer = n - newLost.length; + + newLost.forEach((elm) => { + if (newReserve && newReserve.includes(elm - 1)) { + answer++; + newReserve = newReserve.filter((res) => res !== elm - 1); + } else if (newReserve && newReserve.includes(elm + 1)) { + answer++; + newReserve = newReserve.filter((res) => res !== elm + 1); + } + }); + return answer; +} diff --git "a/\353\217\204\354\234\244/week8/[Lv 1] Babbling(2).js" "b/\353\217\204\354\234\244/week8/[Lv 1] Babbling(2).js" new file mode 100644 index 0000000..1046db0 --- /dev/null +++ "b/\353\217\204\354\234\244/week8/[Lv 1] Babbling(2).js" @@ -0,0 +1,18 @@ +// Lv 1. 옹알이(2) - 연습문제 +function solution(babbling) { + const babblingList = ["aya", "ye", "woo", "ma"]; + let count = 0; + + for (bab of babbling) { + for (word of babblingList) { + if (bab.includes(word.repeat(2))) { + break; + } + bab = bab.split(word).join(" "); + } + if (bab.split(" ").join("").length === 0) { + count++; + } + } + return count; +} diff --git "a/\353\217\204\354\234\244/week8/[Lv 1] NumberPair.js" "b/\353\217\204\354\234\244/week8/[Lv 1] NumberPair.js" new file mode 100644 index 0000000..8db9e4a --- /dev/null +++ "b/\353\217\204\354\234\244/week8/[Lv 1] NumberPair.js" @@ -0,0 +1,27 @@ +// Lv 1. 숫자 짝꿍 - 연습문제 -> 11 ~ 15 시간초과 +function solution(X, Y) { + const XArr = X.toString().split(""); + const YArr = Y.toString().split(""); + const maxLen = Math.max(XArr.length, YArr.length); + const answer = []; + + for (let i = 0; i < maxLen; i++) { + const tmp = XArr[i]; + if (YArr.includes(tmp)) { + answer.push(tmp); + YArr.splice(YArr.indexOf(tmp), 1); + } + } + + const answerSet = new Set(answer); + + if (answer.length === 0) { + return "-1"; + } + if (answerSet.size === 1 && answerSet.has("0")) { + console.log("here"); + return "0"; + } + + return answer.sort((a, b) => b - a).join(""); +} diff --git "a/\353\217\204\354\234\244/week8/[Lv 1] Pokemon.js" "b/\353\217\204\354\234\244/week8/[Lv 1] Pokemon.js" new file mode 100644 index 0000000..9bc7746 --- /dev/null +++ "b/\353\217\204\354\234\244/week8/[Lv 1] Pokemon.js" @@ -0,0 +1,7 @@ +// Lv 1. 포켓몬 - 해시 +function solution(nums) { + const numSets = new Set(nums); + const maxCount = Math.floor(nums.length / 2); + + return numSets.size > maxCount ? maxCount : numSets.size; +} diff --git "a/\353\217\204\354\234\244/week8/[Lv 1] SelectAndAdd.js" "b/\353\217\204\354\234\244/week8/[Lv 1] SelectAndAdd.js" new file mode 100644 index 0000000..73211ce --- /dev/null +++ "b/\353\217\204\354\234\244/week8/[Lv 1] SelectAndAdd.js" @@ -0,0 +1,14 @@ +// Lv 1. 두 개 뽑아서 더하기 +function solution(numbers) { + const answer = []; + for (let i = 0; i < numbers.length; i++) { + for (let j = i + 1; j < numbers.length; j++) { + if (!answer.includes(numbers[i] + numbers[j])) { + answer.push(numbers[i] + numbers[j]); + } else { + continue; + } + } + } + return answer.sort((a, b) => a - b); +} diff --git "a/\353\217\204\354\234\244/week8/[Lv 2] Jump&Teleportation.js" "b/\353\217\204\354\234\244/week8/[Lv 2] Jump&Teleportation.js" new file mode 100644 index 0000000..dd3182a --- /dev/null +++ "b/\353\217\204\354\234\244/week8/[Lv 2] Jump&Teleportation.js" @@ -0,0 +1,14 @@ +// Lv 2. 점프와 순간이동 - Summer/Winter Coding(~2018) +function solution(n) { + let use = 0; + + while (n !== 0) { + if (n % 2 === 0) { + n = n / 2; + } else { + n--; + use++; + } + } + return use; +} diff --git "a/\353\217\204\354\234\244/week8/[Lv 2] RescueBoat.js" "b/\353\217\204\354\234\244/week8/[Lv 2] RescueBoat.js" new file mode 100644 index 0000000..e00c84d --- /dev/null +++ "b/\353\217\204\354\234\244/week8/[Lv 2] RescueBoat.js" @@ -0,0 +1,12 @@ +// Lv 2. 구명보트 - 탐욕법(Greedy) +function solution(people, limit) { + let count = 0; + let j = people.length - 1; + people.sort((a, b) => b - a); + + for (let i = 0; i <= j; i++) { + people[i] + people[j] <= limit && j--; + count++; + } + return count; +} diff --git "a/\353\217\204\354\234\244/week9/[Lv 1] LottoRanking.js" "b/\353\217\204\354\234\244/week9/[Lv 1] LottoRanking.js" new file mode 100644 index 0000000..40a1ba4 --- /dev/null +++ "b/\353\217\204\354\234\244/week9/[Lv 1] LottoRanking.js" @@ -0,0 +1,40 @@ +// Lv 1. 로또의 최고 순위와 최저 순위 - 2021 Dev-Matching: 웹 백엔드 개발자(상반기) +const calculateRank = (count) => { + switch (count) { + case 2: + return 5; + case 3: + return 4; + case 4: + return 3; + case 5: + return 2; + case 6: + return 1; + default: + return 6; + } +}; + +function solution(lottos, win_nums) { + const new_lottos = lottos.filter((elm) => elm !== 0); + const zero_nums = lottos.length - new_lottos.length; + let count = 0; + + new_lottos.forEach((num) => { + if (win_nums.includes(num)) { + win_nums.splice(win_nums.indexOf(num), 1); + count++; + } + }); + + let min = 0, + max = 0; + if (count === 6) { + return [1, 1]; + } else { + min = count; + max = count + zero_nums; + return [calculateRank(max), calculateRank(min)]; + } +} diff --git "a/\353\217\204\354\234\244/week9/[Lv 1] Running.js" "b/\353\217\204\354\234\244/week9/[Lv 1] Running.js" new file mode 100644 index 0000000..6eb760a --- /dev/null +++ "b/\353\217\204\354\234\244/week9/[Lv 1] Running.js" @@ -0,0 +1,20 @@ +// Lv 1. 달리기 경주 - 연습문제 +function solution(players, callings) { + const original_players = {}; + + players.forEach((elm, idx) => { + original_players[elm] = idx; + }); + + for (let i = 0; i < callings.length; i++) { + const pre_ranking = original_players[callings[i]]; // 추월하기 전 몇등인지 + const temp = players[pre_ranking - 1]; // 추월당한 선수의 이름 + + players[pre_ranking - 1] = callings[i]; + original_players[callings[i]] = pre_ranking - 1; + + players[pre_ranking] = temp; + original_players[temp] = pre_ranking; + } + return players; +} diff --git "a/\353\217\204\354\234\244/week9/[Lv 1]. DartGame.js" "b/\353\217\204\354\234\244/week9/[Lv 1]. DartGame.js" new file mode 100644 index 0000000..77836e0 --- /dev/null +++ "b/\353\217\204\354\234\244/week9/[Lv 1]. DartGame.js" @@ -0,0 +1,43 @@ +// Lv 1. [1차]다트게임 - 2018 KAKAO BLIND RECRUITMENT +function solution(dartResult) { + let tmp = 0, + answer = []; + + for (let i = 0; i < dartResult.length; i++) { + //dartResult[i]가 숫자라면 + if (!isNaN(dartResult[i])) { + if (Number(dartResult[i]) === 1 && Number(dartResult[i + 1]) === 0) { + tmp = 10; + i++; + } else { + tmp = dartResult[i]; + } + } else { + switch (dartResult[i]) { + case "S": + answer.push(Math.pow(tmp, 1)); + continue; + case "D": + answer.push(Math.pow(tmp, 2)); + continue; + case "T": + answer.push(Math.pow(tmp, 3)); + continue; + case "*": + answer[answer.length - 1] *= 2; + answer[answer.length - 2] *= 2; + continue; + case "#": + answer[answer.length - 1] *= -1; + continue; + } + } + } + + let score = 0; + answer.forEach((elm) => { + score += Number(elm); + }); + + return score; +} diff --git "a/\353\217\204\354\234\244/week9/[Lv 2] Carpet.js" "b/\353\217\204\354\234\244/week9/[Lv 2] Carpet.js" new file mode 100644 index 0000000..c187da1 --- /dev/null +++ "b/\353\217\204\354\234\244/week9/[Lv 2] Carpet.js" @@ -0,0 +1,20 @@ +// Lv 2. 카펫 - 완전탐색 +function solution(brown, yellow) { + let answer = []; + const TOTAL_SIZE = brown + yellow; + let width, height; + + //yellow 최소 1개 -> 감싸기위해 필요한 brown 3,3 + for (let i = 3; i < TOTAL_SIZE; i++) { + //카펫의 임시 가로, 세로 구하기 + width = TOTAL_SIZE / i; + height = i; + + if (width < height) continue; + + if ((width - 2) * (height - 2) === yellow) { + answer.push(width, height); + } + } + return answer; +} diff --git "a/\353\217\204\354\234\244/week9/[Lv 2] LastLetterGame.js" "b/\353\217\204\354\234\244/week9/[Lv 2] LastLetterGame.js" new file mode 100644 index 0000000..701e986 --- /dev/null +++ "b/\353\217\204\354\234\244/week9/[Lv 2] LastLetterGame.js" @@ -0,0 +1,29 @@ +// Lv 2. 영어 끝말잇기 - Summer/Winter Coding(~2018) +function solution(n, words) { + const password = [words[0]]; + let len = words[0].length; + let last_letter = words[0][len - 1]; + let turn = 1; + + for (let i = 1; i < words.length; i++) { + len = words[i].length; + + // 끝말잇기 규칙에 맞는 단어인지 체크 + if (last_letter !== words[i][0]) { + return [(i % n) + 1, turn]; + } + + // 이미 나온 단어인지 체크 + if (password.includes(words[i])) { + return [(i % n) + 1, turn]; + } + + password.push(words[i]); + last_letter = words[i][len - 1]; + + if ((i % n) + 1 === n) { + turn++; + } + } + return [0, 0]; +} diff --git "a/\353\217\204\354\234\244/week9/[Lv 2] Tournament.js" "b/\353\217\204\354\234\244/week9/[Lv 2] Tournament.js" new file mode 100644 index 0000000..328f380 --- /dev/null +++ "b/\353\217\204\354\234\244/week9/[Lv 2] Tournament.js" @@ -0,0 +1,17 @@ +// Lv 2. 예상 대진표 - 2017 팁스다운 +function solution(n, a, b) { + let round = 0; + + let newA = Math.min(a, b); + let newB = Math.max(a, b); + + //Math.round를 했을 때 최종으로 나오는 값은 1이기 때문 + while (newA !== newB) { + newA = Math.round(newA / 2); + newB = Math.round(newB / 2); + round++; + } + + return round; +} +ㅍ;