묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
11. 임시반장 정하기 런타임 에러 관련 질문 드립니다.
강사님 안녕하세요. 좋은 강의 잘 듣고 있습니다. 임시반장 정하기 문제에서 강사님이 작성해주신 코드와 동일하게 solution 메서드를 만들었다고 보이는데 런타임 에러로 나오는거 같습니다. 혹시 원인을 알 수 있을까요? 감사합니다. import java.util.*; public class Main { public int Solution(int n, int[][] array) { int answer=0, max=Integer.MIN_VALUE; for(int i=1; i <=n; i++) { int cnt = 0; for(int j=1; j<=n;j++) { for(int k=1; k<=5;k++) { if(array[i][k] == array[j][k]) { cnt++; break; } } } if(cnt>max) { max = cnt; answer = i; } } return answer; } public static void main(String[] args) { Scanner in=new Scanner(System.in); int n = in.nextInt(); Main T = new Main(); int[][] array = new int[n][n]; for(int i = 0; i < n ; i++) { for(int j = 0; j < n ; j++) { array[i][j] = in.nextInt(); } } System.out.println(T.Solution(n, array)); } }
-
해결됨코딩테스트 [ ALL IN ONE ]
딕셔너리를 활용한 two-sum 질문있습니다
기존코드def two_sum(nums, target): memo = {} for v in nums: memo[v] = 1 for v in nums: needed_number = target - v if needed_number in memo: return True return False기존 코드에서 첫번째 for문은 O(n)이고두번째 for문은 O(1)이 n번 실행되니까 최종적으로는 O(n)이 되어서 해당 알고리즘의 시간복잡도는 O(n)이되는데처음에 문제를 설명해주실때의 순서대로라면 4를 먼저넣고 target이 14니까 10이 있는지 확인해보고 없으니까 1을 넣고 13이없는지 확인해보고 없으니까 9를 넣고 5가 없으니까 7을 넣고 7이 없으니까 5를 넣고 9가 있으니까 true를 반환 이라고 생각을 했고 그렇게 로직을 짜면 아래와 같은 코드가 될것같습니다(제가 파이썬을 잘 몰라서 정확한지는 모르겠네요 ㅠㅠ)def two_sum(nums, target): memo = {} for v in nums: memo[v] = 1 needed_number = target - v if needed_number in memo: return True return False해당 코드에서는 첫번째 for문 내부의 시간복잡도가 전부다 O(1)이고 그걸 n번 반복하는것이니 O(n)이라는 최종적인 시간복잡도라고 생각을 하는게 맞을까요??만약에 아래에 짠 로직이 올바른 로직이라면위에 로직은 n번 연산하면서 dictionary에 넣고 후에 요소를 돌면서 답을 찾고아래로직은(코드가 맞다면) dictionary를 다 넣지 않더라도 중간에 값이 나오면 중간에 연산을 끝낼 수 있으니까 조금더 효율적이라고 생각을 했습니다제가 생각한 방식이 맞는지 그리고 이런 작은(?)효율성이 코딩테스트에서 의미있게 다가올지가 궁금합니다!
-
해결됨파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
deque 방식과 lt / rt while 문 방식의 차이
안녕하세요?강사님께서 영상에서는 deque 자료형으로 바로바로 pop 하는 방식으로 코드를 짜셨는데요강의 내용:arr.sort() arr = deque(arr) cnt = 0 while arr: if len(arr)==1: cnt += 1 break if arr[0]+arr[-1] > limit: arr.pop() cnt += 1 else: arr.popleft() arr.pop() cnt += 1 print(cnt) 그런데 비슷하다고 생각한 인덱스 이동 방식은 오답인 거 같습니다 arr.sort() lt = 0 rt = n - 1 while lt <= rt: if len(arr) == 1: cnt += 1 break sum = arr[lt] + arr[rt] if sum <= limit: cnt += 1 lt += 1 rt -= 1 else: cnt += 1 rt -= 1 # 맨 끝 가장 큰 수 pop print(cnt) 테스트 케이스는 강사님께서 댓글에 알려주신 8 14971 72 73 74 75 76 77 78 149로 돌려보니, 강의 내용은 5가 나오고 두번째 방식은 4가 나오네요? 근데 제가 이해가 딸려서 그런지 인덱스 이동하는 방식과 pop 방식의 차이가 잘 머리로 들어오지 않습니다..
-
미해결비전공자의 전공자 따라잡기 - 자료구조(with JavaScript)
최소힙의 결과값과 최대힙->최소힙 결과값이 다른게 맞나요?
최소 힙 insert#reheapUp(index) { // index 0은 root if (index > 0) { // 부모 노드가 root가 아니면 계속 비교 const parentIndex = Math.floor((index - 1) / 2); if (this.arr[index] < this.arr[parentIndex]) { // 값 바꾸기 const temp = this.arr[index]; this.arr[index] = this.arr[parentIndex]; this.arr[parentIndex] = temp; this.#reheapUp(parentIndex); } } } // O (log n) insert(value) { this.arr.push(value); this.#reheapUp(this.arr.length - 1); }const heap = new MinHeap(); // insert는 큰 값부터 넣고, root가 8이 되는지 확인 heap.insert(78); heap.insert(56); heap.insert(45); heap.insert(32); heap.insert(23); heap.insert(19); heap.insert(8); // [8, 32, 19, 78, 45, 56, 23] heap; 최대 힙 insert#reheapUp(index) { // index 0은 root if (index > 0) { // 부모 노드가 root가 아니면 계속 비교 const parentIndex = Math.floor((index - 1) / 2); if (this.arr[index] > this.arr[parentIndex]) { // 값 바꾸기 const temp = this.arr[index]; this.arr[index] = this.arr[parentIndex]; this.arr[parentIndex] = temp; this.#reheapUp(parentIndex); } } } // O (log n) insert(value) { this.arr.push(value); this.#reheapUp(this.arr.length - 1); }const heap = new MaxHeap(); // insert는 작은 값부터 넣고, root가 78이 되는지 확인 heap.insert(8); heap.insert(19); heap.insert(23); heap.insert(32); heap.insert(45); heap.insert(56); heap.insert(78); // [78, 32, 56, 8, 23, 19, 45] heap; 최대 힙 -> 최소 힙// 최소 힙 유지 함수 #heapifyMin(index) { // 수정, 삭제 const leftIndex = index * 2 + 1; const rightIndex = index * 2 + 2; const smallerIndex = (this.arr[leftIndex] || 0) < (this.arr[rightIndex] || 0) ? leftIndex : rightIndex; if (this.arr[index] > this.arr[smallerIndex]) { // 값 바꾸기 const temp = this.arr[index]; this.arr[index] = this.arr[smallerIndex]; this.arr[smallerIndex] = temp; // 재귀적으로 최소 힙 유지 this.#heapifyMin(smallerIndex); } } toMinHeap() { // O(1/2n) for (let i = Math.floor(this.arr.length / 2 - 1); i >= 0; i--) { this.#heapifyMin(i); } }const heap = new MaxHeap(); // insert는 작은 값부터 넣고, root가 78이 되는지 확인 heap.insert(8); heap.insert(19); heap.insert(23); heap.insert(32); heap.insert(45); heap.insert(56); heap.insert(78); // [78, 32, 56, 8, 23, 19, 45] heap.toMinHeap(); // [8, 23, 19, 32, 78, 56, 45] heap; // 최소 힙 insert 결과 값 [8, 32, 19, 78, 45, 56, 23] // 최대 힙 insert 결과 값 [78, 32, 56, 8, 23, 19, 45] // 최대 힙 -> 최소 힙 결과 값 [8, 23, 19, 32, 78, 56, 45] 최소힙 insert 결과 값과 최대 힙 -> 최소 힙 결과 값은 서로 다른데 최소 힙의 조건은 아래가 크고, 위가 작다. 라고 하셨으니 결과 값은 달라도 최소 힙의 조건이 맞으니 최대 힙 -> 최소 힙 변환 코드가 맞는걸까요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이렇게 풀어도 괜찮을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
함수 만들기
선생님 마지막 줄의 return True에서 else를 쓰고 안 쓰고는 왜 상관 없는 건가요? def isPrime(x): for i in range(2, x): if x%i==0: return False return True
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드리뷰 부탁드립니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 아래와 같이 풀어도 될까요 ?아래와 같은 경우에 시간복잡도는 어떻게 될까요 ...?const solution = (k, arr) => { let answer = Array.from({ length: k }, () => 0); for (let i = 0; i < arr.length; i++) { if (!answer.includes(arr[i])) { answer.unshift(arr[i]); answer.pop(); } else { let tmp = answer.filter((v) => v !== arr[i]); tmp.unshift(arr[i]); answer = tmp; } } return answer; }; console.log(solution(5, [1, 2, 3, 2, 6, 2, 3, 5, 7]));
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
리스트와 내장함수
enumerate 함수에 대해 질문 있습니다. a=[23, 12, 36, 53, 19] for x in enumerate(a): print(x)print() for x in enumerate(a): print(x[0], x[1])print() for index, value in enumerate(a): print(index, value)print() 똑같은 enumerate함수를 썼는데왜 첫번째 for문에서만 튜플 형태로 출력이 되고 두번째, 세번째에선 그냥 값만 출력이 되는 건가요?
-
해결됨[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편
백준 2606
안녕하세요 선생님! 복습하다가 의문점이 생겨 질문드립니다.from collections import defaultdict N = int(input()) T = int(input()) dic = defaultdict(list) discovered = [] for _ in range(T): a, b = map(int, input().split()) dic[a].append(b) dic[b].append(a) def dfs(node): global dic, discovered discovered.append(node) for n in dic[node]: if n not in discovered: dfs(n) return dfs(1) print(len(discovered) - 1)이 코드에서 dic[b].append(a)를 지워도 문제 해결에는 영향이 없어 보이는데, 백준에 제출하면 틀린 답으로 나옵니다.즉, 그래프를 양방향이 아닌 단방향으로 설정해도 문제 없지 않나요..?
-
해결됨코딩테스트 [ ALL IN ONE ]
2차코테 관련해서 질문드립니다
코테를 볼때 1차 2차 나눠서 보는 기업이 있더라구요 (대표적으로 카카오)근데 1차는 알고리즘이고 2차는 api 통신을 해야하는 코테로 진행한다고 봤는데 이렇게 api통신을 이용해 코테를 보는 기업이 많을까요? 제가 찾을때는 카카오만 보여서 질문드렸습니다또 sql 코테를 보는곳도있다고 들었는데 이것도 많이 보는지 여쭤보고 싶습니다
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
조건문 관련 질문
선생님 조건문에서 i+=i 는 써야 하는 위치가 정해져 있는 건가요?왠지 쓰는 위치가 애매하게 느껴집니다..print 다음으로 마지막에 쓰면 되는 건가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-E 왜 틀렸는지 궁금합니다.
자바로 질문해도 괜찮을까요? 만약에 된다면저는 자바로 코테를 준비해서 자바로 풀었습니다.46퍼에서 계속 틀렸다고 나오는데 강의랑 같은 방법으로 답안을 적었다고 생각합니다.제가 무엇을 잘못했는지 궁금합니다.import java.util.*; import java.io.*; public class P12869 { static int n, ret = Integer.MAX_VALUE; static int[][][] scv = new int[61][61][61]; static int[] input = new int[3]; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); for(int i=0; i<n; i++) { input[i] = Integer.parseInt(st.nextToken()); } int[][] dire = new int[][]{{-9,-3,-1},{-9,-1,-3}, {-3,-9,-1},{-3,-1,-9}, {-1,-3,-9},{-1,-9,-2}}; Queue<int[]> q = new LinkedList<>(); q.add(input); scv[input[0]][input[1]][input[2]] = 1; while(!q.isEmpty()) { int[] cur = q.poll(); if(cur[0]==0&&cur[1]==0&&cur[2]==0) break; for(int i=0; i<6; i++) { int na = (cur[0] + dire[i][0])<0? 0 : cur[0] + dire[i][0]; int nb = (cur[1] + dire[i][1])<0? 0 : cur[1] + dire[i][1]; int nc = (cur[2] + dire[i][2])<0? 0 : cur[2] + dire[i][2]; if(scv[na][nb][nc] != 0) continue; scv[na][nb][nc] = scv[cur[0]][cur[1]][cur[2]] + 1; q.add(new int[]{na, nb, nc}); } } System.out.println(scv[0][0][0]-1); } }
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
제 실력이 미흡해서 그런지 푸는데 엄청 오래 걸렸습니다...
포기 하지 않고 끝까지 풀어서 정답을 맞추게 된것 같습니다.문제가 생각 보다 어려운것 같습니다 ㅠㅠfunction solution(arr) { let answer = []; let mento = []; const maxNum = []; for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr[i].length; j++) { const index = arr[i].indexOf(arr[0][j]); for (let k = 0; k < index; k++) { maxNum.push([arr[0][j], arr[i][k]]); } for (let z = 0; z < arr[i].length; z++) { if (j < z) { mento.push([arr[i][j], arr[i][z]]); } } } } for (p = 0; p < maxNum.length; p++) { mento = mento.filter( (t) => !(maxNum[p][0] === t[0] && maxNum[p][1] === t[1]) ); } answer = new Set(mento.map((v) => v.join(""))); return [...answer].length; } const question = [ [3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2], ]; console.log(solution(question));좋은 코드는 아닌것 같지만, 최대한 노력을 했습니다const question = [ [3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2], ]; console.log(solution(question)); let arr = [[1, 2, 3, 4, 5]]; console.log(solution(arr)); let arr2 = [ [19, 15, 4, 17, 12, 18, 6, 3, 11, 14, 1, 8, 13, 9, 2, 20, 5, 16, 10, 7], [5, 20, 18, 17, 14, 11, 19, 3, 10, 16, 6, 8, 13, 9, 2, 12, 4, 7, 1, 15], ]; console.log(solution(arr2));다른 답들도 다 정답은 나옵니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-G 맞왜틀 질문있습니다.
https://www.acmicpc.net/source/70317041 문제에서 제시된 입력 값을 넣으면 올바른 출력값이 나오는데, 틀렸다고 나오니 답답합니다.어느 부분이 틀렸는지 잘 모르겠습니다.
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
백준 11720 숫자의 합 질문 있습니다
문제를 보면입력첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.라고 조건이 주어지는데 강의의 풀이를 보면 숫자의 개수를 N개로 제한하는 부분이 없고 실행해보면 N개 이상 또는 이하의 숫자가 들어가도 상관이 없이 실행되는데 보통 코테에서도 이런식으로 제한에 러프하게 코딩해도 상관이 없는 건가요?아니면 문제에 제한이 있어서 코딩에서는 제한을 따로 두지않는건가요??
-
해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
안녕하세요 공부 방법 문의 드립니다.
현재 제 상황은 강사님께서 설명해주시는 내용은 모두 이해가 되는 상태입니다!!일단은 강사님이 말씀해주신대로 복습 3 / 진도 7 비율로 강의 전체를 2~3번 정도 반복해서 본 뒤에 혼자서 문제를 깊이있게 풀어보는 식으로 공부를 하는데 이것도 괜찮은 방법일까요??
-
미해결입문자를 위한 코딩테스트 핵심(이론과 문제풀이) [Python]
nums 조건오류인가요?
문제에 고정된 숫자는 유일하다고 나와있는데, 2번 case의 nums에 3도 index가 3이고, 4도 index가 4라서 고정된 숫자가 2개인데 nums가 잘못된건가요?
-
해결됨코딩테스트 [ ALL IN ONE ]
노션 링크 좀 보내주세요
노션 공유 요청 드리고 24시간 기다렸는데.......노션에 어떻게 들어가나요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
점화식을 발견하기 위해서 규칙을 찾아봐야 하나요?
안녕하세요. 이 문제를 풀려면,점화식을 유추하기 위해서 입력예제 1을 활용해서 직접 dy 배열을 그려보고 1원 2원 5원 동전들을 활용하여 최소 몇개씩 필요한지 직접 써내려가면서 규칙을 찾아내는 순서로 푸는게 맞는 방법인가요? 강의에서는 선 규칙 찾기, 후 유추의 방식으로 설명하지 않으시는 것으로 생각되어 질문드립니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
포인터 사이즈 관련
안녕하세요 강의 수강 중에 궁금한 점이 있어 문의 남깁니다. 6분 34초를 보면 포인터의 사이즈는 8바이트라고 나오는데, 그 전에 나온 포인터 값을 보면 16진수 12자리 값이어서 6바이트 크기인 것으로 보입니다. 이 부분에서 왜 차이가 발생하는지 궁금합니다. 추가적인 질문이 있습니다. int가 4바이트고 int *가 8바이트면 메모리 효율성에서 매우 비효율 적인 것이 맞나요?물론 포인터가 매개변수 호출 등에서 장점이 있긴 하지만, 효율성 부분에서 안좋은 것 아닌지 하는 궁금증이 생겨서 여쭤봅니다. 항상 좋은 강의 감사합니다.