프로그래머스
-
[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"은 이진변환..
-
[CodeKata] 프로그래머스 : 3.9(화), 숫자의 표현Algorithm 2021. 3. 9. 16:06
🥋 Ooooth!! (Level 2) 🧮 풀이 공식보다는, 내가 발견한 나름의 규칙성으로 푼 방식이다. function solution(n) { let answer = 1; let div = 2; while (Math.round(n/div) - Math.floor(div/2) >= 1) { if (div%2 === 1 && n%div === 0) { answer++; } else if (div%2 === 0 && n%div === div/2) { answer++; } div++; } return answer; } 1) 변수 설정 answer는 연속한 자연수의 경우의 수이다. 1로 시작하는 이유는 n 자체 1개인 경우는 모든 수가 해당하므로! div는 n을 나눌 숫자이다. 위의 경우가 1로 나눴을 떄이므로..