묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
그리디에 대해서 질문있습니다
강의를 보는데 이해가 안되는부분이 있어 질문드립니다그리디 문제의 경우는 실제로 해당경우에 대한 모든 경우의수가 대입된다면 임의의 해답논리를 이용해서 푼 경우가 진짜 정답은 아닐 수 있으나 문제에서 제시되는 테스트케이스는 해당 논리에대해서는 참 이라는 조건이 제시되는 문제로만 구성되있다고 생각하면 되는걸까요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
코드중 이해안가는부분이있습니다
Awake() :모든 오브젝트가 초기화되고 호출Start() :스크립트 인스턴스가 활성화된 경우에만 호출유니티 랑 비슷하게 하시려고 만드신 건 이해했습니다근데 생성자가 있는대 필요한 이유가 있을까요?생성 순서 문제 때문이라도 Awake나 Start 하나만 써도 될 것 같아서요
-
미해결홍정모의 따라하며 배우는 C++
Iterator를 사용하는 이유가 무엇인가요?
제가 생각해본 바로는, 추후 코드의 리팩토링 과정을 더 편하게 만들기 위해(?)같습니다. 많은 STL 의 컨테이너가 동일한 용법을 갖고 있으면 편할테니까요. 혹시 다른 이유가 더 있을까요?
-
해결됨홍정모의 따라하며 배우는 C++
lock guard를 사용한 쓰레드 연산결과가 inner_product 함수를 사용한 결과와 다릅니다.
오타가 없는 것 같은데 무슨 이유로 다른 값이 나오는지 알수가 없네요. 도움부탁드립니다.아래는 코드 전문입니다.#include <iostream> #include <thread> #include <mutex> #include <utility> #include <future> #include <vector> #include <atomic> #include <chrono> #include <numeric> #include <random> #include <execution> using namespace std; auto dotProductFuture(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end) { int sum = 0; for(unsigned i = i_start; i < i_end; ++i) { sum += v0[i] * v1[i]; } return sum; } auto dotProductNaive(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end, unsigned long long & sum) { for(unsigned i = i_start; i < i_end; ++i) sum += v0[i] * v1[i]; return sum; } mutex mtx; auto dotProductLock(const vector<int>& v0, const vector<int>& v1, const unsigned i_start, const unsigned i_end, unsigned long long & sum) { for(unsigned i = i_start; i < i_end;++i) { std::scoped_lock lock(mtx); //c++17 sum += v0[i] * v1[i]; } } int main() { const long long n_data = 100'000'000; const unsigned n_threads = 4; //init vectors std::vector<int> v0, v1; v0.reserve(n_data); v1.reserve(n_data); random_device seed; mt19937 engine(seed()); uniform_int_distribution<> uniformDist(1, 10); for(long long i = 0; i < n_data; ++i) { v0.push_back(uniformDist(engine)); v1.push_back(uniformDist(engine)); } cout << "std::inner_product" << endl; { const auto sta = chrono::steady_clock::now(); const auto sum = std::inner_product(v0.begin(), v0.end(), v1.begin(), 0ull);//unsigned long long const chrono::duration<double> dur = chrono::steady_clock::now() - sta; cout << dur.count() << endl; cout << sum << endl; cout << endl; } cout << "Naive" << endl; { const auto sta = std::chrono::steady_clock::now(); std::vector<thread> threads; threads.resize(n_threads); const unsigned n_per_thread = n_data / n_threads; unsigned long long sum = 0; for(unsigned t = 0; t < n_threads; ++t) { threads[t] = std::thread(dotProductNaive, std::ref(v0), std::ref(v1), t*n_per_thread, (t+1)*n_per_thread, std::ref(sum)); } for(unsigned t = 0; t < n_threads; ++t) threads[t].join(); const auto dur = std::chrono::steady_clock::now() - sta; cout << dur.count() << endl; cout << sum << endl; cout << endl; } cout << "Lock Guard" << endl; { const auto sta = std::chrono::steady_clock::now(); unsigned long long sum = 0; std::vector<thread> threads; threads.resize(n_threads); const unsigned n_per_thread = n_data / n_threads; for(unsigned t = 0; t < n_threads; ++t) { threads[t] = std::thread(dotProductLock, std::ref(v0), std::ref(v1), t*n_per_thread, (t+1)*n_per_thread, std::ref(sum)); } // for(unsigned t = 0; t < n_threads; ++t) // threads[t].join(); const chrono::duration<double> dur = std::chrono::steady_clock::now() - sta; cout << dur.count() << endl; cout << sum << endl; cout << endl; } return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
반례 찾아주세요ㅜㅜ
안녕하세요 강사님 강의 잘 듣고 있습니다.강사님 강의를 보기 전에 제가 스스로 풀었던 내용입니다.https://www.acmicpc.net/source/66606871문제의 예시와 첫 글자 z도 다 잘 출력 되었는데 어디서 실패하는건지 모르겠어서 여쭤봅니다...!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
lower_bound 에 교안과 다른 숫자로 변경하면
처음에는 교안과 동일한 숫자를 넣어봤다가 다르게 숫자를 넣어봤는데.. lower_bound는 그대로 2고 upper_bound는 2로 변해버립니다.. 왜그런걸까요? 그리고 주소값도 변하지가 않습니다.. 실행환경때문에 그런걸까요?그리고 typedef long long 11을 적으면 error: expected unqualified-id before numeric constant 라는 에러가 발생합니다..(그래서 아래 코드보면 안적혀있어요)그리고 제가 이해한것이 맞는지 알려주시면 감사하겠습니다. 교안기준 주소값을 기반으로 몇번째 요소인지를 뽑아낼 수 있다고 적혀있는데 그말은 곧 "0xd21518 - 0xd21510 = 8 이 나오는데, int형이니까 4바이트가 두개와 같으니 2번째 인덱스를 의미한다 " 라고 이해했습니다.. #include <bits/stdc++.h> using namespace std; int main(){ vector<int> a {1,2,5,6,7,3,3,3,4}; cout << lower_bound(a.begin(), a.end(), 3) - a.begin() << "\n"; cout << upper_bound(a.begin(), a.end(), 3) - a.begin() << "\n"; cout << &*lower_bound(a.begin(), a.end(), 3) << "\n"; cout << &*a.begin() << "\n"; cout << &*(a.begin() + 1) << "\n"; return 0; } /* 실행결과 2 2 0xe71d68 0xe71d60 0xe71d64 */
-
해결됨[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
인벤토리 강의 예제 코드가 작동되지 않습니다.
이 상황과 관련해서 몇 가지 같이 질문드려봅니다...두 번째 for문(-> 주석 '//PK당해서 랜덤으로 일부 아이템 드랍' 부분)에서 스코프 내 지역변수가 최적화되어 사용할 수 없다는 메시지와 함께 내용을 알 수 없다고 나옵니다. 비슷한 경우를 포폴 작업하면서 몇 번 마주한 적이 있었는데요, 혹시 왜 이런 걸까요?_?(참고 사진)이 질문이 본론이기는 한데, if문으로 RemoveItem 호출 후 반환되는 bool값에서 계속 false가 반환되는 듯 합니다. 1번 질문에 남긴 이유 때문에 디버깅으로 정확한 원인을 파악하지 못했습니다(ㅠㅠ)그리고 같은 부분을 강의에서 코드가 정상 작동 되는지 확인해주셨었는데요(50:33), 이 때 if문 끝에 세미콜론이 붙어 조건문의 내용으로 적었던 출력 부분이 반드시 작동되도록 처리 되었더라구요.강의를 여러 번 반복해서 보며 제가 잘못 작성한 부분이 있는지 확인해보았으나 발견하지는 못했습니다.. 혹시 정상 작동 시키려면 어떻게 수정해야 하는 걸까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-C 인구이동 코드 질문
코드에 대한 질문이 있습니다.아래는 제가 짠 코드입니다.다른 부분은 볼 필요 없이 dfs(i, j) 이 부분에 대한 궁금증이 있습니다.저는 dfs(i, j) ... void dfs(int y, int x)이런식으로 짰는데강사님 코드를 보면 dfs(i, j, v) ... void dfs(int y, int x, vector<pair<int,int>> &v) 이런식으로 줬습니다.이렇게 짜야하는 이유가 궁금합니다. 이에 대한 제 예상 해답은벡터에 call by reference를 적용했기 때문인데 왜 call by reference를 적용해야하는지를 모르겠습니다.벡터에 call by reference를 적용한다고 치면 void dfs 안에 있는 다른 변수들(sum, cnt) 같은 변수들도 dfs(i, j, sum, cnt) 이런식으로 줘야하는것이 아닌가요?call by value, call by reference 부분 교안을 봐도 이해가 되지 않아서 질문드립니다. 자세한 답변 부탁드립니다#include <bits/stdc++.h> using namespace std; const int dy[4] = { -1 ,0, 1, 0 }; const int dx[4] = { 0, 1, 0, -1 }; int n, l, r, a[55][55], visited[55][55], sum, cnt; vector<pair<int, int>> v; void dfs(int y, int x) { visited[y][x] = 1; for (int i = 0; i < 4; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || ny >= n || nx < 0 || nx >= n) continue; if (visited[ny][nx]) continue; if (abs(a[y][x] - a[ny][nx]) >= l && abs(a[y][x] - a[ny][nx]) <= r) { v.push_back({ ny, nx }); sum += a[ny][nx]; cnt++; dfs(ny, nx); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> l >> r; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> a[i][j]; } } int ret = 0; while (true) { int flag = 0; fill(&visited[0][0], &visited[0][0] + 55 * 55, 0); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (visited[i][j]) continue; v.clear(); visited[i][j] = 1; v.push_back({ i, j }); cnt = 1; sum = a[i][j]; //1. 왜 여기 dfs에서 dfs(i, j, v)로 줘야하는지? //2. 만약 이에 대한 해답이 call by reference 이면 //위에 따로 빼놓은 dfs 함수 부분에서 //sum, cnt 이런 변수들도 똑같이 dfs(i, j, sum, cnt) 이런식으로 넣어줘야 하는 것이 아닌지? dfs(i, j); if (cnt == 1) continue; for (pair<int, int> b : v) { a[b.first][b.second] = sum / cnt; flag = 1; } } } if (!flag) break; ret++; } cout << ret << '\n'; return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
회사 필기시험 질문
안녕하세요. 제가 이번에 서류에 합격해서필기시험을 친다는데필기시험과 코딩테스트의 차이는 무엇인가요?시간은 1시간인데 뭐가 나올지 너무 두렵고 막막합니다
-
미해결홍정모의 따라하며 배우는 C++
3.6강의 16:49
if(x==1 && y++==2)에서++가 ==보다 우선순위가 높아y가 3이되고 2랑 같지않게되어서False이므로 중괄호안에 문장이 실행되지 않아야하는거아닌가요?제가 안에 문장넣엇는데 실행이되어서 헷갈리네요..
-
미해결홍정모의 따라하며 배우는 C++
강의 12.9 - 8:59 - std::vector에서 reference wrapper와 pointer 의 성능적인 차이
vector<Base*> vec;for(auto& el : vec)el->print();vector<reference_wrapper<Base>> vec;for(auto& el : vec)el.get().print();레퍼런스가 포인터보다 빠르지만 위에서는 get() 함수를 호출하니까 함수호출하면 스택프레임 전개되는데이러면 오히려 오버헤드가 더 커지는것 아닌가요?궁금해서 질문 올립니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-V 문제 질문
안녕하세요 큰돌선생님 매번 좋은강의 감사합니다해당문제 풀이에서 다른부분은 모두 이해 가는데,make함수에서 if(interval == n) break; 부분이 왜 필요한지 잘 모르겠습니다. 어차피 for 루프가 끝나면 자동으로 종료되기때문에 필요없다고 생각하여 제출했는데 틀렸다고 나오네요 혹시 무엇때문에 필요한 것인가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5 - B stack 풀이 질문
안녕하세요, 강사님의 강의를 수강하며 코딩테스트를 준비하고 있는 수강생입니다.강사님의 좋은 코드 설명과 양질의 코드로 항상 감사하게 생각하고 있는데요,다름이 아니라 제가 5 - B 문제를 풀다가 질문이 생겨서 글을 올리게 되었습니다.저는 해당 <문자열 폭발> 문제를 읽자마자 '아 여느 괄호 연쇄 폭발 문제랑 비슷하구나' 라는 생각이 들어서스택으로 문제 풀이 가닥을 잡게 되었는데, 그 와중에 전과는 다르게 폭발하는 string의 길이가 길어 졌으니매번 탐색을 해주어야겠다, 시간 복잡도도 괜찮을 것 같다! 라는 생각에 코드를 작성해봤습니다.생각보다 정답 풀이가 저의 풀이와 비슷해서 기분도 좋았는데, 왠지 모르게 시간초과가 계속 발생합니다.<질문>어느 부분을 고치면 시간 초과를 없앨 수 있을까요?그리고 이러한 시간 초과를 겪지 않으려면 어떤 코딩 방식을 지향해야할까요? (이건 개인적으로 지금 발생하고 있는 문제가 제 코드 작성 습관과 관련이 있디고 생각해서 적었습니다.)#include<iostream> #include<stack> #include<queue> #include<vector> #include<string> #include<climits> #include<algorithm> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); string str; cin >> str; string bomb; cin >> bomb; stack<char> s; int len = str.length(); int bomb_len = bomb.length(); for(int i = 0; i < len; i++) { char now = str[i]; // 폭탄을 확인할 만큼 stack이 큰지 확인 // 폭탄을 넣을 만큼 크지 않다면 그냥 stack에 문자 넣기 if(s.size() >= bomb_len - 1 && now == bomb[bomb_len - 1]) { // 폭탄 글자 길이 만큼 스택에서 글자 우선 뽑기 string token; token = token + now; for(int j = 1; j < bomb_len; j++) { token = token + s.top(); s.pop(); } reverse(token.begin(), token.end()); // 뽑은 문자열이 폭탄 글자인지 확인 // 폭탄이 아니라면 다시 넣어주고 폭탄이면 뺀 문자열 그냥 버림 if(token != bomb) { for(int j = 0; j < bomb_len; j++) { s.push(token[j]); } } } else { s.push(now); } } if(s.empty()) { cout << "FRULA"; } else { string answer; int ans_len = s.size(); for(int i = 0; i < ans_len; i++) { answer = answer + s.top(); s.pop(); } reverse(answer.begin(), answer.end()); cout << answer; } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
file not found 에러 해결법
Mac 유저일 경우, 초반 컴파일러 설정에서 다음과 같이 에러가 뜰 수 있습니다. 저는 sudo 를 사용해도 에러가 뜨더군요ㅠㅠ구글링을 좀 하다보니 다음과 같이 해결방법을 찾게 되어 공유드립니다. /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include이 파일 경로에 bits 디렉토리를 생성하고 똑같이 작성하면 문제없이 잘 작동합니다!
-
해결됨홍정모의 따라하며 배우는 C++
async1의 start출력의 endl가 동작하지 않습니다
안녕하세요,분명 async1 start 출력 시 endl을 해주었는데도 줄바꿈 적용이 되지 않는 이유를 잘 모르겠습니다.설명 부탁드려도 될까요?
-
미해결[게임 프로그래머 도약반] DirectX11 입문
강의에서 언급하시는 포폴 제작하는 과정이 포함되나요?
현재 강의에서 제작하고있는 프레임워크로 3D포폴을 만든다라는 언급이 종종 나오는데 그러한 과정도 이 강의에 포함이 되어있나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요! 큰돌님 질문있습니다
강의 매우 유익하게 듣고있는 학생입니다! 많이 부족하지만 열심히 공부하는 중입니다!2-J문제 풀이에서for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] == 0) { int cnt = 1; while (a[i][j + 1] == -1) { a[i][j + 1] = cnt++; j++; } } } } 여기서 while문 돌면서 j++을 계속 해주는데 열을 계속 증가시키면서 -1인지 아닌지를 검사해주는데 j < m인 조건을 안걸어주면 j++을 계속하면서 index범위를 침범하지 않나 싶어서 질문 드립니다!
-
미해결홍정모의 따라하며 배우는 C++
seekg 질문입니다.
안녕하세요, 초반 seekg로 abcd.....z 저장된 txt읽는 코드를 동일하게 실행하였는데요,두번째 seekg 로 읽어올때 l 이 아닌 m을 읽어옵니다.원인이 무엇일까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-Q 1344 문제 질문입니다!
7-Q 1344 문제 질문입니다!#include <bits/stdc++.h> using namespace std; double A,B,ret; // 1~18까지 소수가 아닌 수로 배열 선언 int arr[11]={1,4,6,8,9,10,12,14,15,16,18}; int main() { cin >> A >> B; // 2차원 배열을 통해 18 combination n을 구현 for (int i=0;i<11;i++){ for (int j=0;j<11;j++){ double A_com=1,B_com=1; double per=1,A_per=1,B_per=1; //A_com으로 A가 arr[i](소수가 아닌 수만큼) 번 득점했을 때의 경우의 수를 구함 //A_per은 arr[i]만큼 득점했을 확률, 18-arr[i]만큼 득점 못했을 확률을 곱함 for (int k=0;k<arr[i];k++){ A_com*=(18-k); A_com/=(k+1); A_per*=(A/100); } for (int k=0;k<18-arr[i];k++){ A_per*=(100-A)/100; } //B도 마찬가지 for (int k=0;k<arr[j];k++){ B_com*=(18-k); B_com/=(k+1); B_per*=(B/100); } for (int k=0;k<18-arr[j];k++){ B_per*=(100-B)/100; } //A_com*A_per은 A가 arr[i]만큼 득점할 확률 //B_com*B_per은 B가 arr[j]만큼 득점할 확률 //모두 곱하면 A와 B 모두 소수가 아닌 숫자만큼 득점할 확률 per*=A_com*A_per*B_com*B_per; ret+=per; } } // 1-(A와 B모두 소수가 아닌 숫자만큼 득점할 확률)=적어도 한 팀이 소수로 득점할 확룰 printf("%f",1-ret); }문제 해설과는 다르게 조합을 이용해서 풀었는데 결과가 맞지 않습니다. 예제 1번과 2번은 맞는데 어떤 부분이 잘못되었는지 알려주시면 감사하겠습니다 ㅠㅠ
-
미해결[게임 프로그래머 도약반] DirectX11 입문
RenderTarget Group 적용
DX12에서 썼던 방법으로 RenderTargetGroup을 적용하는데SwapChain 옵션 중 SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; 로 주니까SwapChain의 버퍼 카운트를 2로 했는데도SwapChain->GetBuffer(index, IID_PPV_ARGS(&resource)); 이 부분에서 index가 0이 아니면 resource를 반환해주지를 않는데, DX11에서는 DX12때 처럼 SwapChain의 BackBufferIndex를 이용해서 수동으로 관리하는게 불가능한가요