월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
선생님 덕분에 스택이 이해가 되고 풀리는 것 같아요 ㅠㅠ!
접근방식이 헷갈릴때 접근방식만 듣고 다시 풀어보면 바로 풀리네요 ㅜㅜ 항상 감사해요!! - tip. () 괄호가 나오는 문제는 보통 stack 활용하면 된다. > 문제 : 쇠막대기와 레이저의 배치를 나타내는 괄호가 주어졌을 때, 레이져로 잘린 쇠막대기 조각의 총 개수를 출력해라 > 입력 : 1. 모든 레이저는 ‘( )’ 으로 표현된다. 2. 쇠막대기의 왼쪽 끝은 여는 괄호 ‘ ( ’ 로, 오른쪽 끝은 닫힌 괄호 ‘) ’ 로 표현된다. - 조건 1) 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다. => 긴 쇠막대기 위에 놓을때 쇠막대기의 양 끝점은 겹치지 않고, 완전히 그 안에 포함되게 놓인다. - 조건 2) 쇠 막대기를 자르는 레이저는 1개 이상이다. - 조건 3) 레이저는 쇠막대기의 양 끝점과 겹치지 않는다. ## 접근방식 1. stack 스택자료구조 활용하기! 2. 나열된 괄호를 조회하며 쇠막대기 왼쪽 끝인, ( 여는 괄호를 만날경우? ( 여는 괄호가 반복되면 쇠막대기 개수가 추가된다. => 쇠막대기 ( 를 모두 stack[]에 담아준다. (쇠막대기 개수 증가) 3. ) 닫는 괄호를 만날경우? => stack []에 있는 "("여는 괄호 1개를 제거한다. **")" 닫는괄호는 꼭 두가지 경우를 생각해야한다.** 4. 레이져인 경우 => stack[] 가장 위(바로 직전)에 여는 괄호일 경우 "()" 레이져 4-1. 레이져가 나올때마다 "()" => stack[] ( 여는괄호 하나 제거 후, 4-2. Stack[]에 남아있는 괄호의 개수(잘려진 쇠막대기 조각 개수)를 더해준다. 5. 쇠막대기의 끝인 경우 => stack[] 가장 위에 있는 괄호가 ")" 닫는 괄호일 경우 쇠막대기의 마지막 끝이다. 5-1. ) 닫는괄호의 짝인 ( 여는괄호를 stack[]에서 삭제하며 +1 을 더해준다. => 쇠 막대 한개가 완성되면, 레이져로 잘리고 남은 쇠조각 1개만 남기 때문에 +1을 해주는 것이다. ## 풀이 1. 개수를 세줄 변수 cnt를 선언하고 초기값 0 할당, ( 괄호를 담을 변수 stack선언하고 [] 할당한다. 2. for 문으로) str 괄호가 정렬되어있는 문자열을 순서대로 모두 조회한다. 3. if문) ( 를 만날 경우? => stack []에 반복해서 (를 담아준다. => push() 4. else문) ) 를 만날 경우? 5. if 문) str[i-1] 직전 요소가 "("인 경우? => stack[]맨 위의 (를 제거한다. => pop() => stack[]에 담긴 요소개수 stack.length 를 cnt에 더해준다. 6. else문) str[i-1] 직전 요소가 ")"인 경우? => stack[] 맨 위의 (를 제거한다. => pop() => cnt 개수에 +1을 더해준다. 7. 모든 요소를 조회하여, for 문이 종료되면 레이져로 잘린 쇠조각의 개수 cnt를 출력한다. ### 선생님 풀이와 다른 점 ")" 를 만날 경우? 무조건 stack[]의 맨 위 ( 괄호를 제거해야하니깐, 아래 코드처럼 적으면 pop()을 한번만 실행하면된다. else { stack.pop(); if (str[i - 1] === "(") { cnt += stack.length; } else { cnt++; } --> <script> function solution(str) { let cnt = 0; let stack = []; for (let i = 0; i < str.length; i++) { if (str[i] === "(") { stack.push(str[i]); } else { if (str[i - 1] === "(") { stack.pop(); cnt += stack.length; } else { stack.pop(); cnt++; } } } return cnt; } let str = "()(((()())(())()))(())"; console.log(solution(str)); </script>영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
안녕하세요 코드 리뷰 부탁드립니다!
function solution(k, arr) { let p = 0, q = 0, sum = 0, answer = 0; for (q; q < arr.length; q++) { sum += arr[q]; answer = Math.max(answer, sum); if (q - p === k - 1) { p++; q = p - 1; sum = 0; } } return answer; } let a = [12, 15, 11, 20, 25, 10, 20, 19, 13, 15]; console.log(solution(3, a));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
자바스크립트 코테 강의는 채점 없나요?
파이썬은 채점프로그램이 있는거 같던데 이 강의는 없나요?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 리뷰 부탁드려요~ 앞에 괄호문제에서 while문 쓰셨던거 활용해서 while문 사용했는데 더 복잡한 방식인가요?
## 풀이 1. 변수 stack 선언, 뽑은 인형을 순서대로 담을 바구니, 빈배열 [] 할당한다.\ 2. 이중 for문) 5 * 5 board 2차원 배열을 조회하기 위해 이중 포문으로 숫자 요소(각 인형)를 조회한다. 2-1. 외부 for) 인형을 뽑을 위치가 담긴 moves 배열의 수 요소(board의 열 길이)를 모두 조회한다. 2-2. 내부 for) moves 배열요소, 즉 board의 열을 1번 조회할때 board의 행 길이까지를 돌며 행 요소를 조회한다. = > 열고정 , 내부 포문 행의 요소를 다 조회한 후 => 다음 열을 조회하는 식 3. 내부 for문 내 if조건문 4. if문) 뽑은 인형(보드의 행열 요소)가 0이 아닌 경우, (인형이 있는 2차원 배열 요소) 5. while문) 뽑으려는 인형(보드 행열 요소)과 같은 인형이 바구니에 맨위(stack의 마지막요소)에 담겨있는 경우? => 뽑은 인형이 있던 보드의[헹][열-1]요소를 0으로 변경한다. 뽑았으니 인형이 없는 것이니깐! => stack.pop() 으로 stack의 맨 위 인형을 삭제한다. (뽑은 인형과 같은 인형) => cnt 개수를 인형이 2개 제거되었으니 +2 올려준다. 5-1. while문 탈출조건) 뽑는 인형과 stack 바구니에 담긴 맨위 인형과 다를 경우? => while문을 종료하고 뽑은 인형을 stack바구니에 담는다. 6. 2차원 배열을 조회하는 for문이 종료되고, 인형이 몇개 제거되었는지 cnt를 리턴한다. function solution(board, moves) { let cnt = 0; let stack = []; // 열 조회 for (let column = 0; column < moves.length; column++) { // 행 조회 (1열 조회 후 모든 행 조회식) for (let row = 0; row < board.length; row++) { // if (board[row][column - 1] !== 0) { while (board[row][column - 1] === stack[stack.length - 1]) { board[row][column - 1] = 0; stack.pop(); cnt += 2; } // 같지 않은경우 stack에 뽑은 인형을 담는다. stack.push(board[row][column - 1]); } } } return cnt; // 4 } let board = [ [0, 0, 0, 0, 0], [0, 0, 1, 0, 3], [0, 2, 5, 0, 1], [4, 2, 4, 4, 2], [3, 5, 1, 3, 1], ]; let moves = [1, 5, 3, 5, 1, 2, 1, 4]; console.log(solution(board, moves));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
s에 공백문자를 추가하는 것에 대한 질문입니다
s 뒤에 공백문자를 추가하지 않고 코드를 작성하였는데 정상적으로 동작하였습니다. 디버깅 결과 s[i + 1]의 값이 존재하지 않을 때 오류가 발생하는 것이 아니라, undefined값이 할당된 후 비교 연산이 수행되었습니다. 혹시 이대로 코드를 작성해도 될까요? 아니면 추가적인 문제가 있을 수도 있나요? function solution(s){ let answer=""; let cnt=1; for(let i=0; i<s.length; i++){ if(s[i]===s[i+1]) cnt++; else{ answer+=s[i]; if(cnt>1) answer+=String(cnt); cnt=1; } } return answer;}
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
풀이방법 시간복잡도 질문드립니다.
강의코드와 비교했을때, 아래 풀이방법도 시간복잡도 측면에서 차이 없을까요? function solution(size, arr) { let answer; let cache = Array.from({ length: size }, () => 0); for (let x of arr) { if (cache.indexOf(x) === -1) { cache.unshift(x); if (cache.length > size) cache.pop(); } else { let pos = cache.indexOf(x); for (let i = pos; i > 0; i--) cache[i] = cache[i - 1]; cache[0] = x; } } answer = cache; return answer; }
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
로직 이해가 안되는 부분이 있어서 질문드립니다.
위에 콘솔에서 ch배열의 값들과 ch[i]의 값이 다르게 나오는데 어떤 이유때문에 이런 현상이 생기는 건가요??
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
깃허브 업로드 관련해서 문의드립니다!!
안녕하세요 강의 잘 듣고있습니다. 앞전에 블로그나 깃허브에 올릴때 문제공개를 하지말고 제공된 소스코드 같은건 올려도된다 하셨는데 문제를 통으로 올리지 말라는게 결국 그 얘기 아닌가싶어서요 ㅜㅜ 죄송하지만 잘 이해가 되지않아서 문의드립니다. 강의 자료의 txt 파일을 통으로 올리지말라는 말씀이신가요 ?? 정 애매하면 private 로 해서 올릴생각입니다ㅜㅠㅜ 예를 들어서 깃허브에 이런식으로 올리는 건 괜찮나요? function solution(a, b, c) { let answer; if (a < b) { answer = a; } else { answer = b; } if (c < answer) { answer = c; } return answer; } console.log(solution(10, 22, 23));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
reduce로 객체를 생성한 후 문제를 푸는 방법
선생님 우선 문제를 먼저 풀어봤습니다! 해쉬를 이용해서 풀라고해서 reduce함수를 이용해서 객체를 만들고 key와 value 값을 매핑하는 방식으로 풀었습니다. 만든 객체에서 value값이 최대인 key값을 출력하는 함수를 만들었습니다. 답은 C가 잘나오기는 하는데, 제가 만든 방식은 혹시 괜찮을까요? function solution(s){ let answer; let students = [...s]; let countedNames = students.reduce((prev, curr) => { if (curr in prev) prev[curr]++ else prev[curr] = 1; return prev; }, {}); let max = 0; for (let x in countedNames) { if (max < countedNames[x]) { max = countedNames[x]; answer = x; } } return answer; }
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
강의 코드에 반례가 있습니다.
입력이 [5, 2, 4, 6, 7]로 주게되면 5, 6, 7 를 뽑아내어 길이가 3인 최대 부분 증가수열을 만들 수 있습니다. 하지만 강의코드에서 위와 같이 입력을 주게되면 출력이 4가 나옵니다. 반례의 경우에도 올바른 출력이 나오도록 수정해보았습니다. 확인부탁드립니다. <html> <head> <meta charset="UTF-8"> <title>출력결과</title> </head> <body> <script> function solution(arr){ let answer = 0; let n = arr.length; let dy = Array.from({length:n}, ()=>0); dy[0] = 1; let max = 0; for(let i=1; i<n; i++){ if(arr[i] > arr[max]){ dy[i] = dy[i-1]+1; max = i; } else dy[i] = dy[i-1]; answer = Math.max(answer, dy[i]); } return answer; } let arr=[5,2,4,6,7]; console.log(solution(arr)); </script> </body> </html>
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 리뷰 부탁드립니다.
안녕하세요. 혹시 제 코드 한번 봐주실 수 있을까요? 이렇게 풀어도 되는지 궁금합니다. 감사합니다. function solution(n, arr) { let answer = 0; for (let i = 0; i < arr.length; i++) { let sum = 0; let rt = i; while (sum !== n && sum < n && rt < arr.length) { sum += arr[rt]; rt++; } if (sum === n) answer++; } return answer; }
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
안녕하세요! 혼자서 풀어봤는데 괜찮은 코드 일까요?
function solution(arr) { let answer let max = Number.MIN_SAFE_INTEGER let sum = 0 for (let v of arr) { v.toString() .split('') .forEach(e => { sum += parseInt(e, 10) if (max < sum) { max = sum answer = v } else if (max === sum) v > answer && (answer = v) }) sum = 0 } return answer } let arr = [128, 460, 603, 40, 521, 137, 123] let arr2 = [235, 460, 603, 1234, 521] console.log(solution(arr)) console.log(solution(arr2))
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
Set 자료구조 사용시 성능개선 유무 관련 질문드립니다.
아래코드와 같이 '합의배열.includes(합)' 을 사용해서 중복체크를 하는방법도 있는데, 혹시, Set 자료구조를 써서 중복체크를 하는경우, 성능면에서 더 나은점이 있기 때문에 일부러 사용하신건지 궁금해서 질문드립니다. <html> <head> <meta charset="UTF-8" /> <title>출력결과</title> </head> <body> <script> function solution(n, k, card) { let answer; let sumArr = []; for (let i = 0; i < card.length - 2; i++) { for (let j = i + 1; j < card.length - 1; j++) { let sum = 0; for (let k = j + 1; k < card.length; k++) { sum = arr[i] + arr[j] + arr[k]; if (!sumArr.includes(sum)) sumArr.push(sum); } } } sumArr.sort((a, b) => b - a); answer = sumArr[2]; return answer; } let arr = [13, 15, 34, 23, 45, 65, 33, 11, 26, 42]; console.log(solution(10, 3, arr)); </script> </body> </html>
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
변수명 관련 질문드립니다.
변수명 관련 의문이 생겨 질문드립니다! Q1. 4차원배열의 인덱스 변수명을 알파벳순으로 하면 'IJKL' 인데 L대신 S를 사용하신 이유가 궁금합니다. Q2. pi와 pj에서 p의 의미는 무엇인가요?
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
for문에서 i 범위
for문에서 i의 범위를 arr.length이 아니라 arr.length-1로 해야하지 않나요?? 선택정렬은 arr[i]뒷부분에서 최솟값을 찾는 것으로 이해했어요, arr.length로 설정한다면, 맨 마지막 원소도 for문을 실행할텐데요.. 최솟값을 비교할 원소가 없는데 말이에요 범위를 어떻게 설정해야 할까요? 아래처럼 작성한 것도 정답인가요 function solution(arr) { let answer = arr; for (let i = 0; i < arr.length - 1; i++) { let idx = i; for (let j = i + 1; j < arr.length; j++) { if (arr[idx] > arr[j]) { idx = j; } } [arr[i], arr[idx]] = [arr[idx], arr[i]]; console.log(arr); } return answer; }
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
안녕하세요. 코드 리뷰 부탁드립니다.
function solution(arr) { let answer; let n = arr.length; let dy = Array.from({ length: arr.length }, () => 0); dy[0] = 1; for (let i = 1; i < n; i++) { for (let j = i - 1; j >= 0; j--) { if (arr[i] > arr[j]) { dy[i] = Math.max(dy[i], dy[j] + 1); } } dy[i] = Math.max(dy[i], 1); } answer = Math.max(...dy); return answer; } 저는 max 변수를 이용한 비교가 아닌 Math.max 함수를 이용하였는데, 혹시 시간복잡도나 사용 메모리가 높아질까요? 괜찮은 코드인지 리뷰 부탁드립니다.
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
문자열 탐색 문제 중에서 문자열 압축 문제 이렇게 풀어봐도 괜찮을까요?
function solution(str) { let answer = ""; for (let i = 0; i < str.length; i++) { let first = str.indexOf(str[i]); let last = str.lastIndexOf(str[i]); if (first === last) answer += str[i]; else { answer += str[i] + String(last - first + 1); i = last; } } return answer; } let str = "KKHSSSSSSSE"; console.log(solution(str)); 강사님은 cnt증가하는 방식으로 하셨는데 indexOf()와 lastIndexOf()를 이용해서 구해도 괜찮은건지 궁금합니다!
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이렇게 짜도 될까요? for문 하나에서 만들어 보았습니다.
function solution(M, arr) { let i = 0, sum = 0, q = 0; answer = 0; for (i; i < arr.length; i++) { sum += arr[i]; if (sum < M) { answer++; } else { if (sum === M) answer++; q++; i = q - 1; sum = 0; } } return answer; } let M = 5; let arr = [1, 3, 1, 2, 3]; console.log(solution(M, arr));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
안녕하세요 코드 리뷰 부탁드립니다!
function solution(arr, m) { let p = 0, q = 1, answer = 0; let sum = arr[0]; while (p < arr.length && q < arr.length) { sum += arr[q]; if (sum >= m) { if (sum === M) answer++; p++; q = p + 1; sum = arr[p]; } else { q++; } } return answer; } let arr = [1, 2, 1, 3, 1, 1, 1, 2]; let M = 6; console.log(solution(arr, 6));
- 미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
질문 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 혹시 똑같은 코드에서 갯수말고 배열로 받으려면 어떠한 코드를 작성해야 하나요.. (2, 2), (4, 3), (4, 5)와 (10, 3)를 answer로 받고싶습니다..