묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
제가 질문을 잘 이해를 못하는지
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 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)정사각형 형태의 데이터를 주고자를 수 있는거 다 잘라서 그 안에서 또 정사각형을 자르고그 안에 알파벳 개수 제한 둔 것이 가능한지
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
2강 정수로 문제3번
안녕하세요21분쯤에 176은 16으로 나누어 떨어지는건 이해했습니다.그런데 n의 제곱수로 나누어지는 약수를 찾아 모두더하라는 의미가176의 약수중에서 2의 제곱수로 나누어지는 애들을 찾아서 더하라는 이야기인데 176의 약수중 2, 4, 8, 16으로 나누어 떨어지니까 얘들을 더해야 하는 게 아닌가요?계속 생각해봐도 도저히 이해가 안돼서 남깁니다.