범위 확인 후 배열 선언할때 만약 n이 10,000 이하라고 하면 n[10004] 이런식으로 선언하는데 문제마다 코드를 보면 어떤건 n[10001] 어떤건 n[10004] 이렇게 선언되어있는걸 확인했습니다. 이게 이유가 있다면 정확이 어떤건지 그냥 의미 없는건지 궁금합니다. 10,000 이하라고 하면 n[10000] 이렇게 선언하는게 틀린 이유도 무엇인지 궁금합니다
안녕하세요 선생님! 간단한 질문인데요, LIS 요소의 크기를 구하는 건 dp와 lower_bound() (또는 binary search), 이렇게 두가지 방법을 이용할 수 있는 것으로 이해했는데요. 그럼 어떤 요소들이 있는지 trace하는 방법은 dp로밖에 구현을 못하는 걸까요? 즉, 무조건 O(N^2)이라는 시간복잡도를 가지는 건가요? 미리 감사드립니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. http://boj.kr/475f308856b14af58ad676f375a262f6 선생님 다음 코드와 같이 만들어서 예제는 통과했는데 계속 시간초과가 납니다 ㅠㅠ 어떤 점이 문제인지 잘 파악이 안됩니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 기존에 남겨주신 코드들 보면 합계를 이용해서 rt를 하나 증가시키고 lt도 합계에 따라 증가시키는 방식으로 이해습니다. 궁금한 부분이 lt에서 rt까지의 합이 아닌 lt와 rt 두 포인터의 합의 최소값으로 구현하려고 하니까 구현 방식이 greedy와 다를게 없어져서 어떻게 구현해야할지 잘 모르겠는데 어떻게 해야하나요? 현재 아래와 스니펫처럼 어떻게든 구현해보려고 하는데 구현하신 방식대로 하려고 하니 잘 풀리지 않습니다. for(int rt = 1; rt < arr.length; rt++){ sum = arr[lt] + arr[rt]; if(Math.abs(sum) < gap){ gap = Math.abs(sum); answer[0] = arr[lt]; answer[1] = arr[rt]; } while(lt + 1 < rt){ lt++; sum = arr[lt] + arr[rt]; if(Math.abs(sum) < gap){ gap = Math.abs(sum); answer[0] = arr[lt]; answer[1] = arr[rt]; } } lt++; }
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)); 혼자서 풀어봤을 때는 맵을 쓰지는 않았는데, 혹시 해쉬 구조에서 객체 대신 맵을 사용해서 얻을 수있는 이점이 어떤 게 있을까요? 또, 위와 같은 방법으로 풀었을 때 문제는 없을까요?
안녕하세요 선생님. 보통 dfs, bfs 문제를 풀때 입력 받은 값들을 인접행렬로 저장해서 풀지 인접리스트로 저장해서 풀지 할때마다 고민이 되는데 보통 코테에서는 어느 것이 더 효율적인가요? 값들이 밀집되어 있을때는 인접행렬, 값들이 서로 다 떨어져듬성 듬성 있을땐(?) 인접리스트가 더 낫다고 배웠긴 한데 문제에서 이를 판단할땐 쉽지가 않습니다..
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)); 늘 감사합니다. 제가 풀어본 문제 중에서는 처음으로 선생님의 풀이와 완전히 다른 방식이라 이런 방식은 어떨지 견해를 들어보고 싶습니다.
안녕하세요 선생님. 좋은 강의 잘 듣고 있습니다. 다름이 아니라 컴공과 학생이라 github를 만들어보고 싶은데 유튜브 강의를 봐도 어떻게 코드를 올리고 쉽게 조작하는지 쉽지가 않더라구요.. git를 다 설치하고 아이디는 만들었는데 레퍼토리를 올리고 조작하는게 너무 어렵네요:( 혹시 github에 대한 영상이나 방법은 따로 올리신게 없을까요? 항상 감사드립니다 선생님!
제 풀이는 다음과 같습니다. 저는 h높이를 100까지 안가고 최대값까지만 고려하였고 ret 도 0으로 초기화하고 h--로 풀었습니다. http://boj.kr/2607607c3851456ea3ccd3544dc3044d 이렇게 풀고 큰돌님 답지를 봤는데 높이에 대한 반복문 풀이가 달라서 이걸 어떻게 받아들이고 넘어가야 할지 몰라서 질문글을 올렸습니다. “다음에는 while문말고 답지처럼 for문으로 풀어야지” 라고 생각하고 넘어갈지 아님 “그냥 이렇게도 풀 수 있구나?” 라고 생각하고 다음에는 for이든 while이든 생각나는대로 풀면 될까요? 정답이란 게 없긴 하지만 뭔가 정석대로 안풀면 안될거 같아서 이렇게 질문을 올립니다.
tree.root.rt = new Node(3); tree객체에서 root를 참조하고, root 객체의 rt 변수의 값을 3으로 설정하는 것은 이해했습니다. 그런데, tree.root.rt.lt 는 rt변수에서 lt를 접근하는 건가요..?? 변수에서 변수를 참조하는 것이 잘 이해가 되지 않습니다. 감사합니다.
안녕하세요 큰돌님! 먼저 알고리즘 강의 너무 재밌게 잘 수강하고 있어 감사의 말씀 올립니다. 해설을 보기 전에 거의 유사하게 작성하였는데 질문이 있어 글 남깁니다 ㅎㅎ 1. 요금 계산하는 for문을 조금이나마 덜 돌게 하려고 mi와 mx를 추가하였는데 이렇게 풀어도 괜찮을까요? 2. 코드에서 혹시 더 개선할 부분이 있을까요? http://boj.kr/ad45fb739bc84838aadd154abf5f3ed7