월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
shift, splice연산
안녕하세요shift 연산을 사용하면 원소값들이 한칸씩 다 당겨진다고 알고 있는데 맞나요??만약에 맞다면 N이 클경우는 원형큐같이 직접구현해서 사용하는게 시간복잡도상 더 좋은 코드일까요?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이렇게 풀어도 괜찮을까요? sort와 map, while을 이용하여 풀었습니다.
<html> <head> <meta charset="UTF-8" /> <title>출력결과</title> </head> <body> <script> function solution(arr) { let answer = []; let arrCopy = arr.map((item) => item); let corrarr = arrCopy.sort(function (a, b) { return b - a; }); for (let i = 0; i < arr.length; i++) { let j = 0; while (j < corrarr.length) { if (arr[i] == corrarr[j]) { answer.push(j + 1); break; } j++; } } return answer; } let arr = [87, 89, 92, 100, 76, 89]; console.log(solution(arr)); </script> </body> </html>이렇게 풀면 문제가 있을까요??
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
해쉬에서 맵을 쓰는 이유?
function solution(s) { let answer = s[0]; let count = {}; for (const i of s) { if (count[i]) count[i] += 1; else count[i] = 1; } for (const i in count) { if (count[i] > count[answer]) answer = i; } return answer; } let str = "BACBACCACCBDEDE"; console.log(solution(str)); 혼자서 풀어봤을 때는 맵을 쓰지는 않았는데, 혹시 해쉬 구조에서 객체 대신 맵을 사용해서 얻을 수있는 이점이 어떤 게 있을까요? 또, 위와 같은 방법으로 풀었을 때 문제는 없을까요?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
indexOf를 사용해서 반복문 하나 줄여봤습니다
function solution(test) { let answer = 0; let n = test.length; let studentNum = test[0].length + 1; // i는 멘토가 될 수 있는 학생 // j는 멘티가 될 수 있는 학생 for (i = 1; i < studentNum; i++) { for (j = 1; j < studentNum; j++) { if (i === j) continue; let flag = 0; // k는 n차 시험의 결과 for (k = 0; k < n; k++) { if (test[k].indexOf(i) < test[k].indexOf(j)) { flag++; } else { break; } } if (flag === n) answer++; } } return answer; } 각 시험 회차의 인덱스 번호가 학생의 번호다보니까 indexOf를 사용하면 반복문 하나 줄이고도 풀 수 있지 않을까 해서 이렇게 해봤습니다.
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드리뷰 부탁드립니다!
function addEachDigit(num) { const str = String(num); const addedNum = str.split("").reduce((acc, prev) => acc + Number(prev), 0) return addedNum; } function solution(n, arr) { let answer = 0; for (const i of arr) { const addNum = addEachDigit(i); const maxAddNum = addEachDigit(answer); if (addNum > maxAddNum) answer = i; if (addNum == maxAddNum) { if (i > answer) { answer = i; } } } return answer; } let arr = [128, 460, 603, 40, 521, 137, 123]; console.log(solution(7, arr)); 늘 감사합니다.제가 풀어본 문제 중에서는 처음으로 선생님의 풀이와 완전히 다른 방식이라 이런 방식은 어떨지 견해를 들어보고 싶습니다.
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 이렇게 작성해도 괜찮나요? 혹시 시간 복잡도는 어떻게 되는지 궁금합니다!
string의 slice메소드를 활용해서 다음과 같이 작성해보았는데 이렇게 해도 문제는 없는지, 시간복잡도는 어떻게 되는지 궁금합니다! // 두 문자열 아나그램인지 비교하는 함수 function compareStr(target, str) { // target문자열을 담은 hash 만들기 let targetH = new Map(); for (let x of target) { if (targetH.has(x)) targetH.set(x, targetH.get(x) + 1); else targetH.set(x, 1); } // target과 str이 같은지 비교 for (let x of str) { if (!targetH.has(x) || targetH.get(x) === 0) return false; targetH.set(x, targetH.get(x) - 1); } return true; } function solution(s, t) { let answer = 0; let n = t.length; // target의 길이 for (let i = 0; i <= s.length - n; i++) { let slicedStr = s.slice(i, i + n); // 문자열을 target 길이 맞춰서 잘라주기 // 비교해서 true이면 answer올리기 if (compareStr(t, slicedStr)) answer++; } return answer; } let a = "bacaAacba"; let b = "abc"; console.log(solution(a, b));감사합니다!
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
다른 방법으로 풀이했는데 삽입 정렬이 맞을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. function solution(arr) { let answer = arr; for (let i = 0; i < arr.length; i++) { for (let j = 1; j < arr.length; j++) { if (arr[j - 1] > arr[j]) { [arr[j - 1], arr[j]] = [arr[j], arr[j - 1]]; } } } return answer; } // test case console.log(solution([11, 7, 5, 6, 10, 9]));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
미로 탐색 문제 질문 있습니다.
미로 탐색에서 재귀에 진입하기 전 board에 표시를 할 때,boarr[nx][ny] = 1이 맞나요?해당 자리에 1로 표시를 해놓고 다음으로 넘어가는 개념이니까arr[x][y] = 1이렇게 하는게 맞지않나라는 생각이 드는데혹시 제가 잘못 이해를 한 걸까요?결과는 똑같이 나와서 의문이네요.// 강사님의 답 if(nx >= 0 && nx <= 6 && ny >= 0 && ny <= 6 && board[nx][ny] === 0){ board[x][y] = 1 DFS(nx,ny) board[x][y] = 0 } // 저의 답 if(nx >= 0 && nx <= 6 && ny >= 0 && ny <= 6 && board[nx][ny] === 0){ board[x][y] = 1 ★★★ DFS(nx,ny) board[x][y] = 0 ★★★ }
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이런식으로 풀어도 괜찮을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.function solution(n, arr) { let answer = 'NO'; let ch = Array.from({ length: n }, () => 0); function DFS(v) { if (v === n - 1) { let aSum = 0; let bSum = 0; for (let j = 0; j < n; j++) { if (ch[j]) aSum += arr[j] //0이면 else bSum += arr[j] //1이면 } if (aSum === bSum) return answer = 'YES' } else { ch[v] = 1; DFS(v + 1) ch[v] = 0 DFS(v + 1) } } DFS(0); return answer } console.log('answer', solution(6, [1, 3, 5, 6, 7, 10]))
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
삽입정렬로 생각이 안나서 다르게 풀어봤습니다.
삽입 정렬로 혼자 풀어보려고 했는데 도무지 생각이 안나서 버블정렬? 로 푼것 같습니다사실 버블정렬도 아닌것 같긴한데혹시 이렇게 풀면 너무 비효율적이거나 반례가 있을까요?function solution(s, arr) { let answer = new Array(s).fill(0); answer[0] = arr[0]; for (let i = 1; i < arr.length; i++) { if (answer.includes(arr[i])) { for (let j = s - 1; j > 0; j--) { if (answer[j] === arr[i]) { [answer[j], answer[j - 1]] = [answer[j - 1], answer[j]]; } } } else { answer.pop(); answer.unshift(arr[i]); } } return answer; }
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
투포인터 없이 풀어 봤는데 반례라거나 시간복잡도의 문제가 있을까요...?
function isSame(map1, map2) { if (map1.size !== map2.size) return false; for (const [key, val] of map2) { if (!map1.has(key) || map1.get(key) !== val) return false; } return true; } function solution(s, t) { let answer = 0; const map1 = new Map(); const map2 = new Map(); const n = t.length; const ss = s.slice(0, n); for (const s of t) { if (map1.has(s)) { map1.set(s, map1.get(s) + 1); } else { map1.set(s, 1); } } for (const s of ss) { if (map2.has(s)) { map2.set(s, map2.get(s) + 1); } else { map2.set(s, 1); } } if (isSame(map1, map2)) answer++; for (let i = n; i < s.length; i++) { map2.delete(s[i - n]); map2.set(s[i], map2.get(s[i]) ? map2.get(s[i]) - 1 : 1); if (isSame(map1, map2)) answer++; } return answer; } const s = "bacaAacba"; const t = "abc"; console.log(solution(s, t)); 슬라이딩 윈도우로 처음 t만큼 잘라서 비교한 이후 부터 돌면서 처리 했는데 다른 문제가 있을까요...?
- 해결됨자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
section5 - 7번 질문 드립니다.
function solution(words1, words2) { const firstWordMap = new Map(); const secondWordMap = new Map(); let answer = "YES"; // 단어 구성 문자열 판별 for (let item of words1) { if (firstWordMap.has(item)) { firstWordMap.set(item, firstWordMap.get(item) + 1); } else { firstWordMap.set(item, 1); } } for (let item of words2) { if (secondWordMap.has(item)) { secondWordMap.set(item, secondWordMap.get(item) + 1); } else { secondWordMap.set(item, 1); } } // 아나그램 판단 for ([key, value] of firstWordMap) { if (secondWordMap.has(key) && secondWordMap.get(key) === value) { answer = "YES"; } else { return "NO"; } } return answer; } // test case console.log(solution("AbaAeCe", "baeeACA")); console.log(solution("abaCC", "Caaab")); 위와 같이 map을 두개 만들어 비교하는 방법은 별로일까요?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
혼자 풀어봤는데요...
function solution(n, arr) { // 소수를 판별하는 함수 function isPrime(num) { if (num === 1) return false; if (num === 2) return true; for (let i = 2; i <= Math.sqrt(num); i++) { if (num % i === 0) return false; } return true; } const answer = arr.filter((num) => { let reverseNum = Number(String(num).split('').reverse().join('')); if (isPrime(reverseNum)) { console.log(reverseNum); return reverseNum; } }); return answer; } const n = 9; const arr = [32, 55, 62, 20, 250, 370, 200, 30, 100]; console.log(solution(n, arr));filter 내의 조건문에서 isPrime 함수에서 판별하고 true인 것을 콘솔에 출력해보면23, 2, 73, 2, 3 이렇게 나오는데밑에 return reverseNum;을 하고 나서 answer을 보면[ 32, 20, 370, 200, 30 ] 이렇게 출력되는데 왜 숫자가 다르게 나오는 건가요?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
섹션2 공통원소 구하기 정렬 없이 해봤는데 괜찮을까요??
<html> <body> <script> function solution(arr1, arr2) { const answer = []; const n = arr1.length; const m = arr2.length; let p1 = (p2 = 0); while (p1 < n) { if (arr1[p1] === arr2[p2]) { answer.push(arr1[p1++]); p2++; } else { p1++; } } p1--; while (p2 < m && p1 >= 0) { if (arr2[p2] === arr1[p1]) { answer.push(arr2[p2++]); p1--; } else { p1--; } } return answer.sort((a, b) => a - b); } const arr1 = [1, 3, 9, 5, 2]; const arr2 = [3, 2, 5, 7, 8]; console.log(solution(arr1, arr2)); </script> </body> </html>위와 같이 p1먼저 돌고 그 다음에 p2돌면서 p1을 뒤에서부터 찾았는데 이렇게 하는건 별로 일까요...?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 한번 봐주실 수 있으신가요?
function solution(arr) { const strArry = arr.split(""); let answer = []; let i = 0; while (i < strArry.length) { if (strArry[i] === "(") { answer.push(strArry[i]); } else { answer.pop(strArry[i]); } i++; } return answer.length === 0 ? "YES" : "NO"; } //console.log(solution("(()(()))(()")); console.log(solution("(((())))"));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
제 코드도 한번만 봐주실 수 있을까요? ㅠㅠ
function solution(sum, arr) { let left = 0; let right = 0; let add = 0; let count = 0; while (right < arr.length) { if (add >= sum) { add -= arr[left ++]; } else { add += arr[++right]; } if (add === sum) count++; } return count; } console.log(solution(6, [1, 2, 1, 3, 1, 1, 1, 2]));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 리뷰 부탁드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. function solution(s, arr) { const cache = Array.from({ length: s }).fill(0); for (let i = 0; i < arr.length; i++) { // cache miss if (!cache.includes(arr[i])) { cache.unshift(arr[i]); cache.pop(); } // cache hit else { const idx = cache.indexOf(arr[i]); const temp = cache[idx]; let j; for (j = idx - 1; j >= 0; j--) { cache[j + 1] = cache[j]; } cache[j + 1] = temp; } } return cache; } let arr = [1, 2, 3, 2, 6, 2, 3, 5, 7]; console.log(solution(5, arr)); // 7 5 3 2 6 최악의 경우 O(N^2)인 거 같은데 맞나요 ?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이렇게 코드를 작성해도 삽입 정렬인가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. function solution(arr) { for (let i = 1; i < arr.length; i++) { for (let j = i; j > 0; j--) { if (arr[j] < arr[j - 1]) { [arr[j - 1], arr[j]] = [arr[j], arr[j - 1]]; } } } return arr; } let arr = [11, 7, 5, 6, 10, 9]; console.log(solution(arr));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 검토
안녕하세요! 선생님의 bfs 풀이 아이디어를 듣고 혼자 풀어봤습니다! 저의 경우 ch 랑 dis를 합쳐서 check 로 풀어서, 디폴트가null 이어서 널 이면 큐에 넣고, 숫자가 들ㄹ어가있으면 continue 하는 식을로 했는데 괜찮을까요?function solution(s, e) { let answer = 0; let dx = [1, -1, 5]; let check = Array.from({ length: 10001 }, () => null); check[s] = 0; let queue = []; queue.push(s); while (queue.length) { let v = queue.shift(); if (v === e) { answer = check[v]; break; } for (let a of dx) { let x = a + v; if (check[x] !== null || x < 1 || x > 10000) continue; check[x] = check[v] + 1; queue.push(x); } } return answer; }
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
강의 질문 및 코드 리뷰
안녕하세요 이번 강의를 듣고 선생님께서 알려주신 풀이 방법을 이해하게 되었습니다 감사합니다!다만 제가 몇가지 질문이 있어 글 올립니다!1 . 풀이 방향이 각각의 (조합) * (숫자) 의 합이 되는데 왜 마지막 숫자가 (조합) * (숫자) 의 합이 되나요 ???제가 강의를 듣기전에 혼자서 코드를 짜보았는데 왜 이 코드는 답이 안나오는지 여쭈고 싶습니다!function solution(n, end) { let mem_arr = Array.from(Array(n + 1), () => Array(n + 1).fill(0)); // 메모이제이션 let comb_arr = Array.from({ length: n }, () => 0); // 조합의 배열 let check = Array.from({ length: n }, () => false); // for 수열 (중복X) let arr = Array.from({ length: n }, () => 0); // 순열 저장 let answer = []; function comb(n, r) { if (n === r || r === 0) return (mem_arr[n][r] = 1); if (mem_arr > 0) return mem_arr[n][r]; return (mem_arr[n][r] = comb(n - 1, r - 1) + comb(n - 1, r)); } for (let i = 0; i < n; i++) { comb_arr[i] = comb(n - 1, i); } function dfs(lev) { if (lev >= n) { let sum = 0; for (let i = 0; i < n; i++) { sum += comb_arr[i] * (i + 1); } if (sum === end) { answer.push(arr.slice()); } } else { for (let i = 1; i <= n; i++) { if (check[i] === true) continue; check[i] = true; arr[lev] = i; dfs(lev + 1); check[i] = false; } } } dfs(0); return answer; }제가 처음에 의도했던 코드의 경우로는,,일단 순열을 arr에 저장하고 lev=== n 이 될때 구한 순열과 조합의 곱의 합인 sum 을 구하여 비교하는 방식으로 짰습니다. 근데 이 코드를 실행해보니까 arr 이 (1,2,3,4) 로만 나오는데 어디서 잘못됐는지 잘 모르겠습니다!! 답변 주시면 정말 감사하겠습니다 😄