묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
if mid>=maxx and Count(mid)<=m:
강의 영상에선 if Count(mid)<=m: 조건만 사용하셨는데 내려 받은 파일을 보면 mid>=maxx라는 조건도 붙이셨더라구요mid>=maxx 조건은 어떤 걸 위한 건가요??신경 안 써도 괜찮을까요?
-
해결됨파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
제가 질문을 잘 이해를 못하는지
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1부터 100까지의 자연수 중에 3장을 뽑아서 그 경우의 수 중에서 k번째로 큰 합산을 구하는 거라고 이해를 했습니다. 그래서 먼저 중복을 제거해서 내림차순으로 정렬후에,k번째로 큰 합산이니까 0, 1 번째 합산을 빼놓고 2번째 인덱스를 시작기준으로 k번째의 원소의 합을 더하면 되는게 아닌지 질문드립니다. import sys sys.stdin=open('input.txt', 'rt') n, k = map(int, input().split()) arr = list(map(int, input().split())) distinct_arr = list(set(arr)) distinct_arr.sort(reverse=True) print(k) print(distinct_arr) result = int(distinct_arr[0])+int(distinct_arr[1])+int(distinct_arr[k+1]) print(result)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
참조에 의한 호출 질문합니다.
선생님의 코드를 기반으로, struct를 사용하지 않고 구현하려고 합니다.move 함수의 인자로 배열을 참조로 전달하고자 했습니다.void _move(int arr[24][24]) { int temp[24][24]; for(int i = 0; i < n; i++){ int c = -1, d = 0; for(int j = 0; j < n; j++){ if(arr[i][j] == 0) continue; if(d && arr[i][j] == temp[i][c]) temp[i][c] *= 2, d = 0; else temp[i][++c] = arr[i][j], d = 1; } for(c++; c < n; c++) temp[i][c] = 0; } memcpy(arr, temp, sizeof(arr)); }이런 식으로 코드를 짜봤는데 memcpy 에서 에러가 발생합니다.참조에 의한 호출로 인해 에러가 발생한 걸까요?이 에러를 어떻게 해결할 수 있을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-D 질문있습니다.
안녕하세요 큰돌님! 수업 내용대로 다시 풀이해서 제출했는데 컴파일 에러가 떠서 질문드립니다ㅠ.ㅠreverse함수의 B앞에 공백을 없애니 컴파일 에러는 사라졌는데, 혹시 오류가 난 이유를 알 수 있을까요...? #include <bits/stdc++.h> using namespace std; string A, B; int result; int main(){ cin >> A ; B = A; //reverse는 원본배열에 영향을 주므로 미리 B에 넣어서 reverse하기 reverse(B.begin(), B.end()); if(A == B) result = 1; else result = 0; cout << result << "\n"; return 0; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6주차_개념 강의 질문
개념 강의에서 2792_보석상자 문제 중 check 함수의 기능을 이해 못했습니다. check함수의 기능이 무엇인지 설명해주실 수 있나요? check 리턴 값이 1이면 왼쪽 부분 탐색, 0이면 오른쪽 부분 탐색을 하게끔 구현하신건가요? 제가 생각한 check 함수의 기능은 다음과 같습니다.//현재 설정된 mid 값을 기준으로 보석을 학생들에게 나눠주었을 때, 몇명에게 나눠줄 수 있는지 num으로 측정 bool check(ll mid){ll num=0; // 그룹 크기 담을 변수for(int i=0; i<m; i++){num+=a[i]/mid; // mid 값으로 나눠진 몫, 보석의 총 그룹 수if(a[i]%mid) num++;// 나머지 있으면 추가 +1}return n>=num; -> 이 리턴 값의 의미를 모르겠습니다. 챗gpt로는 가장 많은 보석을 가진 학생의 보석 수가 n 이하인지를 판단하는 것 이라고 나오네요.. 왜 이런 값을 리턴하는지 궁금합니다.}
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
시간복잡도가 궁금합니다.
해당 코드에서는 말 4개와 주사위 수 10개를 완탐해서 구했는데요, 이는 4^10으로 약 100만의 시간 복잡도를 갖으리라 생각했습니다.#include <bits/stdc++.h> using namespace std; int a=0; void func(vector<int> v, int n) { ++a; if (n == 10) { for (auto i : v) cout << i << ","; cout << endl; return; } for (int i=0; i<4; ++i) { v.push_back(i); func(v, n+1); v.pop_back(); } } int main() { vector<int> v; func(v, 0); cout << a; }이 코드로 a를 확인해보면 func은 약 139만회 정도 호출됐다고 나옵니다.강사님이 완전탐색을 하겠다고 한 이유는 if (n==10)인 시점에서 (로직을 진행할 경우의 수가 완성됨) 호출할 함수가 최대 4^10의 횟수를 가지니까 1억 미만이므로 괜찮다고 생각하신건가요? 여기까진 저도 납득했습니다. 조합을 만드는 함수의 호출도 139만 정도에, 로직을 실행할 함수도 105만정도니까 가능하겠구나~ 라고 생각했습니다. 하지만 만약 말의 개수가 4개가 아니라 5개였다면? 조합을 만드는 함수는 1220만번 호출되고 로직을 실행하는 함수는 5^10회, 약 976만회가 호출됩니다. 합하면 약 2천만인데 이런 경우에도 완탐으로 실행해도 괜찮을까요??말의 개수가 4일때의 실행시간은 약 200ms대를 기록했지만 말이 5개가 되면 실행시간은 약 1800ms까지 꽤나 큰 차이를 보였습니다. 애초에 함수 호출이 139만에서 1220만회로 약 10배 늘었으니 당연하겠지만.. 보시면 func는 단순히 조합을 만드는 함수이고 로직을 실행하는 함수가 없는데도 시간이 꽤나 걸립니다. 글이 두서가 없어서 죄송합니다;; 궁금한 점을 정리하자면 다음과 같습니다.조합을 만드는 함수와 로직을 실행하는 함수 중, 로직을 실행하는 함수의 호출순서로 시간복잡도를 계산하면 될까요? (로직실행 함수가 조합만드는 함수보다 무거우니까)아니면 두 함수의 호출 횟수를 더해서 생각하는게 맞을까요?참고로 저는 처음에 말이 5갠줄알고, 조합을 만드는데도 시간이 많이 걸리길래 완탐이 아닌 중복조합을 다 제거하고 실행시켰습니다.. 하지만 실행시간은 강사님 코드의 실행시간과 동일하게 나왔네요.. (이틀동안 고민했는데 허탈합니다ㅠ)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
모범 답안을 활용한 공부방법 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 현재 1주차 문제를 풀고 있는 학생입니다.선생님 말씀대로 문제를 푼 후 강의를 보고 있습니다.강의의 모범답안의 접근 방법을 이해하고 한번씩 쳐보고 있는데, 모범 답안을 암기하는 것도 효율적인 공부 방법인지 질문드립니다.감사합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
8-P 문제 질문
안녕하세요 큰돌선생님 매번 좋은 강의 감사합니다해당문제를 강의 시청전에 먼저 풀어보았는데 15%에서 오답처리를 받아서 질문드립니다저는 이동 비용은 + 로 처리하였고, 얻을수 있는 금액은 - 로 처리하였습니다. 거꾸로 처리하였습니다. 또한 선생님처럼 벨만포드 알고리즘을 이용하여 문제를 풀었는데 어느부분이 잘못된것인지 잘 모르겠습니다.마지막 출력은 bfs를 이용하지 않고 사이클이 있는데 이동가능한 경우(돈 무한), 이동 가능한경우(최대의 돈), 이동할 수 없는 경우(gg) 이렇게 3가지로 나누어 출력하였습니다. http://boj.kr/40828aec1df94d10a50538040db954c3
-
해결됨코딩테스트 [ ALL IN ONE ]
전자책 교재
교재 전자책을 어떻게 받을수 있나요?
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
이분탐색 강의 13분 20초 (나무자르기 문제 마지막 print값이 e인 이유)
제목그대로 나무자르기 문제에서 마지막 return이 e가 되어야하는 이유가 좀 와닿지 않습니다.코드에서 잘라서 얻은 나무가 m보다 크거나 같을 경우, s를 mid + 1로 하기 때문에 이는 "절단기 설정 높이를 높이는 행위"이고, 문제에서 요구하는 것이 "절단기에 설정할 수 있는 높이의 최댓값" 이기 때문에 마지막에는 s를 print해야하는 것 아닌가? 싶어서 헷갈리는 것 같습니다.그리고 문제마다 e를 return하는 경우와 s를 return해야하는 경우가 나뉘는건지 좀 헷갈립니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-E 질문있습니다!
왜 메모리 초과가 나는지 잘 모르겠습니다 ㅠㅠhttp://boj.kr/3f4ea7f3a10b47edae0daa68dd2cf90d그리고 선생님 코드와 무슨차이인지도 잘 모르겠습니다...결국엔 6개의 경우의 수가 계속 추가 되는데겹치는게 있을시 6개보다 적은 경우의 수가 들어간다인데...도저히 모르겠어요 ㅠㅠㅠ#include <iostream> #include <algorithm> #include <queue> #include <set> #include <vector> using namespace std; int N, ret; vector<int> scv; queue<pair<vector<int>, int>> q; set<vector<int>> visited; vector<int> Damage(vector<int> v) { int divide = 1; for (int i = 0; i < v.size(); i++) { v[i] -= 9 / divide; divide *= 3; } return v; } void Mutalisk() { while (q.size()) { vector<int> v = q.front().first; int cnt = q.front().second; q.pop(); v = Damage(v); sort(v.begin(), v.end(), greater<int>()); for (int i = (int)v.size() - 1; i >= 0; i--) if (v[i] <= 0) v.pop_back(); if (v.size() == 0) { ret = cnt + 1; return; } do { q.push({ v, cnt + 1 }); auto it = visited.insert(v); if (it.second == false) continue; } while (prev_permutation(v.begin(), v.end())); } } int main() { cin >> N; for (int i = 0; i < N; i++) { scv.push_back(0); cin >> scv[i]; } sort(scv.begin(), scv.end(), greater<int>()); do { q.push({ scv, 0 }); } while (prev_permutation(scv.begin(),scv.end())); Mutalisk(); cout << ret; return 0; }
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
출력할 때 BufferedWriter? StringBuilder?
안녕하세요 강사님 좋은 강의 감사합니다:)다름이 아니라, 출력문을 사용할 때 BufferedReader와 StringBuilder를 사용하는게 일반적으로 사용하는게 좋다고 알고있는데 해당 강의에서는 BufferedWriter를 사용하신 이유가 궁금해서 글을 작성하게 되었습니다. 감사합니다!
-
미해결2주만에 통과하는 알고리즘 코딩테스트 (2024년)
정수론 14252
53분 38초쯤에for j in range(2184, 2200): if gcd(42, i) == 1: if gcd(2184, i) == 1: count +=1 break if j == 2199: count += 2이 부분에서 이미 for i in range를 통해서42부터 2184까지 검증을 하고 넘어가서j로 2184부터 2200사이에 몇 개의 수를 넣어야 공약수를 넣어야 1이 되는가인데for j in range 안에 조건이 gcd(42,i) == 1인데이게 gcd(2184, j) == 1: 이렇게 되어야 하는 게 아닌가요이 부분이 이해가 안되네요ㅠㅠㅠ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-A 그림 질문
5분 50초에 그려져 있는 그림에서 벡터를 오름차순 정리 했으니 비용도 오름차순으로 정렬되게 그려야하는 것 아닌가요?일정이 짧은 순서대로 정렬되고 비용 또한 오름차순 정리되면 아래 그림처럼 그리는것이 맞을까요? 수업 듣다가 헷갈려서 여쭤봅니다 ㅎㅎ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-B 강의 질문
안녕하세요 큰돌 선생님!강의를 여러번 보고서도 이해가 되지 않아서 질문 남깁니다. Q. 이 문제는 왜 DP로 접근해야 하는지 보충 설명을 추가해주시면 감사하겠습니다... 브루트포스 느낌인건 알겟는데 경우의 수를 계산하기 위해서 식을 어떻게 세워야 할 지 논리적으로 맞는지를 잘 모르겠습니다... 도와주시면 감사하겠습니다!
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이중for문으로 조건에 맞는 케이스를 찾아서 풀어보았습니다 뿌듯!
열심히 풀었습니다! function solution(array) { let answer = 0; for (let i = 0; i < array.length; i++) { for (let j = 0; j < array[i].length; j++) { const result = []; const target = array[i][j]; const left = array[i][j - 1] ?? 0; const right = array[i][j + 1] ?? 0; const top = i > 0 ? array[i - 1][j] : 0; const bottom = i < array.length - 1 ? array[i + 1][j] : 0; result.push(target); result.push(left); result.push(right); result.push(top); result.push(bottom); if (target === result.sort((a, b) => b - a)[0]) answer++; } } return answer; } console.log( solution([ [5, 3, 7, 2, 3], [3, 7, 1, 6, 1], [7, 2, 5, 3, 4], [4, 3, 6, 4, 1], [8, 7, 3, 5, 2], ]) );
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
시간초과
우선 순위 큐를 쓰는 대신에 보석을 넣는 벡터(J)에서 erase로 가방에 넣을 수 있는 보석은 바로 제거하는 알고리즘으로 작성하였는데 시간초과가 뜨네요.. erase를 사용해서 시간복잡도가 높아진 것일까요? 이런 방법으로는 문제를 풀 수 없을까요?http://boj.kr/2136c28d9e844ba1b1d04a5e369dada0 또한 j를 초기화 할 때 for문 안에서 초기화 해야하는 것 아닌가요? 가방 크기가 작아 못 들어간 보석도 다시 처음부터 탐색해야하니까요. 근데 for 문안에서 j를 초기화 하면 메모리 초과가 뜨네용 ㅜㅜ #include<bits/stdc++.h>using namespace std; typedef long long ll;ll n, k, ret, temp1, temp;int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL); cin >> n >> k; vector<pair<ll,ll>> v(n); vector<ll> vv(k); for(int i = 0; i < n; i++){ cin >> v[i].first >> v[i].second; } for(int i = 0; i < k; i++) cin >> vv[i]; sort(v.begin(), v.end()); sort(vv.begin(), vv.end()); priority_queue<ll> pq; // 여기 자리에 있던 int j = 0;를 아래로 옮겼습니다. for(int i = 0; i < k; i++){ int j = 0; while(j < n && v[j].first <= vv[i]) pq.push(v[j++].second); if(pq.size()){ ret += pq.top(); pq.pop(); } } cout << ret << "\n"; return 0;}
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-K 메모리 초과 질문입니다.
항상 강의 잘 듣고 있습니다.큰돌 선생님 강의 듣고 다시 풀어서 제출을 해봤는데 메모리 초과가 뜨더라고요. 그래서 원인을 분석해본 결과 y, x를 moveSwan 함수와 waterMelt 함수에서 지역 변수로 선언할 때 메모리 초과가 뜨는 것 같습니다. 반복문 안에서 변수 선언을 하게 되면 메모리에 부하가 생기는 건가요? 메모리초과 코드http://boj.kr/69f8be6483e4422ca6c664262980c394맞은 코드https://www.acmicpc.net/source/share/4807660d703449afa8092bcb3f32552f
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
2주 뒤 코딩테스트 저 준비할 수 있을까요?
결국 미루고 미루다 코딩테스트 예정 일자가 11.26 (토) 2주가 채 남지 않았습니다.솔직하게 현재 파이썬 기초 문법, 기초적인 수식과 함수 구현만 할 수 있습니다. (반복문 포함)남은 시간이 적지만, 그래도 전략적으로 준비해보고 싶습니다. 알고리즘은 체감으로 백준 가장 기초 브론즈 1문제, 실버 2문제 정도라고 합니다.현실적으로 알고리즘 1문제 SQL 1문제 솔 목표를 두고 있습니다.어떤 걸 집중적으로 공부하는 게 좋을까요? 아래는 작년 유형 및 난이도입니다. 알고리즘 1번. 문자 치환 (가장 기초 브론즈)1->92->8..9->10->0a->z..A->B..예시로 123abcABC => 987zyxBCD 이렇게 변환하는 함수 만들기알고리즘 2번. 대리출석한 사람 수 (실버3)[1,2][1,2][1,2] =>2본인 제외 대출이라고 처리 알고리즘 3번. 분할과 정복 (실버1)정사각형 형태의 데이터를 주고자를 수 있는거 다 잘라서 그 안에서 또 정사각형을 자르고그 안에 알파벳 개수 제한 둔 것이 가능한지
-
해결됨코딩테스트 [ ALL IN ONE ]
이런 질문 드려서 죄송합니다.
결국 미루고 미루다 코딩테스트 예정 일자가 11.26 (토) 2주가 채 남지 않았습니다. 솔직하게 현재 파이썬 기초 문법, 기초적인 수식과 함수 구현만 할 수 있습니다. (반복문 포함) 남은 시간이 적지만, 그래도 전략적으로 준비해보고 싶습니다. 알고리즘은 체감으로 백준 가장 기초 브론즈 1문제, 실버 2문제 정도라고 합니다. 현실적으로 알고리즘 1문제 SQL 1문제 솔 목표를 두고 있습니다. 어떤 걸 집중적으로 공부하는 게 좋을까요? 아래는 작년 유형 및 난이도입니다. 알고리즘 1번. 문자 치환 (가장 기초 브론즈)1->92->8..9->10->0a->z..A->B..예시로 123abcABC => 987zyxBCD 이렇게 변환하는 함수 만들기알고리즘 2번. 대리출석한 사람 수 (실버3)[1,2][1,2][1,2] =>2본인 제외 대출이라고 처리 알고리즘 3번. 분할과 정복 (실버1)정사각형 형태의 데이터를 주고자를 수 있는거 다 잘라서 그 안에서 또 정사각형을 자르고그 안에 알파벳 개수 제한 둔 것이 가능한지