묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-Q 이렇게 하면 안되는 이유가 뭘까요
http://boj.kr/48d6be65693f4801bc29d65346739e1a
-
미해결홍정모의 따라하며 배우는 C++
접근지정자와 상속
#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에 접근할 수 있기 때문인가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-L 이렇게 풀면 왜 안될까요?
ㅠㅠhttp://boj.kr/4d01aaf298574b598ed3f4d4412788fc
-
해결됨홍정모의 따라하며 배우는 C++
IntArray 클래스를 구현해봤는데 피드백 부탁드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 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함수를 재활용했는데 이 방법또한 괜찮은것인지 아니면 위험한것인지도 답변해주시면 감사합니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-H 문제 다른방식 풀이 질문
안녕하세요 큰돌선생님. 해당문제를 재귀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원을 픽스하지 않고 해당 문제의 조건 그대로 문제를 해결한다면 선생님께서는 어떻게 문제를 해결하실지 궁금합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
정답코드 40번째 줄 지도 업데이트 시점에 대한 질문입니다!
http://boj.kr/5d7d83e1069547288f02236c01cc8d5a위는 정답 코드입니다! 40번째 라인에서 a(인구 지도)를 업데이트 하는 위치가 이중 for문을 벗어난 다음이 되어야 하는 것이 아닌지 문의 드립니다. 이중 for 문 안에서 지도를 업데이트 하게 된다면, 원래라면 이동이 불가능한 지역간의 이동이 가능하게 될것 같습니다. 예를 들어3 10 110 50 4040 20 300 0 0 위와같이 진행한다고 한다면dfs가 한번돌고 나면 지도가 다음과 같을것 같습니다0 35 3540 35 350 0 0 이 상태에서 다음 dfs를 돈다면0 36 3636 36 360 0 0이 되면서 하루만에 전부 통합되는 상태가 되지 않을까 싶습니다! 실제로 코드를 돌려보면3 10 110 50 40 40 20 30 0 0 01다음과 같이 나옵니다! 정답은 2여야 하지 않을까 싶어서 질문합니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-D 불! 메모리 초과 질문 있습니다.
안녕하세요 큰돌님, 다름이 아니라 제가 영상에 나왔던 코드를 읽기 편하게 bfs 함수를 따로 함수를 만들어서 예제 입력을 받으면 프로그램이 잘 실행되는데, 제출을 하면 메모리 초과가 뜨네요, 혹시 어떻게 된 경우인지 여쭤보고 싶습니다. 미리 감사합니다!https://www.acmicpc.net/source/share/91f2eb33d6904a5ab55d7d851f317595
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
카페 가입 관련 문의
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의중에 Rookiss 네이버 카페를 보여주시는데, 해당 카페에 가입하기 위한 조건이 있을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
메모리 초과 관련 문제
안녕하세요, 메모리 초과 관련 문제가 생겨서 질문드립니다.제가 생각한 알고리즘을 설명드리자면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를 썼다고 나옵니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-B erase(), substr() 시간복잡도 질문드립니다.
안녕하세요 선생님.선생님께서 푸신 코드가 시간복잡도가 통과되지 않을 것이라 생각하였는데 통과하여 질문드립니다.제가 알기로는 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'; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-E 수업질문
안녕하세요 큰돌 선생님 좋은강의 항상 감사합니다. 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; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요 접근법에 대한 질문입니다!
http://boj.kr/55862649400e4247b3f86bb00a826ac1해당 문제에서 위의 링크와 같이 코딩을 하는경우, child node가 원래 존재했지만 삭제되어 parent node가 leaf노드가 된 경우를 잡아내지 못하게 됩니다. 코딩을 하다 보니 위와 같은 경우를 떠올리지 못하여 child가 원래 없는 것만 체크하게 되었습니다.이런 실수를 줄일수 있는 방법은 없을까요??그냥 트리관련된 문제는 이런 경우도 있을수 있다! 하고 넘어가야하는 걸까요??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-B 질문입니다.
go 부분에서 이제 행을 뒤집거나 안뒤집거나에 대해서는 이해를 했습니다. 열에 대해서 h,t의 개수를 생각해야 하는건 알겠는데, 안에 있는 for문 중 i*=2를 왜 하는건지 이해가 가질 않습니다.
-
해결됨CUDA 프로그래밍 (4) - C/C++/GPU 병렬 컴퓨팅 - 행렬 matrix 곱하기
global memory를 사용한 matrix copy 대비 global memory를 활용한 matrix transpose가 속도가 느린 이유가 궁금합니다.
안녕하세요.먼저 좋은 강의 감사드립니다. 아래 소스는 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 때문으로 추정하고 있는데, 맞는 생각일까요?감사합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-X 런타임 에러 이유
안녕하세요. 큰돌 강사님, 문제를 풀다가 질문이 생겼습니다. 15683번 "감시" 문제인데요. 이 문제를 저는 아래 방식대로 풀이했습니다. http://boj.kr/7d19fc1e97a44902a3056cd87636f863cctv(vector)에 번호와 위치를 저장합니다. dfs로 각 방향을 모두 정리했습니다. 각각 정해진 dir 방향대로 사각지대의 범위를 지정했습니다. 3-1. ch 함수에서 a 배열을 temp로 복사3-2. 각각 cctv 별로 temp 색칠예제에 나와있는 보기는 모두 정답 입니다만, 문제를 제출하면 런타임 에러가 뜹니다. 이유를 도저히 못 찾겠습니다. 어떤게 문제인지 확인해주시면 감사하겠습니다. ps. 점점 날씨가 쌀쌀해지네요.감기조심하세요!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-C 인구 이동 질문 있습니다
안녕하세요 큰돌님, 아래는 제가 강의 보고 코드를 그대로 구현했는데, 백준에 통과를 못하는 이유를 알 수 있을까요? ㅜㅜ 아무리 찾아보고 디버깅 해봐도 예제 문제 4,5번에 오답이 뜹니다.https://www.acmicpc.net/source/67562965그리고 추가 질문 있습니다.. 이전 강사님 영상에는 dfs 하실때 보통 dfs 함수내에 visited을 정의를 하셨는데, 이번 영상에는 dfs 에 visited를 정의를 안하신 이유도 궁금합니다, 혹시 이전 영상들처럼 dfs에 visited[y][x] = 1 걸어도 문제 풀이가 가능한지 여쭤드리고 싶습니다, 그리고 이번 영상에 다르게 하신 점도 이유도 알고 싶습니다 ㅎㅎ미리 감사합니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-D 왜 틀렸을까요?
알려주시면 감사드립니다 ㅠㅠhttp://boj.kr/55889bf2310f490a82888d282c975425
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-R visited 안써도 괜찮나요 재 방문이 없나요
단 방향이라 그런가요
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-Q 치즈가 없는 경우는 고려하지 않나요?
뭔가 없을 수 도 있는 경우 무조건 있는 경우 구분 하기 어렵네요 한국말이 저번에 안전 지역 문제는 d=0인 비가 오지 않는 경우도 고려해야 하던데 3-D는 무조건 불이 있는 거 같은데 없는 경우도 고려하라고 해서 네... 잘 모르겠어요 문제가 뭐가 뭔지
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
static UserManager um이 함수 밖으로 빠지면 오류가 나네요
static UserManager* GetInstance()//↗{ static UserManager um;//↗, 전역 객체 선언 return &um;} 이 부분에서static UserManager um;//↗, 전역 객체 선언static UserManager* GetInstance()//↗{ return &um;} 이렇게 하니까 1개의 확인할 수 없는 외부 참조입니다.라는 링크 오류가 발생하네요.왜 그런지 궁금한데 혹시 알 수 있을까요?