묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-A 한줄로 디버깅 하고 싶은데 혹시 이 부분 나눌 수 있을까요?
ret과 재귀로 호출하는 부분 최소 값으로 셋팅하는 결과를 실시간으로 보고 싶습니다. ret = min(ret, tsp(i, visited | (1 << i)) + dist[here][i]);이 부분 나눌 수 있을까요? int temp = tsp(i,visited | (1<<i)) + dist[here][i]);if(ret > temp) ret = temp;이런식으로 나누고 싶은데 어떻게 건드려야될지 모르겠습니다..
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-P 질문
http://boj.kr/66b6d01488da4e168d9834f8bd0d6127저는 조합을 이용해서 풀어보았는데 이 문제는 완전탐색으로 푸는게 더 나은 방법인가요??
-
해결됨[게임 프로그래머 도약반] DirectX11 입문
좌표계 변환 행렬 관련 문의드립니다.
안녕하세요, 이번 강의와 이전 강의(좌표계 변환 행렬)을 듣고, 좌표계 변환 행렬에서 '(B좌표계 기준) u,v,w의 성분'을 채우는 부분에 대해 제가 이해한 게 맞는지 확인차 문의드립니다.로컬 좌표계에서 월드 좌표계로 변환할 경우. 월드 좌표의 단위벡터 U,V,W 는 각각 U(1,0,0) , V(0,10), W(0,0,1) 이고, 이를 이용해 로컬 좌표계의 단위 벡터(u,v,w)의 성분을 보면u = ux*U + uy*V + uz*W v = vx*U + vy*V + vz*Ww = wx*U + wy*V + wz*W U,V,W가 위의 단위 벡터이므로, 좌표계 변환 행렬을 채울 때 '(B좌표계 기준) u,v,w의 성분'에 로컬 좌표계의 단위벡터를 그대로 채우면 된다. 또한 u,v,w는 로컬 좌표계의 Right, Up, Look 벡터이므로 이를 그대로 채우는 거라고도 할 수 있다.이번 강의의 약 21분 50초 즈음 내용. 로컬 좌표계가 월드 좌표계에서 Y축으로 45도 회전한 상태라면, 로컬 좌표계의 단위벡터도 월드 좌표계의 단위벡터 U,V,W에서 Y축으로 45도 회전했다고 볼 수 있으므로 y축 회전행렬을 적용한다.월드 좌표계로 변환하는 게 아닌 A->B 변환이라면, B좌표계 기준에서 A좌표계의 단위 벡터 u는 u = ux*U + uy*V + uz*W(여기서 U,V,W는 월드 좌표계의 단위벡터가 아님)인데 , 항상 u = (ux, uy, yz)라고 할 수 없으므로 '(B좌표계 기준) u,v,w의 성분' 을 채울 때 A좌표계의 단위벡터(혹은 Right, Up, Look 벡터)를 그대로 채울 수 없다. 예로 u = (2,2,2) / U = (1,-1,0) / V = (0,1,0) / W = (0,0,1) 이라면 u = 2U + 4V + 2W이고, uy == 4 라면 u = (2,2,2)가 성립되지 않는다.특히 3번은 틀린 듯 한데 제가 이해를 제대로 못 해서 맞다/틀리다를 판단하기가 어렵네요 ㅜ 질문에 대한 답변 외에도 표현상의 문제를 체크해주시는 것도 감사하겠습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
언리얼 엔진 서버 관련 질문
안녕하세요 강의 잘 들었습니다! 언리얼 iocp서버 강의는 찾을 수 없었는데 이렇게 강의해주셔서 감사합니다ㅠㅠ 강의를 다 듣고 나니 궁금한 것이 생겨 질문합니다!언리얼 엔진으로 멀티게임을 제작할 때, iocp 서버를 제작하여 연결하려면 에픽 런처에서 다운받은 언리얼 엔진이 아닌 언리얼 깃허브에서 릴리즈 버전을 다운받아 개발하여야한다는 말을 들었는데 사실인가요? 데디케이트 서버를 사용하지 않고 iocp 서버를 자체적으로 제작하여 연결하는 것을 기준으로 질문드립니다. 해당 강의를 따라 서버를 제작한다면 에픽 런처에서 다운받은 언리얼 엔진(5.3)으로 iocp서버를 제작하여 멀티게임을 만들 수 있을까요?유용한 강의 영상 감사합니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-H 비트마스킹 질문 있습니다.
안녕하세요, 강의 잘 듣고 있습니다.문제를 읽고, 스스로 짜보고 있습니다.그런데 비트마스킹 부분에서 제가 생각한 것처럼 동작하지 않아 무슨 부분이 문제인지 궁금합니다.아무리 print를 찍어서 찾아보려고 해도 찾지 못해 질문드립니다. 문제 부분// DFS 함수 (18, 19번째 줄)if(a[y][x] & (1 << i)) continue;_ret += dfs(ny, nx); http://boj.kr/b423ee8869844758a31b0c3c5d67fd49
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
vector 순회중 삽입/삭제 해결법에 대해 질문드립니다
강의 정말 잘듣고 있습니다!! vector 순회중에 데이터 삽입/삭제가 일어나면 크래시가 난다는건 이해했습니다!근데 이를 스마트 포인터를 사용하거나 생포인터에 아이디 방식을 사용하여 아이디로 상대가 살아있는지 확인하는 법이 있다고 하셨는데 스마트 포인터로는 어떻게 해결이 되는지 정확히 이해가 되지 않아 질문드립니다. 아무래도 스마트 포인터를 사용하고 vector 에 들어있는 스마트 포인터는 생존해있다는게 보장이 되기 때문에 맘편히 사용해도 된다는 것 때문에 해결이 되나 생각을 해보았습니다. vector<shared_ptr<int>> v;void Test1(){shared_ptr<int> d = make_shared<int>();*d = 4;v.push_back(d);} void Test2(){v.pop_back();} int main(){ {shared_ptr<int> a = make_shared<int>();shared_ptr<int> b = make_shared<int>();shared_ptr<int> c = make_shared<int>();*a = 1;*b = 2;*c = 3;v.push_back(a);v.push_back(b);v.push_back(c);} vector<shared_ptr<int>>& temp = v;for (auto& asd : temp){Test2();cout << *asd << endl;} } 하지만 이렇게 테스트를 해본 결과 삽입할때는 크래시, 삭제할때는 날라간 쓰레기 값을 사용합니다. 당연히 제가 뭔가를 잘못 생각하고 있겠지만 고민하다가 답이 나오질 않아 질문 드립니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p176 질문 드립니다
안녕하세요 큰돌님 😀 교안 p176에 10진법을 2진법으로 바꾸는 코드에서#include <bits/stdc++.h> using namespace std; vector<int> v; int main() { int n = 100; int b = 2; while (n > 1) { v.push_back(n % b); n /= b; } if (n == 1) v.push_back(1); // 마지막 몫이 1일 때 reverse(v.begin(), v.end()); for (int a : v) { if (a >= 10) // 이 조건은 16진법 변환을 위해 필요함. { cout << char(a + 55); // char(a + 55)에서 a가 10이면 char(65)가 되서 'A'가 된다. } // 16진법은 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}로 표현하는 방법 else { cout << a; } } return 0; }while문에서 조건을 n > 1로 하신 이유가 궁금합니다!while (n > 1) { v.push_back(n % b); n /= b; } if (n == 1) v.push_back(1); // 마지막 몫이 1일 때이 부분을while (n >= 1) { v.push_back(n % b); n /= b; }이렇게 바꾸면 문제가 생길까요?? 제가 n에 여러 값을 넣어봤을 땐 문제가 없었는데 반례가 있다면 알려주시면 감사하겠습니다!
-
해결됨[게임 프로그래머 도약반] DirectX11 입문
루키스님 질문 있습니다
1. 클래스 생성자 매개변수가 레퍼런스인 스타일은 Init()으로 데이터를 초기화 하는 스타일보다불편하다고 생각을 하는데(레퍼런스 때문에 헤더파일에 선언만 하는게 힘들다던지) 제 생각이 맞나요? 어떤 것이 표준에 가깝나요? 2. 저만의 게임 엔진을 구축하는게 목표라서 코드를 적으면서 했습니다만 난이도가 너무 높아서 좌절했습니다개인적으로 DirectX를 이해하는것보다 전체적인 소스 아키텍처가 더 어려웠습니다이 정도 소스 난이도는 프로그래머라면 쉽게 이해 가능한 수준인건가요? 아니면 어려운게 맞는건가요?그리고 게임 엔진을 만들려고 한다면 이 강의 이후 게임 엔진 아키텍쳐 책이나 디자인 패턴을 열심히 공부하는 방향이 맞을까요? 3. 루키스님의 소스를 참고해서 게임 엔진을 구축하고 그 엔진을 이용해서 간단한 게임을 만든다면저작권 부분이 어떻게 될지 궁금합니다 질문이 많아서 죄송합니다 좋은 강의에 항상 감사하게 생각하고 있습니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
메모리 초과가 나는데 선생님 코드와 어디가 다른지 모르겠습니다..ㅠㅠ
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <queue> #include <string> #include <math.h> #include <cstring> #include <stack> using namespace std; int arr[3] = {}; int dmg[6][3] = { {1,3,9},{1,9,3},{9,1,3}, {9,3,1},{3,1,9},{3,9,1} }; int visited[64][64][64] = {}; struct A { int a; int b; int c; }; queue<A> mq; void BFS() { while (!mq.empty()) { int x = mq.front().a; int y = mq.front().b; int z = mq.front().c; mq.pop(); if (visited[0][0][0]) { break; } for (int i = 0; i < 6; i++) { int nx = x - dmg[i][0]; if (nx < 0) { nx = 0; } int ny = y - dmg[i][1]; if (ny < 0) { ny = 0; } int nz = z - dmg[i][2]; if (nz < 0) { nz = 0; } if (visited[nx][ny][nz] != true) { mq.push({ nx,ny,nz }); visited[nx][ny][nz] = visited[x][y][z] + 1; } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N; cin >> N; for (int i = 0; i < N; i++) { cin >> arr[i]; } mq.push({ arr[0],arr[1],arr[2] }); visited[arr[0]][arr[1]][arr[2]] = 1; BFS(); cout << visited[0][0][0]-1; } 메모리 초과가 나는데 아무리 봐도 어디가 나는지 모르겠습니다ㅜㅜ..
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
멘토링 신청 질문
혹시 이번에 올라온 Live 강의 신청이 안되는거 같은데 자리가 꽉차서 그런건가요??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-H 메모리초과
http://boj.kr/8e44c6b66d4644008651ce44ab448ea8res.push_back(k); for (int i = prev[k]; i != n; i = prev[i]) { res.push_back(i); }이 부분으로 인해서 메모리초과가 발생하는 거 같은데 왜 발생하는지 이유를 잘 모르겠습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-L 질문있습니다
http://boj.kr/96d35c5b502442c08daba88212df08c4큰돌님 코드를 보니까 string 사용하신 부분 외에는 거의 동일한 것 같은데 자꾸 3%에서 틀렸다고 나와요.이유를 알 수 있을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-I 질문있습니다.
투포인터를 하기 위해서 정렬을 사용하셨는데,문제를 읽어보면 '... a1, a2, ..., an으로 이루어진 수열이 있다. ... 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는'이라는 문구가 있어서, 정렬을 하게 되는 순간 기존의 index 순서가 바뀌기 때문에 함부로 정렬을 하면 안되는 문제 아닌가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
반례를 못찾겠습니다.
다음과 같이 선생님 코드를 참고하여 구현했는데 어디서 틀렸는지 모르겠습니다. http://boj.kr/ff14d895e1de44258e860f9df1dc81d9 그리고 수업을 들을 때 문제 풀이가 감도 안잡히면 해설을 조금 보고 풀이를 해본 다음에 그래도 안되면 코드를 참고해서 구현하는데 이런 방식으로 들어도 될까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
8-B 질문
안녕하세요 강사님, 코드 관련해서 질문이 있습니다.강사님께선 int &ret = dp[STR][INT]; if(ret != -1) return ret; 방식으로 코드를 작성하셨고,저는if (dp[strength][intelli] != -1) return dp[strength][intelli];방식으로 코드를 작성했습니다.그런데, 제 코드는 계속 오류가 납니다.어떤 부분에서 오류가 나는지 알려주시면 감사하겠습니다.http://boj.kr/4e74c937e8b440c3989b1cfcceb69f53
-
미해결홍정모의 따라하며 배우는 C++
const와 extern
안녕하세요const가 변수의 외부연결을 막는 것 같은 상황이 생기는 거 같아 이렇게 여쭤봅니다. 파일구조는 vars.cpp -> header.h -> main.cpp&test.cpp입니다.vars.cppheader.hmain.cpptest.cpp의도한대로 잘 작동하며 출력화면은 아래와 같습니다.그런데 여기서 vars.cpp에서 nmsp_a변수를 int에서 const int형으로 바꾸고,header.h에서도 nmsp_a를 extern int에서 extern const int형으로 바꾸고 돌려보면아래와 같이 오류가 발생합니다.차이점은 equipe namespace안의 int nmsp_a변수를 그냥 int에서 const int로 바꾼 것 뿐인데 충돌이 일어나는 것처럼 보입니다.const와의 어떠한 문제 때문인 것으로 추측되는데 vars.cpp의 namespace안의 nmsp_a변수에는 extern을 붙이지 않아왔고 nmsp_a를 가져다끌어 쓰는 header.h에서만 extern을 붙여줬는데 아래 사진과 같이vars.cpp의 nmsp_a 변수에 오류를 발생시키던 const를 붙이되 extern또한 추가로 붙여주면 정상출력을 합니다. const를 안 붙이는 상황에선,변수를 정의해두는 vars.cpp에서는 extern를 쓰지않고이를 가져오는 주체인 header.h에만 extern를 붙여도 정상작동했지만 const를 붙이는 상황에선,vars.cpp, header.h 두 곳 모두 각각 변수에 extern을 붙여줘야한다는 결론을 얻었습니다. 말이 좀 복잡한데 정리하자면왜 변수에 const가 없으면vars.cpp에는 extern을 안 붙여도 되고왜 변수에 const가 있으면vars.cpp에도 extern을 꼭 달아줘야하는지그런 차이가 왜 생기는지 궁금합니다. 감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안에 제시된 string - split()의 효율성 관련 질문드립니다.
안녕하세요, 큰돌님!교안에서 제시된 내용을 기반으로 알고리즘 문제를 풀다가 궁금한 부분이 생겨 질문드렸습니다.교안에서 제시된 문자열 - split 함수는 아래와 같습니다.vector<string> split(string input, string delimiter) { vector<string> ret; long long pos = 0; string token = ""; while((pos = input.find(delimiter)) != string::npos) { token = input.substr(0, pos); ret.push_back(token); input.erase(0, pos + delimiter.length()); } ret.push_back(input); return ret; }저는 위 함수를 응용하거나 문제를 해결하는데, 오늘 백준의 5430번 문제를 해결할 때도 위와 같은 로직의 코드를 작성하여 문자열 split을 시도하였습니다.// I-2. 각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. cin >> _p; // I-3. 다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. cin >> _n; // I-4. 다음 줄에는 [x1, ... xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. cin >> _x; string origin = _x.substr(1, _x.size() - 2); vector<string> vs_x(_n); if(origin.empty()) { } else { int pos = 0; int cycle = 0; while((pos = origin.find(',')) != string::npos) { string tmp = origin.substr(0, pos); vs_x[cycle++] = tmp; origin.erase(0, pos + 1); } vs_x[cycle] = origin; } 코드에 대해 부연설명을 드리자면, 입력을 통해 문자열을 받게 되면, 해당 문자열의 첫번째와 마지막 인덱스를 제외한 문자열을 origin에 저장한 후, 이 문자열 origin을 컴마(,)를 기준으로 split 하였습니다. 예를 들어, [1, 2, 3]이라는 문자열을 입력(_x)으로 받았다면, 변수 origin에 1,2,3을 저장한 후 컴마를 기준으로 문자열을 split할 수 있습니다.하지만, 위 코드와 함께 문제를 해결하고자 할 때, 지속적으로 시간 초과 문제가 발생하였습니다. 따라서 split 함수를 다음과 같은 로직으로 변경한 후 답안을 다시 제출하였으며, 그 결과 시간 초과가 발생하지 않고 문제를 해결할 수 있었습니다.// I-2. 각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. cin >> _p; // I-3. 다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. cin >> _n; // I-4. 다음 줄에는 [x1, ... xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. cin >> _x; string token = ""; vector<string> vs_x(_n); int cycle = 0; for(int j = 0; j < _x.length(); ++j) { if(isdigit(_x[j])) { token += _x[j]; } else { if(!token.empty()) { vs_x[cycle++] = token; token = ""; } } } 제가 궁금한 것은 위에 제시된 split에 대한 두 개의 로직이 왜 효율성 차이가 나는지 잘 모르겠습니다.. origin.erase(0, pos + 1)이 O(n)의 시간 복잡도를 요구하면서, 첫 번째 로직은 O(n^2)의 시간 복잡도와 두 번째 로직은 O(n)의 시간 복잡도를 필요로 할 수도 있겠다는 생각이 들기도 하지만, 정확하게 어떤 부분이 큰 차이를 불러 일으키는지 잘 모르겠습니다. 감사합니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-A 질문있습니다
http://boj.kr/b8eaa84254ba4993b722f0482d6c1280조합 함수를 다음 요소를 선택한다, 안한다로 나눠 뻗어나가도록 재귀를 구현하였습니다..1개를 택할 때는 따로 구해주었는데 어떤 걸 놓친 걸까요?테스트케이스는 모두 통과하였는데 오답입니다
-
해결됨CUDA 프로그래밍 (2) - C/C++/GPU 병렬 컴퓨팅 - 벡터 vector 더하기
매크로 함수를 쓴 이유
안녕하세요!좋은 강의 잘 듣고 있습니다.common.cpp 코드 중에서 ELAPSED_TIME_BEGIN(N)과 ELAPSED_TIME_BEGIN(N)을 매크로 함수로 정의한 이유가 무었인지요?CUDA_CHECK_ERROR() 함수는 __FILE__과 __LINE__ 때문에 매크로 함수로 정의하신 걸로 이해합니다만, 시간 측정 함수들을 매크로함수로 정의하신 이유는 잘 이해되지 않습니다.답변 부탁드립니다.감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-A 오답 관련 질문입니다. (to_string 사용 시)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강의 잘 듣고 있습니다!!해당 문제를 푸는데, 이해가 되지 않는 현상이 있어 질문드려요 비트마스킹으로 조합을 획득하여 이를 다시 순번으로 복원하는 과정에서 ret += to_string(j+1); 로 하니 오답이 발생했습니다.무엇이 문제일지 전혀 감을 못잡다가..,ret += (char(j+1) +'0'); 으로 해주니 정답 처리가 되었는데요 그 이유가 무엇일지 궁금합니다.감사합니다. 전체 코드 >> #include <bits/stdc++.h> using namespace std; int N; int mp, mf, ms, mv; vector<vector<int>> m; int main() { cin >> N; cin >> mp >> mf >> ms >> mv; m = vector<vector<int>>(N, vector<int>(5, 0)); for (int i = 0; i < N; ++i) { for (int j = 0; j < 5; ++j) { cin >> m[i][j]; } } /* 0000000: 0 0000001: 1 0000010: 2 0000011: 3 ... */ int min_C = 500 * 200; vector<string> ans; for (int i = 0; i < (1 << N); ++i) { int sum_p = 0, sum_f = 0, sum_s = 0, sum_v = 0, sum_c = 0; for (int j = 0; j < N; ++j) { // 비트 마스킹을 통한 조합 combination 획득 if (i & (1 << j)) { sum_p += m[j][0]; sum_f += m[j][1]; sum_s += m[j][2]; sum_v += m[j][3]; sum_c += m[j][4]; } } if (sum_p >= mp && sum_f >= mf && sum_s >= ms && sum_v >= mv) { if (min_C > sum_c) { min_C = sum_c; string ret = ""; for (int j = 0; j < N; ++j) { if (i & (1 << j)) { // ret += to_string(j+1); << 오답 ret += (char(j + 1) + '0'); // << 이렇게 해주니 비로소 정답 } } ans = {ret}; } else if (min_C == sum_c) { string ret = ""; for (int j = 0; j < N; ++j) { if (i & (1 << j)) { // ret += to_string(j+1); << 오답 ret += (char(j + 1) + '0'); // << 이렇게 해주니 비로소 정답 } } ans.push_back(ret); } } } if (ans.empty()) cout << -1; else { cout << min_C << "\n"; sort(ans.begin(), ans.end()); for (char s : ans[0]) { cout << int(s - '0') << " "; } } return 0; }