CodeKata
-
[CodeKata] 프로그래머스 : 3.20(토), 점프와 순간이동 & 영어 끝말잇기Algorithm 2021. 3. 20. 15:15
🥋 Ooooth!! (Level 2) : 점프와 순간이동 이동할 거리 N까지 최대한 순간이동으로 가는 것이 이득이다. 역발상으로, N을 0이 될 때까지 2로 나누고 (이는 모두 순간이동에 해당), 나머지가 1인 경우에만 점프로 이동한다는 개념으로 접근했다. 🧮 풀이 function solution(n) { let ans = 0; while (n > 0) { if (n%2 === 1) ans++; n = Math.floor(n/2) } return ans } ans는 반환할 정답이자, 점프한 횟수이다. while 반복문을 n이 0이 될 때까지 순회한다. 만약, 현재 n을 2로 나눈 나머지가 1인 경우, 점프에 해당하므로 ans에 1을 더한다. 그리고, n을 계속해서 Math.floor() 를 통해 2로 나..
-
[CodeKata] 프로그래머스 : 3.18(목), 배달 / [이론] Dijkstra AlgorithmAlgorithm 2021. 3. 18. 14:46
🥋 Ooooth!! (Level 2) : 배달 🧮 풀이 다익스트라 알고리즘을 사용해 최단시간을 탐색하는 문제였다. 리뷰에서, 다익스트라에 대해 자세히 정리했다. function solution(N, road, K) { let arr = Array(N + 1).fill(Infinity); let adj = Array.from(Array(N + 1), () => Array()); road.forEach(info => { let a = info[0]; let b = info[1]; let c = info[2]; adj[a].push({ to: b, weight: c }); adj[b].push({ to: a, weight: c }); }); let check = [{ to: 1, weight: 0 }]; ar..
-
[CodeKata] 프로그래머스 : 3.17(수), 짝지어 제거하기Algorithm 2021. 3. 17. 14:23
🥋 Ooooth!! (Level 2) : 짝지어 제거하기 🧮 풀이 function solution(s) { let stack = []; for (let str of s) { if (stack[stack.length-1] === str) { stack.pop() } else { stack.push(str) } } return stack.length === 0 ? 1 : 0; } stack은 말 그대로 스택이다. s(문자열)을 순회하면서, stack 제일 끝의 글자와 같은지 여부에 따라 push / pop 을 결정한다. 반복문으로 s(문자열)을 순회한다. 이 글자가 stack[stack.length-1] 글자와 같다면 stack 제일 끝을 pop() 한다. 아니라면, 현재 글자를 stack에 push() 하..
-
[CodeKata] 프로그래머스 : 3.16(화), JadenCase 문자열 & N개의 최소공배수카테고리 없음 2021. 3. 16. 10:15
🥋 Ooooth!! (Level 2) : JadenCase 문자열 만들기 🧮 풀이 function solution(s) { return s.split(" ") .map(e => e === '' ? e : e[0].toUpperCase() + e.slice(1).toLowerCase()) .join(" ") } 먼저, s(문자열)을 split을 통해 배열로 만들어준다. 이 배열의 각 요소를 map() 처리하는데, 빈 문자열('') 처리를 위해 위처럼 삼항연산자 형태로 적용했다. 빈 문자열이 아니라면, e의 첫 글자는 toUpperCase(), 나머지는 toLowerCase() 처리로 각각 대/소문자로 만든다. 마지막으로, 이를 다시 공백(" ")으로 join() 해서 문자열로 반환한다. 🥋 Ooooth!!..
-
[CodeKata] 프로그래머스 : 3.13(토), 피보나치 수 & 행렬의 곱셈Algorithm 2021. 3. 13. 13:37
🥋 Ooooth!! (Level 2) 🧮 풀이 function solution(n) { let pre = 0; let cur = 1; let last = 0; for (let i = 2 ; i Array.from({ length: ansY }, y => 0))) for (let x = 0 ; x < ansX ; x++) { for (let y = 0 ; y < ansY ; y++) { for (let l = 0 ; l < ansLen ; l++) { answer[x][y] += arr1[x][l] * arr2[l][y] } } } return answer; } 중학교땐가... 배웠던 행렬의 곱셈의 기억을 더듬어보았다 ㅎㅎㅎㅎ 🤔 (4x2) * (2x4) 행렬의 곱셈을 예로 들면, 앞의 열과 뒤의 행의 길..
-
[CodeKata] 프로그래머스 : 3.12(금), 수식 최대화카테고리 없음 2021. 3. 12. 17:53
🥋 Ooooth!! (Level 2) 카카오답게 문제가 길지만 요점은 수식의 우선순위를 변경하면서 최대값을 구해야한다는 것이다. 우선순위도 기본 사칙연산과 달리 동등할 필요가 없다. 즉, + / - / * 세 연산자의 1,2,3 순위를 돌린 최대 6가지 케이스를 비교하면 된다. 🧮 풀이 function combination(arr, num) { let result = []; if(num == 1) return arr.map(e => [e]); arr.forEach((e,i,array) => { let rest = [...array.slice(0,i), ...array.slice(i+1)]; let combinations = combination(rest,num-1); let combiArr = combi..
-
[CodeKata] 프로그래머스 : 3.11(목), 최대값과 최소값 & 최소값 만들기Algorithm 2021. 3. 11. 14:04
🥋 Ooooth!! (Level 2) 🧮 풀이 function solution(s) { const sortS = s.split(" ").map(e => Number(e)).sort(((a,b) => a-b)) return `${sortS[0]} ${sortS[sortS.length-1]}` } sortS는 s를 배열로 split() 한 뒤, 오름차순으로 정렬한 형태이다. 정렬을 위해, Number로 변환하는 과정이 필요하다. 최소값(0번 인덱스), 최대값(마지막 인덱스) 을 Templates Literal 문자열로 반환했다. 🥋 Ooooth!! (Level 2) 🧮 풀이 A, B 배열 요소들 곱의 누적합이 최소가 되려면, 모든 곱의 경우에서 최소값을 도출해야 한다고 생각했다. 가령, B에서 가장 큰 값인..
-
[CodeKata] 프로그래머스 : 3.10(수), 이진 변환 반복하기Algorithm 2021. 3. 10. 12:32
🥋 Ooooth!! (Level 2) 🧮 풀이 function solution(s) { let answer = [0, 0]; while(s !== "1") { const sOneLen = s.replaceAll("0", "").length; // const sOneLen = s.split("").filter(e => e === '1').join("").length; answer[0]++; answer[1] += s.length - sOneLen; s = sOneLen.toString(2); } return answer; } answer는 정답 튜플이다. 0번째는 변환 횟수, 1번째는 제거된 0의 갯수를 저장할 것이다. while 반복문을 반복한다. 종료조건은, s가 "1"이 될 때이다. "1"은 이진변환..