묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2792번 보석상자 질문있습니다!
안녕하세요, 선생님 ! 2792번 선생님 코드에 질문이 있어 질문 남깁니다.check()에서 return n>=num이 약간 이해가 안됩니다.처음 저는 n>num이라고 생각했었습니다. n=num이 될 떄의 값이 최적해 겠구나 생각했었습니다.아니면 혹은 n>num일 떄도 정답이 될 수 있어서 그런 것 일까요?!?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-B 시간복잡도
http://boj.kr/efeea39f5e6946e3a9982024980b4089이 코드의 최악의 시간복잡도를 board가 모두 'L' 인 경우에 n*m*bfs--->n*m*n*m이라고 생각했는데 맞게 계산할 것인가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 108p insert, erase
안녕하세요 🙂 큰돌님교안 108p에 있는 예제코드를 제가 insert와 erase를 이해하기 위해서 아래와 같이 변경하였는데요.#include <bits/stdc++.h> using namespace std; list<int> a; void print(list<int> a) { for (auto it : a) cout << it << " "; cout << '\n'; } int main() { for (int i = 1; i <= 3; i++) a.push_back(i); // a = 1 2 3 for (int i = 1; i <= 3; i++) a.push_front(i); // a = 3 2 1 1 2 3 auto it = a.begin(); it++; a.insert(it, 1000); // 3 1000 2 1 1 2 3 a.insert(it, 2000); // 3 1000 2000 2 1 1 2 3 print(a); it = a.begin(); it++; cout << "*it : " << *it << '\n'; a.erase(it); print(a); cout << "*it : " << *it << '\n'; a.pop_front(); a.pop_back(); print(a); cout << a.front() << " : " << a.back() << '\n'; a.clear(); return 0; }다음과 같이 변경해서 출력하면,3 1000 2000 2 1 1 2 3*it : 10003 2000 2 1 1 2 3*it : 22000 2 1 1 22000 : 2이렇게 나오는데, insert와 erase 메서드 모두 매개변수로 전달받은 iterator에다가 각각의 기능을 실행한 뒤 그 다음 위치(그 다음 인덱스)를 가리키도록 바꿔주는 걸까요?제 예상으로는 출력의 두 번째 *it 이 2000으로 나올 것으로 예상했는데, 2가 나와서a.erase(it);를 했을 때, it이 인덱스 1을 가리켜서 1000을 지우고 난 뒤, 그 다음 인덱스인 2를 가리키게 돼서 2를 가리키게 된 것으로 이해하였는데 맞을까요??마찬가지로 위의 insert도 인덱스 1 위치에서 삽입을 한 뒤, it은 인덱스 2를 가리키게 되고, 또 insert 해서 마지막엔 it이 인덱스 3을 가리키는 로직으로 이해하였습니다! 혹시 이러한 로직이 맞다면, list만 이런 것인지 다른 자료구조의 insert도 이런지 궁금합니다!감사합니다.
-
해결됨Do it! 알고리즘 코딩테스트 with C++
백준 1722 교재 81 질문
해당 문제를 푸는 알고리즘에 대해 더 자세한 설명이 필요할 것 같습니다.K번째 순열 출력할때, 왜 k와 (n-1)!를 비교하는지 이해가되지 않습니다.
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
연속부분수열
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public int solution(int n, int m, int arr[]) { int answer = 0; int sum = 0; int lt = 0; int rt = 1; // 초기 합 설정 sum += arr[lt] + arr[rt]; while (rt < n - 1) { if (sum < m) { sum += arr[++rt]; } else if (sum == m) { answer++; sum -= arr[lt++]; } else { sum -= arr[lt++]; } } // while문에서 rt가 마지막 인덱스일 때 합은 검증을 못해서 검증 로직 추가 if (sum == m) answer++; return answer; } public static void main(String[] args) { Main T = new Main(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int arr[] = new int[n]; for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } System.out.println(T.solution(n, m, arr)); } }이 코드가 효율적인 코드인지 궁금해서 질문드립니다!!
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
혼자 풀어봤는데요...
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 ] 이렇게 출력되는데 왜 숫자가 다르게 나오는 건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 84P sort(), comp 관련 질문
교안 84p 코드입니다#include<bits/stdc++.h> using namespace std; vector<pair<int, int>> v; bool cmp(pair<int, int> a, pair<int, int> b){ return a.first > b.first; } int main(){ for(int i = 10; i >= 1; i--){ v.push_back({i, 10 - i}); } sort(v.begin(), v.end(), cmp); for(auto it : v) cout << it.first << " : " << it.second << "\n"; return 0; }sort()함수 동작과정이 머리로는 생각이 안나서 검색해보니 퀵정렬 방식으로 동작하는거 까지는 알았습니다근데 cmp가 들어가면서 어떻게 동작되는지는 구조가 안떠오르는거 같습니다정리하자면 bool cmp()함수가 벡터 v에서 어떻게 동작하는지,return a.first > b.first가 뭐를 의미하는지첫질문이라 질문이 명확하지 않을수도 있을거 같습니다 ㅠㅠ
-
해결됨글로벌 개발자로 성장하는 < 코딩 실무 영어 /> 마스터 클래스
7분 50초 두번째 예제 질문입니다.
사소한 차이같은데 해석이 "서버에서"보다는 "서버에" 또는 "서버로부터"가 맞지 않나 생각이 듭니다. 여러가지 상황이 있겠지만 해석부분만 봤을때 떠오르는 첫번째 상황은 API 호출이 뭔가 모바일 기기나 브라우져가 아니라 서버에서 API 콜이 일어나는 상황처럼 생각되어지는...? 혹시 제가 착각한거일까요?
-
해결됨글로벌 개발자로 성장하는 < 코딩 실무 영어 /> 마스터 클래스
6분 47초에 Build 첫번째 예제 해석이 제대로 된건가요?
We are building a program that utilizes the latest tech stacks.이 문장에 대한 해석으로 "우리는 최신 기술 스택을 활용해 프로그램을 빌드하고 있습니다."라고 되어있는데,"우리는 최신 기술 스택을 활용하는 프로그램을 빌드하고있습니다."가 올바른 해석 아닌가요? a program that utilizes 니까 프로그램이 최신 기술 스택을 활용하고 있는걸로 봐야하는게 아닌지요...?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
벡터 구조체 이터레이터 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <bits/stdc++.h> using namespace std; struct Point { int y, x; }; bool cmp(const Point &a, const Point &b) { return a.x > b.x; } vector<Point> v; int main() { for (int i = 10; i >= 1; i--) { v.push_back({i, 10 - i}); } sort(v.begin(), v.end(), cmp); for (auto it : v) cout << it.y << " : " << it.x << "\n"; return 0; /* 1:9 2:8 3:7 4:6 5:5 6:4 7:3 8:2 9:1 10 : 0 */ } 질문드립니다해당 vector는 Point를 기반으로 만들어진 벡터임을 알겠는데v.begin()은 이터레이터를 반환하잖아요??(주소값 반환)*v.begin()로 주소안의 값을 확인하려했는데 되지 않아아마 struct 변수가 2개라 무엇을 기준삼지 않아 오류가 나는거같은데혹시 값 반환하는 방법이 있을까요?제가 이해한 내용이 틀렸다면 어떤식으로 이해해야하나요??
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
[5강 재귀] 3번 상담 문제 질문드립니다.
안녕하세요, 강의 너무 잘 듣고 있습니다.5강 최적화 강의의 3번 상담이라는 문제를 푸는데, 제공해주신 답변과 제가 작성한 코드에 차이가 있어 질문드립니다. [모범답안]def recur(idx, result): global answer if idx > n: if idx > n+1: return answer = max(answer, result) return recur(idx + table[idx][0], result + table[idx][1]) recur(idx + 1, result) n = int(input()) table = [[] for _ in range(n+1)] for i in range(n): a, b = map(int, input().split()) table[i+1] = [a, b] # print(table) answer = 0 recur(1, 0) print(answer)[제가 작성한 코드]# 14501 import sys sys.stdin = open('/Desktop/dev/BackJoon/5강_최적화/3_상담.txt','r') input = sys.stdin.readline N = int(input()) arr = [list(map(int, input().split())) for _ in range(N)] def recur(idx, price): global ans if idx >= N: # 배열의 마지막 인덱스를 지나가는 것은 무시 return if idx == N-1: # 배열의 마지막 인덱스 ans = max(ans, price) return recur(idx+arr[idx][0], price+arr[idx][1]) recur(idx+1, price) ans = 0 recur(0,0) print(ans)모범답안과 종료조건이 다른 것을 확인했습니다.제가 생각했을 때, 배열의 마지막 인덱스 (N-1)에서도 하루 짜리 일을 할 수도 있기 때문에 recur를 한번 더 돌수 있고 그 다음 인덱스 N 시점에서 종료되어야 한다고 생각해서 코드를 작성했습니다.혹시 제가 잘못 생각하고 있는 부분이 있을까요? 또한, 제공해주신 답변은table을 N+1의 길이로 생성recur(1,0)로 시작하고 있는데 해당 문제는 꼭 이렇게 접근해야 되는 것인가요? 미리 감사드립니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
강사님과 조금 다른방식으로 풀었는데 왜 틀릴까요??
저는 강사님과는 반대로배열을 1로 다 채운다음받은 정사각형 만큼 0으로 바꾸었는데요어디서 잘못되어서 문제가 풀리지않을까요? ㅠㅠ #include <bits/stdc++.h> using namespace std; #define y1 aaaa int adj[104][104], visited [104][104]; vector<int> v; int n,m,k,x,y,nx,ny,res,x1,x2,y1,y2; const int dy[] = {-1, 0, 1, 0}; const int dx[] = {0, 1, 0, -1}; int dfs(int y,int x){ visited[y][x]= 1; int cnt=1; for(int i=0;i<4;i++){ ny = y +dy[i]; nx = x +dx[i]; if(nx<0||ny<0||ny>=m||nx>=n)continue; if(visited[ny][nx]==0 && adj[ny][nx]==1){ cnt+=dfs(ny,nx); }else{ continue; } } return cnt; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> m >> n >> k; fill(&adj[0][0],&adj[0][0]+m*n,1); for(int i=0;i<k;i++){ cin >> x1 >> y1 >> x2 >>y2; for(int x = x1;x<x2;x++){ for(int y = y1; y<y2; y++){ adj[y][x]=0; } } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(visited[i][j]==0 && adj[i][j]==1){ res++; v.push_back(dfs(i,j)); } } } sort(v.begin(),v.end()); cout << res << endl; for(auto z: v){ cout << z << endl; } return 0; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 16페이지
m2 맥북에어 사용자인데cd /Library/Developer/CommandLineTools/usr/include로 해서 들어가는 거까진 했는데여기서 mkdir bits를 하니 permission denied 가 떠서 접근권한 문제인거 같은데 어떤거를 변경해야 할 지 몰라서 질문합니다.
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
10. 마구간 정하기 [ 비슷하지만 다른 해답] 이래도 맞게 푼 걸까요??
채점사이트에서 출력은 "첫 줄에 가장 가까운 두 말의 최대 거리를 출력하세요." 라고 되어 있었습니다.제 생각대로라면 말들이 여러마리니까 가장 가까운 말들의 거리가 말들마다 다를수도 있겠다는 생각이 들어. 최대거리를 구하기 위해 코드를 조금 다르게 쳤습니다. 채점사이트에서는 정답처리 되었는데 확신이 안들어서 이 방식대로 풀어도 되는지 피드백주세요. 또한, 제가 한 방식과 원래 풀이가 어떤 차이가 있는지 궁금합니다.첨부1. 원래 풀이, 내가 생각한 풀이2. 문제 전체 소스코드 *강의 풀이 방식 count()public int count(int[]arr, int distance){ int ep=0, cnt=1; for(int i=1; i<arr.length; i++){ //배치가능 if(arr[i]-arr[ep] >= distance){ cnt++; ep=i; } } return cnt; }*내가 푼 방식 count()public int[] count(int[]arr, int distance){ int [] res = new int[2]; int ep=0, cnt=1; int min = Integer.MAX_VALUE; for(int i=1; i<arr.length; i++){ //배치가능 if(arr[i]-arr[ep] >= distance){ cnt++; min = Math.min(min,arr[i]-arr[ep]); // 말들의 최소거리 ep=i; } } res[0] = cnt; // distance로 배치되는 말의 수 res[1] = min; // 말들의 최소 거리 return res; }*강의 풀이 방식 solution()내부 이진탐색 while문while (lt<=rt){ int mid = (lt+rt) / 2; //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다. if(count(arr,mid) >= m){ // mid : 말들의 최소거리 lt = mid+1; answer = mid; } else rt = mid-1; }*내가 푼 solution()내부 이진탐색 while문while (lt<=rt){ int mid = (lt+rt) / 2; int res[] = count(arr,mid); //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다. if(res[0] >= m){ // mid : 말들의 최소거리 lt = mid+1; answer = res[1]; // answer = mid 가 아닌 count메소드에서 계산한 말들의 최소거리를 넣어준다. //(말들이 여러마리일때 가장 가까운말의 최대거리를 구하라고 문제에 명시되어있어서) } else rt = mid-1; } 전체 소스코드import java.util.*; public class Main { public int[] count(int[]arr, int distance){ int [] res = new int[2]; int ep=0, cnt=1; int min = Integer.MAX_VALUE; for(int i=1; i<arr.length; i++){ //배치가능 if(arr[i]-arr[ep] >= distance){ cnt++; min = Math.min(min,arr[i]-arr[ep]); // 말들의 최소거리 ep=i; } } res[0] = cnt; // distance로 배치되는 말의 수 res[1] = min; // 말들의 최소 거리 return res; } public int solution(int n ,int m, int[] arr){ int answer = 0; Arrays.sort(arr); int lt = 1; int rt = arr[n-1]-arr[0]; //arr[arr.length-1]로 끝내도 큰 차이 없음 while (lt<=rt){ int mid = (lt+rt) / 2; int res[] = count(arr,mid); //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다. if(res[0] >= m){ // mid : 말들의 최소거리 lt = mid+1; answer = res[1]; // answer = mid 가 아닌 count메소드에서 계산한 말들의 최소거리를 넣어준다. //(말들이 여러마리일때 가장 가까운말의 최대거리를 구하라고 문제에 명시되어있어서) } else rt = mid-1; } return answer; } public static void main(String[] args) { Main M = new Main(); Scanner kb = new Scanner(System.in); int n = kb.nextInt(); int m = kb.nextInt(); int [] arr = new int [n]; for(int i=0;i<n;i++)arr[i]= kb.nextInt(); System.out.print(M.solution(n,m,arr)); } }
-
해결됨코딩테스트 [ ALL IN ONE ]
강의를 다 듣고나서 문제는 어떤걸 푸는 것이 좋은가요?
문제를 풀 수 있는 대표적인 플랫폼을 뽑아보자면Leetcode프로그래머스백준이렇게 있는 것 같은데 강의를 다 듣고 기업 코테를 대비하기 위해서는 어떤 곳의 문제를 풀어보면 좋을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6-B 질문있습니다.
http://boj.kr/28d3e04e1fe9450c8b2adb485cb92e0c위처럼 이진탐색을 재귀로 구현하여 풀었는데 지피티 + 지니 다 써도 어디에서 예외가 발생하여 틀리는지 모르겠습니다..강사님 어디가 틀린것이고 자신이 짠 코드가 어디가 잘못됬는지 잘 모르겠을 때 어떻게 분석할 수 있는지도 궁금합니다..
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-D 반례 질문드립니다.
안녕하세요 선생님. 예제와 커뮤니티의 반례들은 모두 통과하는데, 백준 2%에서 오답으로 처리되어 질문드립니다.불이 시작되는 부분부터 BFS를 통해 표시를 해두고, J를 dfs로 움직이게 하는 로직으로 구현했습니다. http://boj.kr/8202d9f54d6b45e489a6888088d047e1
-
해결됨[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편
다음강의
언제나오나요? DP 강의 보고싶네여..
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6-K 문제는 반드시 역추적하는 방법으로만 풀 수 있나요?
이중 백터를 만들어서 수열을 저장하는 저장하는 방법을 사용했는데.. 정답은 잘 나오는 거 같은데 메모리 초과가 뜹니다 ㅠㅠ 이 코드를 개선하여 통과하기는 어려울까요?다른 풀이들도 보니 역추적 방법으로만 풀더라구요 시험이라고 생각하면, 역추적 아이디어를 번뜩 떠올리기는 힘들 수도 있다는 생각도 드네요.. #include <bits/stdc++.h> using namespace std; int N, tmp, cnt; vector<int> v; vector<vector<int>> answer(1000001); int binary_search(int num){ long low = 0, high = v.size() - 1; while(low <= high){ long mid = (low + high) / 2; if(v[mid] == num){ return mid; } else if(v[mid] >= num){ // 배열의 값이 더 크다. 줄여야 한다 high = mid - 1; } else{ // 배열의 값이 더 작다. 늘려야 한다 low = mid + 1; } } return low; // 배열보다 이상인 인덱스 리턴 } int main() { ios_base:: sync_with_stdio(false); cin.tie (NULL); cout.tie (NULL); cin >> N; for(int i = 0; i < N; i++){ cin >> tmp; if(v.empty()){ v.push_back(tmp); answer[0].push_back(tmp); continue; } if(v.back() < tmp){ v.push_back(tmp); cnt++; if(i > 0){ answer[cnt] = answer[cnt-1]; answer[cnt].push_back(tmp); } } else if(v.back() > tmp){ int idx = binary_search(tmp); v[idx] = tmp; if(idx > 0){ answer[idx] = answer[idx-1]; answer[idx].push_back(tmp); } else{ answer[0].clear(); answer[0].push_back(tmp); } } } cout << v.size() << "\n"; for(int i = 0; i < answer[v.size()-1].size(); i++){ cout << answer[v.size()-1][i] << " "; } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-I 숨바꼭질5 26번 라인 visited 값 할당 부분 질문 있습니다.
선생님 안녕하세요 !숨바꼭질 5번 26번 라인에 질문이 한 가지 있습니다. 기존에 올라온 질문들을 보면서 visited를 2차원 배열에 처리하여 홀/짝을 구분해야 한다는 것과 qSize를 활용하는 로직은 이해가 됐습니다. 그런데 26라인의 부분이 이해가 잘 되지 않습니다.visited[turn % 2][nx] = visited[(turn + 1) % 2][x] + 1; 왜 (turn+1)%2 + 1 을 기준으로 turn%2에 값을 할당하는지 잘 모르겠습니다.bfs 로직에서 visited[next]에 값을 할당 할 때 here을 기준으로 +1을 하여 next를 할당하는데 (turn+1)%2 + 1을 기준으로 할당한 것이 잘 이해가 안 됩니다. 항상 감사합니다.새해 복 많이 받으세요!