묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
c++ 코드를 파이썬으로
안녕하세요.문득 든생각이 있습니다. c++도 공부는 하는데 시간이 좀 부족해서 수업을 들으면서 파이썬으로 최대한 매핑해서 코드를 짜보려고 합니다. 강사님 문제 풀이 로직(c++) 코드를 파이썬으로 옮기면 코딩테스트에서 시간 초과나 메모리 문제가 생길 수 있나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요 선생님 교안 공부하다가 ..
안녕하세요. 알고리즘 공부를 위해 강의를 구매했고 C++ 알고리즘 교안을 통해 공부 중입니다.교안을 보다보면 제 머리가 조금 부족해서 내용 이해가 정확히 안가는 부분도 있고, 내용이 적지 않다 보니 1주일 공부하다보면 앞에 내용이 기억나지않아 뒷 부분에서 이게 무슨 소리인가라는 생각이 자주 듭니다. 이럴 때, 기억나지않아도 적당히 이해하면서 교안을 뒤로 넘기며 계속 공부를 이어나가야 할지 앞에 내용을 다시 공부하고 진행해야 할 지 모르겠습니다. 교안을 완벽하게 숙지(이해, 암기)하고 강의를 듣고 공부를 해 나가야할지, 아니면 모든 내용이 기억나지 않고 완벽하게 숙지되지 않더라도 앞으로 나아가야할지 어느 방법을 추천하시는지 조언해주시면 감사하겠습니다. 감사합니다!
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
안녕하세요 이런 풀이도 괜찮을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.let input = `7 128 460 603 40 521 137 123`.split("\n"); let num = Number(input[0]); let arr = input[1].split(" "); function solution(arr) { let answer; let sum; let sumMax = 0; let maxNum = 0; for (let i = 0; i < num; i++) { sum = arr[i].split("").reduce((acc, cur) => { return Number(acc) + Number(cur); }, 0); if (sum > sumMax) { sumMax = sum; maxNum = arr[i]; answer = arr[i]; } if (sum === sumMax) { answer = Math.max(maxNum, arr[i]); } } return answer; } console.log(solution(arr));이런식으로 한번 풀어봤는데 이런 풀이도 괜찮을걸까요..!?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
c++ 설치관련문의
교안에서 윈도로 설치할 경우 DevC++을 추천한다고 했습니다. 제가 유니티를 전에 사용하면서 비줄얼스튜디오2022가 이미 설치가 되어있습니다. 이경우에서도 DevC++를 설치하는 것이 나을지 아니면 이미 있는 비주얼스튜디오2022로 사용해도 되는지 각각의 장단점을 문의드립니다.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
수들의 합
해당 코드는 강사님 풀이와 비교했을 때 어떤지 궁금합니다. N, M = map(int, input().split()) list = list(map(int, input().split())) cnt = 0 for i in range(N): sum = list[i] temp = i while True: if sum == M: cnt += 1 break if sum > M: break if temp == N - 1: break temp += 1 sum += list[temp] print(cnt)
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
자바스크립트에서는 항상 맨날 힙 구현해서 풀어야했는데..
실시간 정렬해야되는 문제들 보면 거의 무조건 힙구조도 같이 이용해야하는 문제들이여서..자바스크립트로 풀때는 최소 빨라도 3~4분정도는..요로코롬Min이나 Max 힙 구조 만드는데 소요해야하고,class MaxHeap { constructor() { this.heap = [null]; } push(value) { this.heap.push(value); let currentIndex = this.heap.length - 1; let parentIndex = Math.floor(currentIndex / 2); while (parentIndex !== 0 && value > this.heap[parentIndex]) { const temp = this.heap[parentIndex]; this.heap[parentIndex] = value; this.heap[currentIndex] = temp; currentIndex = parentIndex; parentIndex = Math.floor(currentIndex / 2); } } pop() { if (this.heap.length === 1) return; if (this.heap.length === 2) { return this.heap.pop(); } const returnValue = this.heap[1]; this.heap[1] = this.heap.pop(); let currentIndex = 1; let leftIndex = 2; let rightIndex = 3; while ( this.heap[currentIndex] < this.heap[leftIndex] || this.heap[currentIndex] < this.heap[rightIndex] ) { if (this.heap[leftIndex] < this.heap[rightIndex]) { const temp = this.heap[currentIndex]; this.heap[currentIndex] = this.heap[rightIndex]; this.heap[rightIndex] = temp; currentIndex = rightIndex; } else { const temp = this.heap[currentIndex]; this.heap[currentIndex] = this.heap[leftIndex]; this.heap[leftIndex] = temp; currentIndex = leftIndex; } leftIndex = currentIndex * 2; rightIndex = currentIndex * 2 + 1; } return returnValue; } } 심지어 문제 구조에서, 힙에 들어가야하는게 객체요소이면서, 객체의 어떤 Key 값에 따라서 실시간 정렬해야할 경우엔 여기서 또 out of index , key값 더 생각해서, class MinHeap { constructor() { this.heap = [null]; } isEmpty() { return this.heap.length === 1; } _swap(a, b) { [this.heap[a], this.heap[b]] = [this.heap[b], this.heap[a]]; } push(value) { this.heap.push(value); let currentIndex = this.heap.length - 1; let parentIndex = Math.floor(currentIndex / 2); // while (parentIndex !== 0 && this.heap[parentIndex].key > value.key) { this._swap(parentIndex, currentIndex); currentIndex = parentIndex; parentIndex = Math.floor(currentIndex / 2); } } pop() { if (this.isEmpty()) return; if (this.heap.length === 2) return this.heap.pop(); const returnValue = this.heap[1]; this.heap[1] = this.heap.pop(); let currentIndex = 1; let leftIndex = 2; let rightIndex = 3; while ( (this.heap[leftIndex] && this.heap[currentIndex].key > this.heap[leftIndex].key) || (this.heap[rightIndex] && this.heap[currentIndex].key > this.heap[rightIndex].key) ) { if (this.heap[rightIndex] === undefined) { this._swap(leftIndex, currentIndex); currentIndex = leftIndex; } else if (this.heap[rightIndex].key < this.heap[leftIndex].key) { this._swap(rightIndex, currentIndex); currentIndex = rightIndex; } else if (this.heap[rightIndex].key >= this.heap[leftIndex].key) { this._swap(leftIndex, currentIndex); currentIndex = leftIndex; } leftIndex = currentIndex * 2; rightIndex = currentIndex * 2 + 1; } return returnValue; } } 요로코롬 이렇게 힙구조 작성하는데만 4~5분 먹고, 그담 문제 풀이 본격적으로 시작할 수 있습니다..파이썬의 deque 같은경우는 자바스크립트에선 Queue 구조 1분. 먹고왜 사람들이 파이썬 코테로 많이 쓰는지 알겠네요..ㄷㄷ;;import heapq , 단 1초면 모듈 가져오고, 끝이네요.코테에서 import 모듈 제한 없다면 진짜 무조건 파이썬이네요 ;;
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
열부분 슬라이싱 질문
행부분을 temp = board[j][i+5]로 슬라이싱하셨는데열부분은 temp = board[j:j+5][i]로는 슬라이싱이 안되나요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
Math.max
안녕하세요 강사님궁금한 것이 있는데요마지막에 answer = Math.max(answer, cnt)는 처음부터 못 사는 경우를 생각해서 하는건가요??answer = cnt만 해도 그냥 답이 나와가지고 궁금해서 여쭤봅니다.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
시간복잡도 기준 질문
전 강의(수의 합)에서는 시간복잡도 때문에 for문 한번만 작성해야하고 어느문제는 그냥풀어도 되는건지 그 기준이 궁금합니다.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
두 리스트 합치기 문제 질문합니다.
while(p1<n and p2<n2): if arr1[p1] <= arr2[p2]: newArr.append(arr1[p1]) p1+=1 print(newArr)위 while문에서 and를 써야만 동작되는 이유가 있을까요?저는 문제를 풀 때 and가 아니라 or로 작성하여 에러가 발생하였습니다. 둘 중 하나만 도달하면 되는데 and로 쓰는 이유를 알 고 싶습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-H에서 질문
1-H에서 for (int i = 1; i <= n; i++) { cin >> temp; psum[i] = psum[i - 1] + temp; } 이 부분을 왜 해주는지 이해가 안가네요.. 문제 보면 첫번째 두번째 더하고 두번째 세번째 더하고...내림차순 한 다음 첫번째것만 빼오면 되는줄 알았는데 뭔가...답안 보면 복잡하네요..이해도 안가고..
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
for문을 한번더 도는것보다 변수를 2개 더 추가해서 하는게 메모리적으로 더 안좋을까요?
function solution2(arr) { let answer = Number.MIN_SAFE_INTEGER; let n = arr.length; let sum1=sum2=0; let sum3=sum4=0; for(let i = 0; i < n; i++) { sum1=sum2=0; for(let j = 0; j < n; j++) { sum1+=arr[i][j]; sum2+=arr[j][i]; // 대각선 줄 if (i === j) { sum3 += arr[i][j] } // 역 대각선 줄 if (j === (arr[i].length - i) - 1) { sum4 += arr[i][j] } } answer = Math.max(answer, sum1, sum2, sum3, sum4); } return answer; }위 방식으로하면 변수는 더 추가되서 메모리적으로 낭비이지만 만약 배열 데이터가 많다면 시간 복잡도상 2중 for문을 한번밖에 안쓴 위 코드가 유리한거같은데 평가 부탁드립니다.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
다른풀이법 / 무엇이 더 효율적인지 ?
저의 풀이입니다 제가 채점 프로그램을 사용할 수 없는 환경이라서 다른 테스트를 못해보았습니다 sum에 하나씩 더해 갈때 cnt 를 증가시키고 만약 더한 뒤에 money 보다 크다면 증가했던 cnt 를 다시 back 시키기 위해 -1 했습니다 sum == money 경우 전역변수 flag 를 True 하여 나머지 재귀함수들을 바로 종료시키도록 하였습니다 질문1) 괜찮은 풀이인가요? 그리고 전에 배운 그리디 알고리즘으로도 풀 수 있는 거 같은데 질문2) 어떤 풀이가 더 효율적인 풀이인가요? 강의 잘보고 있습니다 항상 친절한 답변 주셔서 감사합니다
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
안녕하세요! 코드 평가 부탁드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. function solution(m, arr) { let answer = 0, end = 0, sum = 0; for (let start = 0; start < arr.length; start++) { end = start + 1; sum += arr[start]; if (sum <= m) { answer++; } while (sum < m && end < arr.length) { sum += arr[end]; if (sum <= m) { answer++; end++; } } sum = 0; } return answer; } let a = [1, 3, 1, 2, 3]; console.log(solution(5, a));
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
큐 사용시 add(), remove()
Queue에 add() 메서드와 remove() 메서드를 사용할 수 있던데, 이걸 사용해도 되는지 궁금합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
string에서 "="과 "==" 과정이 궁금합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 큰돌님! 저는 기존에 다른 언어로 코딩테스트를 준비하다가 큰돌님 강의로 C++로 언어를 바꾸고 다시 공부를 하고 있습니다.자바에서는 String에 temp = s와 같이 작성하면 temp에 s의 주소값이 넘어가게 되고 temp를 어떻게 바꾸던 s도 함께 바뀌게 되어 어떤 로직이든 temp==s는 참이 되는데C++에서는 string 타입에서 =과 ==이 어떻게 동작하는지가 궁금합니다. 배열에서 배열이름을 주소값으로 사용하는 것처럼 string도 변수명이 첫요소의 주소값인가 생각했는데 코드가 동작하는걸 보면 아닌 것 같아서 어떻게 동작하는지 질문드리고싶습니다.좋은 강의와 자료를 제공해주셔서 감사합니다.
-
해결됨IT 기업 취업을 위한: 코딩테스트 혼자서 정복하기 (C/C++)
코딩테스트 공부법에 대한 질문
안녕하세요. 양질의 강의 제공해 주셔서 정말 감사합니다.강사님의 강의를 통해 배운 내용을 바탕으로 문제를 풀고 있는데 제가 공부하는 방식이 도움이 되는지, 너무 비효율적으로 공부하고 있는 것은 아닌지 싶어서 질문드립니다.저는 평소에 문제를 풀다가 막히는 문제가 있으면, 최대한 머리로 고민해 보다가 머리가 돌아가지 않는다 싶으면 종이에 써가면서 어떻게 풀 수 있을지 고민해 봅니다. 30분에서 1시간 정도 고민해 보는 것 같습니다.해결한 문제는 다른 코드와 제 코드를 비교해 보고 제가 짠 코드보다 다른 코드가 더 효율적이고 깔끔한 것 같다 싶으면 해당 코드를 노트에 정리해둡니다. 해결하지 못한 문제는 어떤 부분을 생각해 내지 못했는지를 답안이 되는 코드와 함께 노트에 정리해둡니다. 이렇게 정리한 코드들은 틈틈이 복기해 봅니다.이런 식으로 공부하는 게 맞는 것인지 답변 부탁드립니다.저번에 한 번 다른 질문을 남겼었는데 그 때 빠르게 답변 남겨주셔서 감사했습니다.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
말그대로 역수열 원리 그자체로 구현했는데 코딩테스트에서는 못쓸것같습니다
문제에서 사람이 처음 생각하는 그 원리 그자체로 구현했습니다.print 중간 중간에 계속 찍고, 오류 수정하고 , 찍고 오류 수정하고, 디버깅하고 수정하고 또 하고 수정하고,처음부터 완벽하게 하는거 if, for문 조건 틀리지않게 하는거 아니면,코딩테스트 시간적으로는(10분 15분 사이로는) 힘들것같습니다.풀이, 강의듣는데 코딩테스트에서는 저런 사고를 많이 늘려야할것같습니다. 많이 배우고 있습니다. 4일안으로 완강해보겠습니다
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
뒤집은 소수 / 런타임 에러 + 궁금증
안녕하세요 강사님예시 문제는 합격하는데 다른 4개의 테스트 케이스는 통과하지 못하고 있습니다.문제는 런타임에러가 뜨는데 왜 뜨는지 정확한 이유를 아무리 보아도 모르겠습니다...많이 더러운 코드지만 무엇이 문제인지 확인 한번 부탁 드리겠습니다...import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public String solution(String str) { String answer = ""; String[] arr = new StringBuilder(str).reverse().toString().split(" "); List<Integer> list = new ArrayList<>(); for (String s : arr) { int target = Integer.parseInt(s); if (target != 2 && target % 2 == 0) continue; if (target == 1) continue; boolean check = true; for (int j = 3; j <= Math.sqrt(target); j+=2) { if (target % j == 0) { check = false; break; } } if (check) list.add(target); } for (int i =list.size()-1; i >= 0; i--) { answer += list.get(i) + " "; } return answer; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int input1 = in.nextInt(); in.nextLine(); String str = in.nextLine(); Main main = new Main(); System.out.println(main.solution(str)); return; } }알아낸점저와 비슷한 사례를 겪는 분들을 질문창에서 발견하고 강사님이 적어두신 2번 케이스의 문제를 복사해서 적어보았는데 통과하였습니다.저는 split() 메서드를 이용해서 입력받은 문자열을 배열로 변경하는데 이때 문자열 맨 뒤에 공백이 존재하게 되면 런타임 에러가 발생 하는것을 확인했습니다. 아무래도 그부분 때문인것 같은데 맞다면 확인 한번 부탁드리겠습니다.변경코드를 수정하였습니다.import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public String solution(String[] arr) { String answer = ""; for (int i = 0; i < arr.length; i++) { String s = new StringBuilder(arr[i]).reverse().toString(); int target = Integer.parseInt(s); if (target != 2 && target % 2 == 0) continue; if (target == 1) continue; boolean check = isPrime(target); if (check) answer += target + " "; } return answer; } private boolean isPrime(int target) { for (int j = 3; j <= Math.sqrt(target); j+=2) { if (target % j == 0) { return false; } } return true; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int input1 = in.nextInt(); String[] arr = new String[input1]; for (int i = 0; i < input1; i++) { arr[i] = in.next(); } Main main = new Main(); System.out.println(main.solution(arr)); return; } } 이렇게 하니 해결되었습니다. 궁금증혹시 실제 코딩테스트 볼때도 split을 사용할때 요청값끝부분에 있는 공백의 존재 가능성도 염두해두고 사용을 해야하나요? 아니면 단순 이 사이트의 실수였을까요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
split 사용
function solution(s) { let answer = ""; let count = 0; for (let i = 0; i < s.length; i++) { if (s[i] === s[i + 1]) { count++; } else if (s[i] !== s[i + 1]) { answer += s[i] + (count + 1); count = 0; } } return answer.split("1").join(""); } let str = "KKHSSSSSSSE"; console.log(solution(str));강사님 코드가 거의 비슷한데 마지막에 1을 없애주기 위해서 split을 사용해서 1을 없애 주고 다시 문자열로 만들어주었는데, 이정도는 시간과 별로 상관이 없나요??