- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. http://boj.kr/39c15e9338ad4585955d4d9f7453c741 나름의 방법대로 구현해봤는데, 반례를 찾기 어려워 질문드립니다. 좋은 강의 감사드립니다!
안녕하세요 제가 미리보기 강의들을 보다가 수업 방식도 마음에 들었고 미리보기 예제 코드를 다운 받기 위해서 그냥 바로 수업 신청을 했습니다. 근데 초반에서 지속적으로 전에 수업에서 다 배웠다고 많은 부분들을 그냥 넘어가셔서 제가 이해가 잘 가지가 않습니다. 혹시 배우지 못했던 부분만을 따로 빼서 저렴하게 강의를 올리실 의향이나 아니면 제가 따로 공부하고 와야 할 부분을 알려주실 수 있을까요? 좀 많이 당황스럽습니다.
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
안녕하세요 게임 서버 개발자 직무를 희망하고 있는 학생입니다. 이번에 올인원 강의와 part4 서버 강의를 들은 뒤 언리얼 엔진과 서버 연동 강의 그리고 데디 서버 강의를 들을려고 계획중입니다. 혹시 해당 강의들을 듣고 따라갈려면 UE part1 ~ 4까지를 모두 들어야만 수강을 하는데 있어서 문제가 없는지 궁금합니다. 또 서버 개발자도 Unreal Engine을 현업에서 만지고 사용할 일이 많은지도 궁금합니다.
안녕하세요:) 본 문제의 재귀 함수(go 함수) 안에서, b가 홀수인 경우 ret = ret * a % c; 가 되어야 하는 부분에 대해 한번 더 %c 연산을 하지 않아도 되는지 문의드립니다. 예를 들어 (a^5)%c의 경우, [{(a^4)%c}{a%c}]%c 와 같다고 이해했습니다. 이때 b=5 이므로 if(b%2) 에 걸리는데, ret가 (a^4)%c 인 상황에서 (a%c)%c 만큼 추가로 곱해줘야 성립이 되는게 아닌지 궁금합니다! ( 만일 (a^4)%c 에 (a%c) 만 곱한다면 그 값이 c 보다 커져서 나머지 연산을 한번 더 해야할 경우도 있지 않나요? ) 감사합니다 :)
안녕하세요:) 일곱난쟁이 문제에서 "결과값을 오름차순으로 출력" 해야하는 부분과 관련하여 문의드립니다. next_permutation을 활용하여 경우의 수를 뽑는 경우에, 앞에서 부터 7개 순열을 잘라서 보면 어떤 것은 오름차순으로 되어있지 않은데 혹시 만일 그러한 순열이 답이 되는 경우 sort로 정렬을 다시 안해줘도 되나요? 예를 들어, 본 문제 테스트케이스의 경우[ 7 8 10 13 19 20 23] 이라는 값이 딱 sum이 100인 경우여서 오름차순 그대로 값이 출력이 되지만.. 만약 [7 8 10 13 15 25 19] 가 답이었다고 가정한다면 .. 오름차순이 안되는게 아닌지 해서요! 감사합니다:)
#include <iostream> #include <cstdio> using namespace std; class Parent { public: Parent() { this->parent_pri = 2; } virtual void pri_print() { printf("%d", parent_pri); } private: int parent_pri; }; class Public_Child : public Parent{}; int main() { Public_Child public_child; public_child.pri_print(); } 이거를 실행하면 비쥬얼 스튜디오에서 2가 출력이 되는데, 클래스 밖의 main 함수에서 public_child.pri_print()에 접근할 수 있는 이유가 public 이기 때문이고, 그 public안의 pri_print함수는 클래스 Parent의 멤버 함수이기 때문에 private로 지정되어 있는 parent_pri에 접근할 수 있기 때문인가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <iostream> #include <initializer_list> using namespace std; class IntArray // integer가 담기는 클래스 { private: int m_length = 0; int* m_data = nullptr; public: //Constructors 생성자 IntArray(const int array_len) : m_length(array_len) { initialize(m_length); } IntArray(const initializer_list<int>& list) :IntArray(list.size()) { int count = 0; for ( auto& ele : list ) { m_data[ count ] = ele; count++; } } //initialize() 생성자에서 가져다 쓸 함수 void initialize(int len) { m_data = new int[ len ]; } //Destructors 소멸자 ~IntArray() { if ( m_data != nullptr ) delete[ ] m_data; m_data = nullptr; } //reset(); 메모리 지우고 초기상태로. void reset() { delete[ ] m_data; m_data = nullptr; m_length = 0; } //resize(); // 사이즈 바꿈 void resize(int n) { // 기존 메모리 temp에 저장 int* temp = m_data; // n만큼의 메모리 리사이징 m_data = new int[ n ]; // 리사이징된 메모리 크기만큼 기존메모리에서 값의 복사 for ( int i = 0; i < n; i++ ) { m_data[ i ] = temp[ i ]; } m_length = n; // 복사가 완료됐으면 기존 메모리 삭제 delete[ ] temp; } void insertBefore(const int& value, const int& ix) { // 인서트를 위한 새로운 메모리 할당 int* temp = new int[ m_length + 1 ]; // ix에 값이 들어가므로, temp[ix+1] = m_data[ix]의 전달이 이뤄진다. for ( int i = ix; i < m_length + 1; i++ ) { temp[ i + 1 ] = m_data[ i ]; } // 인서트 인덱스에 value 넣기 temp[ ix ] = value; // ix 전까지 기존 밸류 복사 for ( int i = ix - 1; i >= 0; i-- ) { temp[ i ] = m_data[ i ]; } // 기존 데이터 메모리 삭제 delete[ ] m_data; // 새롭게 인서트된 메모리 저장 m_data = temp; // 길이 +1 m_length += 1; } void remove(const int& ix) { // 제거를 위한 새로운 메모리 공간할당 int* temp = new int[ m_length - 1 ]; // 제거할 인덱스(ix)를 기준으로 값의 paste // step1. ix전의 값은 정상복사 for ( int i = 0; i < ix; i++ ) { temp[ i ] = m_data[ i ]; } // step2. ix기준 우측값의 복사 for ( int i = ix; i < m_length - 1; i++ ) { temp[ i ] = m_data[ i + 1 ]; } // 완료됐으면 기존 메모리 삭제 delete[ ] m_data; // 새로운 메모리 저장 m_data = temp; // 삭제됐으므로 길이 -1 m_length -= 1; } void push_back(const int& value) { // 끝자리 추적후에 그 뒤 새로운 메모리공간 할당후 추가하기 // insertBefore(value, m_length)를 하면? insertBefore(value, m_length); } void showAllEle() const { cout << "m_length: " << m_length << endl; cout << "m_data: "; for ( int i = 0; i < m_length; i++ ) { cout << m_data[ i ] << " "; } cout << endl; } }; int main() { IntArray my_arr{1,3,5,7,9}; my_arr.showAllEle(); my_arr.insertBefore(10,1); my_arr.showAllEle(); my_arr.remove(3); my_arr.showAllEle(); my_arr.push_back(13); my_arr.showAllEle(); } 살짝 지저분하지만, 구현에 목적을 두고 최대한 해봤는데 일단 원하는대로 구현이 되는건 확인했습니다. 추가로 문제가 발생할 수 있거나 아쉬운 부분 피드백 을 해주세요! 더 정확하고 깔끔하게 다시 수정해보겠습니다. 또한, 마지막 push_back 함수는 insert랑 기능상 비슷해보여서 insert함수를 재활용 했는데 이 방법또한 괜찮은것인지 아니면 위험한것인지도 답변해주시면 감사합니다
안녕하세요 큰돌선생님. 해당문제를 재귀dp (탑다운) 방식으로 풀어봤는데 잘 풀리지 않아 질문드립니다. 우선 해당문제 조건에 더불어 그냥 동전의 종류를 1, 2, 5로 픽스를 한다고 가정하여 문제를 풀어보았습니다. #include <bits/stdc++.h> using namespace std; int N, dp[100][100][100]; int go(int n1, int n2, int n5, int num) { if (num == N) return 1; int &ret = dp[n1][n2][n5]; if (ret) return ret; if (num + 1 <= N) ret += go(n1 + 1, n2, n5, num + 1); if (num + 2 <= N) ret += go(n1, n2 + 1, n5, num + 2); if (num + 5 <= N) ret += go(n1, n2, n5 + 1, num + 5); return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N; cout << go(0, 0, 0, 0) << '\n'; return 0; } dp배열의 원소는 1, 2, 5원 동전의 개수로 잡았고, 동전의 값이 N이 되었을때 return 1을 해주고 경우의수 문제라서 더해주는 방식으로 문제를 풀어보았습니다. 혹시 어떤 부분이 잘못되었나요? 이전 7-E 문제와 유사한 방식으로 풀어보았습니다. 또한 추가로 만약 1, 2, 5원을 픽스하지 않고 해당 문제의 조건 그대로 문제를 해결한다면 선생님께서는 어떻게 문제를 해결하실지 궁금합니다.
http://boj.kr/5d7d83e1069547288f02236c01cc8d5a 위는 정답 코드입니다! 40번째 라인에서 a(인구 지도)를 업데이트 하는 위치가 이중 for문을 벗어난 다음이 되어야 하는 것이 아닌지 문의 드립니다. 이중 for 문 안에서 지도를 업데이트 하게 된다면, 원래라면 이동이 불가능한 지역간의 이동이 가능하게 될것 같습니다. 예를 들어 3 10 11 0 50 40 40 20 30 0 0 0 위와같이 진행한다고 한다면 dfs가 한번돌고 나면 지도가 다음과 같을것 같습니다 0 35 35 40 35 35 0 0 0 이 상태에서 다음 dfs를 돈다면 0 36 36 36 36 36 0 0 0 이 되면서 하루만에 전부 통합되는 상태가 되지 않을까 싶습니다! 실제로 코드를 돌려보면 3 10 11 0 50 40 40 20 30 0 0 0 1 다음과 같이 나옵니다! 정답은 2여야 하지 않을까 싶어서 질문합니다!
안녕하세요 큰돌님, 다름이 아니라 제가 영상에 나왔던 코드를 읽기 편하게 bfs 함수를 따로 함수를 만들어서 예제 입력을 받으면 프로그램이 잘 실행되는데, 제출을 하면 메모리 초과가 뜨네요, 혹시 어떻게 된 경우인지 여쭤보고 싶습니다. 미리 감사합니다! https://www.acmicpc.net/source/share/91f2eb33d6904a5ab55d7d851f317595
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의중에 Rookiss 네이버 카페를 보여주시는데, 해당 카페에 가입하기 위한 조건이 있을까요?
안녕하세요, 메모리 초과 관련 문제가 생겨서 질문드립니다. 제가 생각한 알고리즘을 설명드리자면 2중 벡터 fire의 경로를 구합니다. (bfs) 2중 벡터 player의 경로를 구합니다. (bfs) fire와 player의 각 요소를 비교하여 player의 요소가 작은 경우엔 유지, 아닌 경우엔 -1로 값을 덮어씌웁니다. 최종적으로 vector<vector<int>> player는 다음과 같은 값을 갖습니다. -1 -1 -1 2 -1 -1 -1 1 -1 -1 1 0 -1 -1 -1 -1 해당 player를 다시 bfs로 순회합니다. (시작점은 player의 초기 위치인 0 지점) -> 이걸 하는 이유는 혹여나 player의 길이 fire에 의해 끊기는 경우가 존재할 수 있으므로 입니다. (하지만 이런 경우는 발생하지 않는 것 같습니다.) 마지막으로 player가 갈 수 있는 최종 길만 남게되고, 가장자리의 4변에서 -1이 아닌 최소값을 찾습니다. 이런 알고리즘을 시행했는데 메모리 초과가 뜹니다. 메모리 초과와 관련해서는 visual studio에서 어떻게 디버깅을 해야할지 잘 모르겠습니다. 단순히 생각해보면 각 2차원 벡터는 최대 1000*1000*4byte(int)=4MB의 크기를 갖고, deque는 아마 최대로 해도 4MB 이하의 크기를 갖을 것 같은데 문제의 256MB가 왜 초과가 되는지. 모르겠습니다. 아래는 해당 코드의 링크입니다. http://boj.kr/6145ffa1c073417ab06e3a7e86afe533 강의를 듣고나서는 코드를 수정하여 player의 경로를 구할 때, 미리 구해둔 fire의 경로와 비교하여 fire가 선점한 경우엔 갈 수 없는 경로로 표시하고, 순서 5의 과정을 삭제했습니다. 이러니 해결이 되긴하는데.. 이게 왜 되는건지는 모르겠습니다. 해당 코드는 메모리 10872KB를 썼다고 나옵니다.
안녕하세요 선생님.선생님께서 푸신 코드가 시간복잡도가 통과되지 않을 것이라 생각하였는데 통과하여 질문드립니다.제가 알기로는 substr(), erase() 함수 모두 자르고 당기는 작업이 들어가서 O(n)의 시간복잡도가 걸린다고 알고 있는데, 반례로 문자열이 100만이 모두 같은 알파벳으로 aaa...라고 하고 폭발 문자열이 a라고 한다면 반복문을 100만번 돌면서 매번 substr()과 erase()를 해주게 되어 100만 * (O(n) + O(n)) 이 되어 시간복잡도가 넘어가는 것 아닌가요? 이 경우에 substr()과 erase()가 둘다 한개의 문자(a)만 체크하기 때문에 상수시간으로 취급하여 최대 200만이 되어 문제가 안 생기는 것 같기는 한데 뭔가 시간복잡도를 빡세게 잡는 문제가 나온다면 이러한 접근으로 erase()와 substr()을 사용한다면 시간초과가 날 수도 있지 않을까 하는 고민이 생겨서 질문드립니다! substr()과 erase()를 사용해도 시간복잡도 고려에 문제가 없을까요? 이 코드는 제가 find()와 erase()를 사용하여 푼 경우입니다. 이 경우에도 반복문을 돌리고 매번 find()와 erase()를 쓰는데, find()도 동일하게 O(n)이 걸리니까 로직이 선생님께서 푼 것과 동일하다고 판단하였는데, 아래 로직은 시간초과가 떴습니다. #include<bits/stdc++.h> using namespace std; string s, a; int main(){ cin >> s >> a; while(true){ if(!s.size()){cout << "FRULA" << '\n'; return 0;} int flag = s.find(a); if(flag != string::npos){ s.erase(flag, a.size()); } else break; } cout << s << '\n'; }
안녕하세요 큰돌 선생님 좋은강의 항상 감사합니다. dp문제를 계속 풀고있는데, 아직까지 문제를 처음 보았을때 메모이제이션을 어떻게 걸어야 하는지, 무슨값을 반환해야하는지 등에 대해서 많이 헷갈려서 질문드립니다. 해당 7-E번 문제를 그냥 완탐으로는 풀 수 있겠는데 어떻게 메모이제이션을 해야하는지 잘 모르겠습니다. '메모이제이션을 건다' 의 정확한 의미가 무엇인가요? 또한 그냥 완탐으로 풀었을때 시간복잡도가 너무 크면 메모이제이션을 걸어서 시간복잡도를 줄인다는 큰 틀은 알겠는데, 좀더 자세한 생각의 흐름이 궁금합니다. 어떤 매개변수를 dp배열의 인자로 가져야 하는지 등이 헷갈립니다. 다음 아래는 해당 문제를 완탐으로 푼 코드입니다. 이렇게 완탐으로는 해결하겠는데 그 다음 이 코드에 메모이제이션을 적용하는 세세하고 자세한 흐름이 궁금합니다. #include <bits/stdc++.h> using namespace std; int N, ret; void go(int whole, int not_whole) { if (whole == 0 && not_whole == 0) { ret++; return; } if (whole > 0) go(whole - 1, not_whole + 1); if (not_whole > 0) go(whole, not_whole - 1); } int main() { cin >> N; go(N, 0); cout << ret << '\n'; return 0; }
http://boj.kr/55862649400e4247b3f86bb00a826ac1 해당 문제에서 위의 링크와 같이 코딩을 하는경우, child node가 원래 존재했지만 삭제되어 parent node가 leaf노드가 된 경우를 잡아내지 못하게 됩니다. 코딩을 하다 보니 위와 같은 경우를 떠올리지 못하여 child가 원래 없는 것만 체크하게 되었습니다. 이런 실수를 줄일수 있는 방법은 없을까요?? 그냥 트리관련된 문제는 이런 경우도 있을수 있다! 하고 넘어가야하는 걸까요??
안녕하세요. 먼저 좋은 강의 감사드립니다. 아래 소스는 matcpy-dev.cu 에서 가져온 kernel 함수입니다. global void kernelMatCpy( float* C, const float* A, int matsize, size_t pitch_in_elem ) { register unsigned gy = blockIdx.y * blockDim.y + threadIdx.y; // CUDA-provided index if (gy < matsize) { register unsigned gx = blockIdx.x * blockDim.x + threadIdx.x; // CUDA-provided index if (gx < matsize) { register unsigned idx = gy * pitch_in_elem + gx; // in element C[idx] = A[idx]; } } } 그리고 다음 소스는 transpose-dev.cu 에서 가져온 kernel 함수 입니다. global void kernelMatTranspose( float* C, const float* A, unsigned matsize, size_t pitch_in_elem ) { register unsigned gy = blockIdx.y * blockDim.y + threadIdx.y; // CUDA-provided index if (gy < matsize) { register unsigned gx = blockIdx.x * blockDim.x + threadIdx.x; // CUDA-provided index if (gx < matsize) { register unsigned idxA = gy * pitch_in_elem + gx; register unsigned idxC = gx * pitch_in_elem + gy; C[idxC] = A[idxA]; } } } 메모리 접근 관점에서 보면 각 thread별로 A에서 read해서 C에 write하는 동일한 과정으로 보이는데, 결과는 속도 차이가 많이 나는 정확한 원인이 궁금합니다. memory coalescing 때문으로 추정하고 있는데, 맞는 생각일까요? 감사합니다.