묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2주차 visited배열 타입관련 질문
안녕하세요 선생님 항상 질좋고 열정넘치는 강의를 만들어 주셔서 감사합니다 다름이 아니라 2주차 visited[]을 선언할 때 bool타입과 int형 두가지 타입을 쓰시는데 어떤 기준으로 두 가지 타입을 나눠 써야 하나요??
-
미해결홍정모의 따라하며 배우는 C++
22:15 두줄을 한줄로 할수 있다고 한 부분 답 질문!
비트 플래그 강의 중 22:15초 에 두 줄에서 한 줄로 줄여 사용할 수 있다고 한 부분이 있는 데,items_flag ^= opt2 | opt1;이거 맞나요???
-
해결됨홍정모의 따라하며 배우는 C++
얕은 복사시 소유권 박탈에 관한 질문
#include <iostream> //#include "autoptr.h" #include "autoptr2.h" #include "resource.h" #include "Timer.h" AutoPtr<Resource> generateResource() // AutoPtr<Resource> 타입을 리턴하는 함수 { // 10000000 의 length를 가진 Resource타입의 멤버를 가지는 AutoPtr 객체 생성 AutoPtr<Resource> res(new Resource(10000000)); return res; } int main() { using namespace std; streambuf* orig_buf = cout.rdbuf(); // cout.rdbuf(NULL); 화면에 출력되는 메세지들 끄기. 시간 어마어마하게 걸릴테니까 😎 Timer timer; { AutoPtr<Resource> main_res; main_res = generateResource(); // ⭐ generateResource() 리턴값은 R-value } cout.rdbuf(orig_buf); //cout << timer.elapsed() << endl; timer.elapsed();//실행시간 재서 출력 } 메인.cpp#pragma once #include <iostream> using namespace std; template<typename T> class AutoPtr { public: T* m_ptr; public: AutoPtr(T* ptr = nullptr) :m_ptr(ptr) { cout << "AutoPtr default constructor" << endl; } ~AutoPtr() { cout << "AutoPtr destructor" << endl; if (m_ptr != nullptr) delete m_ptr; } AutoPtr(AutoPtr&& a) // ⭐이동생성자⭐ : m_ptr(a.m_ptr) // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! { cout << "AutoPtr move constructor" << endl; a.m_ptr = nullptr; // really necessary? } AutoPtr& operator = (AutoPtr&& a) //R-value 레퍼런스 , ⭐*이동 대입 연산자 오버로딩⭐ { cout << "AutoPtr move assignment" << endl; if (&a == this) return *this; // 공간은 비워줘야하는 것 똑같고 (delete 안하고 그냥 대입하면 메모리 누수가 발생할 수 있다) if (m_ptr != nullptr) delete m_ptr; m_ptr = a.m_ptr; // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! a.m_ptr = nullptr; // 소유권 박탈 return *this; } T& operator *() const { return *m_ptr; } T* operator ->() const { return m_ptr; } bool inNull() const { return m_ptr == nullptr; } };AutoPtr.h#pragma once #include <iostream> using namespace std; class Resource { public: int* m_data = nullptr; unsigned m_length = 0; public: Resource() // 기본 생성자 { cout << "Resource constructed" << endl; } Resource(unsigned length) // 일반 매개변수 1개 생성자 { cout << "Resource length constructed" << endl; this->m_data = new int[length]; this->m_length = length; } Resource(const Resource& res) // 💎복사 생성자💎 { cout << "Resource copy constructed" << endl; Resource(res.m_length); for (unsigned i = 0; i < m_length; ++i) // 내용물을 전부 깊은 복사 (시간이 꽤 걸림) m_data[i] = res.m_data[i]; } ~Resource() // 소멸자 { cout << "Resource destroyed" << endl; } Resource& operator = (Resource& res) // 💎대입 연산자 오버로딩💎 { cout << "Resource copy assignment" << endl; if (&res == this) return *this; // 대입하려는게 자기 자신이면 아무것도 안함 if (this->m_data != nullptr) delete[] m_data; // 1. 내 자신의 m_data 비워주기 m_length = res.m_length; // 2. 대입으로 넘겨받은 res의 length 로 내 length 갱신 m_data = new int[m_length]; // 3. 비워진 내 자신의 m_data에 새로운 공간 할당받기 for (unsigned i = 0; i < m_length; ++i) // 4. m_data내용물 넣기. m_data[i] = res.m_data[i]; // 대입으로 넘겨받은 res의 m_data 내용물들을 **내 m_data**에 깊은 복사 return *this; } };Resource.h 위 3코드는 수업에 나온 코드입니다. 얕은 복사시에 강사님께서 소유권 박탈의 목적으로 매개변수로 받은 참조 객체의 private변수인 포인터변수를 꼭 nullptr로 초기화를 해주는것이 깔끔하다고 하셨습니다.예를 들면AutoPtr(AutoPtr&& a) // ⭐이동생성자⭐ : m_ptr(a.m_ptr) // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! { cout << "AutoPtr move constructor" << endl; a.m_ptr = nullptr; // really necessary? }이나AutoPtr& operator = (AutoPtr&& a) //R-value 레퍼런스 , ⭐*이동 대입 연산자 오버로딩⭐ { cout << "AutoPtr move assignment" << endl; if (&a == this) return *this; // 공간은 비워줘야하는 것 똑같고 (delete 안하고 그냥 대입하면 메모리 누수가 발생할 수 있다) if (m_ptr != nullptr) delete m_ptr; m_ptr = a.m_ptr; // ⭐얕은 복사⭐ 그냥 대입만 하면 땡이다! a.m_ptr = nullptr; // 소유권 박탈 return *this; }이 부분에서 a.m_ptr=nullptr;이렇게요. 질문1. nullptr로 초기화를 안시키면(소유권 박탈을 안하면) 문제가 생기나요?2.제가 찾아보니까 "박탈 시키지 않으면 대입 연산자 인수로 이 인스턴스를 참조 하게 된 매개 변수 AutoPtr && a가 대입 연산자 호출이 종료됨에 따라 소멸자가 호출되어 delete될 수 있기 때문이다." 라는 글을 어디서 봤는데 이게 무슨말인지 모르겠는데 맞는 말인가요??3.저 위의 코드에서 혹시 매개변수로 기능하는AutoPtr && a같은 매개변수 객체도 함수 호출시에정식적인 객체 처럼 생성자와 소멸자를 호출하나요?안하는걸로 알고있고 안하기 때문에 2번 질문이 이해가 안되서 질문하는거거든요.혹시 제가 햇갈리고 있나 싶어서 다시 질문드립니다.
-
해결됨홍정모의 따라하며 배우는 C++
수업시간 코드인데 결과값이 왜 이렇게 나오는지 궁금합니다.
#include <iostream> #include "autoptr.h" //#include "autoptr2.h" #include "resource.h" #include "Timer.h" AutoPtr<Resource> generateResource() // AutoPtr<Resource> 타입을 리턴하는 함수 { // 10000000 의 length를 가진 Resource타입의 멤버를 가지는 AutoPtr 객체 생성 AutoPtr<Resource> res(new Resource(10000000)); return res; } int main() { using namespace std; streambuf* orig_buf = cout.rdbuf(); // cout.rdbuf(NULL); 화면에 출력되는 메세지들 끄기. 시간 어마어마하게 걸릴테니까 😎 Timer timer; { AutoPtr<Resource> main_res; main_res = generateResource(); // ⭐ generateResource() 리턴값은 R-value } cout.rdbuf(orig_buf); //cout << timer.elapsed() << endl; timer.elapsed();//실행시간 재서 출력 }메인.cpp#pragma once #include <iostream> using namespace std; template<typename T> class AutoPtr { public: T* m_ptr; public: AutoPtr(T* ptr = nullptr) :m_ptr(ptr) { cout << "AutoPtr default constructor" << endl; } ~AutoPtr() { cout << "AutoPtr destructor" << endl; if (m_ptr != nullptr) delete m_ptr; } AutoPtr(const AutoPtr& a) // 💎복사 생성자💎 { cout << "AutoPtr copy constructor" << endl; // deep copy m_ptr = new T; // T가 Resource 타입으로 들어오면 m_ptr은 Resource 타입의 포인터 *m_ptr = *a.m_ptr; // ⭐Resource의 '대입 연산자 오버로딩 호출 , deep copy } AutoPtr& operator = (const AutoPtr& a) //L-value 레퍼런스 , 💎대입 연산자 오버로딩💎 { cout << "AutoPtr copy assignment" << endl; if (&a == this) return *this; if (m_ptr != nullptr) delete m_ptr; // deep copy m_ptr = new T; // 새로운 빈 공간 할당 받기. T가 Resource 타입으로 들어오면 m_ptr은 Resource 타입의 포인터 *m_ptr = *a.m_ptr; // ⭐Resource의 '대입 연산자 오버로딩' 호출 , deep copy return *this; } T& operator *() const { return *m_ptr; } T* operator ->() const { return m_ptr; } bool inNull() const { return m_ptr == nullptr; } };AutoPtr 헤더파일#pragma once #include <iostream> using namespace std; class Resource { public: int* m_data = nullptr; unsigned m_length = 0; public: Resource() // 기본 생성자 { cout << "Resource constructed" << endl; } Resource(unsigned length) // 일반 매개변수 1개 생성자 { cout << "Resource length constructed" << endl; this->m_data = new int[length]; this->m_length = length; } Resource(const Resource& res) // 💎복사 생성자💎 { cout << "Resource copy constructed" << endl; Resource(res.m_length); for (unsigned i = 0; i < m_length; ++i) // 내용물을 전부 깊은 복사 (시간이 꽤 걸림) m_data[i] = res.m_data[i]; } ~Resource() // 소멸자 { cout << "Resource destroyed" << endl; } Resource& operator = (Resource& res) // 💎대입 연산자 오버로딩💎 { cout << "Resource copy assignment" << endl; if (&res == this) return *this; // 대입하려는게 자기 자신이면 아무것도 안함 if (this->m_data != nullptr) delete[] m_data; // 1. 내 자신의 m_data 비워주기 m_length = res.m_length; // 2. 대입으로 넘겨받은 res의 length 로 내 length 갱신 m_data = new int[m_length]; // 3. 비워진 내 자신의 m_data에 새로운 공간 할당받기 for (unsigned i = 0; i < m_length; ++i) // 4. m_data내용물 넣기. m_data[i] = res.m_data[i]; // 대입으로 넘겨받은 res의 m_data 내용물들을 **내 m_data**에 깊은 복사 return *this; } };Resource헤더파일 결과값이AutoPtr default constructorResource length constructedAutoPtr default constructorAutoPtr copy assignmentResource constructedResource copy assignmentAutoPtr destructorResource destroyedAutoPtr destructorResource destroyed 이렇게 나왔습니다.여기서 궁금한점은 소멸자 출력문구 순서인데요디버깅을 해봤는데Timer timer;{AutoPtr<Resource> main_res;main_res = generateResource();}이 지역범위를 벗어나고 소멸자 호출을 시작하는데 정확히 main_res = generateResource(); 이부분에서AutoPtr destructorResource destroyedAutoPtr destructorResource destroyed이 4번의 소멸자가 호출됩니다. 그에 대한 설명을 나름 추리해봤는데 제 설명이 맞는지 확인해주시고 혹시 틀렸다면 정확히 어떤점에서 틀렸고 어떠한 근거로 저 소멸자호출문구가 출력 되는건지 알려주실 수 있나요? 저의 설명==================================AutoPtr destructor >>> generateResource() 함수의 리턴 값인 res를 블럭이 끝나면서 소멸자로 할당값을 해제해주는 과정에서 소멸자 호출 Resource destroyed >>> 소멸자 호출 문구 출력 이후 if (m_ptr != nullptr) delete m_ptr; 구문 실행과정에서 m_ptr이 resource타입이니까 삭제시에 resource 소멸자 호출 AutoPtr destructor >>> main_res 역시 해제하기 위해 autoptr의 소멸자 호출 Resource destroyed >>>소멸자 호출 문구 출력 이후 if (m_ptr != nullptr) delete m_ptr; 구문 실행과정에서m_ptr이 resource타입이니까 삭제시에 resource 소멸자 호출
-
미해결홍정모의 따라하며 배우는 C++
3.8 퀴즈 답
0110 >> 2 -> decimal답 : 1.....영상에서는 앞에 0을 붙여서 8진수로 계산되어 18이 되는 데, 2진수를 나타낸 문제로 파악하여 답은 1입니다.5 | 12 답 : 1101 (십진수로 13)5 & 12답 : 0100 (십진수로 4)5 ^ 12답 : 1001 (십진수로 9)
-
미해결홍정모의 따라하며 배우는 C++
3.7 이진수 영상 마지막 연습 문제 답 이거 맞나요??
이진수 0100 1101을 10진수로답 : 7710진수 93을 8비트 무부호 정수로답 : 0101 110110진수 -93을 8비트 부호 정수로답 : 1010 00112진수 1010 0010을 무부호 10진수로답 : 162(8번째자리도 해당 되기 때문)같은 2진수를 부호가 있는 10진수로답 : -93(8번째 자리는 부호이기 때문에 제외, 2의 보수 형태로 보기는 어렵기 때문에, 양수로 전환후, - 붙임)
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-G 예외처리 질문입니다.
안녕하세요 선생님! 강의 항상 잘 보고 있습니다. 저는 이 문제 예외처리를 합해서 생각한 게 아니라 나눠서 비교해도 될 것 같아서 그렇게 로직을 짰는데, 실패했고 '내 코드보기'를 하면 Error를 뱉고 있더라고요 혹시 어떤 문제일까요?강의 보고 합한 걸로 처리하니까 통과 됐고, 합해서 하는 게 더 좋은 거라는 생각은 했는데, 나눠서 생각한 게 왜 틀린지를 잘 모르겠습니다. 33~36 line 입니다. 링크 첨부합니다~https://www.acmicpc.net/source/57441252
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K 관련 질문 드립니다!
안녕하세요 큰돌님! 다름이 아니라 1-K를 이런 식으로 풀어봤습니다. 하지만 자꾸 틀리는데 반례를 못찾겠어서 질문 드려봅니다. <코드 설명>저 같은 경우 map을 이용해 <한 문자, 문자 개수>를 만들어 개수가 홀수인 문자가 2개 이상이면 "I' m sorry Hansoo"를 출력하며 종료하고 그 외에는 팰린드롬을 만듭니다. 팰린드롬은 다시 문자의 개수가 홀수인 문자가 존재하는 경우와 아닌 경우로 나뉘는데, 존재하는 경우 tmp에 잠시 저장해놓고 나머지는 ret에 철자순으로 저장합니다그리고 tmp를 ret에 붙인 다음에 substr로 해당 문자열을 복사한 뒤 temp에 저장합니다. 마지막으로 temp를 reverse로 역순배치를 하여 ret에 이어붙입니다.최종적으로 이를 출력하는 로직입니다.(문자의 개수가 모두 짝수인 경우는 tmp를 ret에 붙이는 과정만 없고 나머진 동일합니다)정말 열심히 생각해서 풀었는데 왜 틀렸는지 조차 몰라서 매우 속상합니다...반례나 틀린 부분이 어디인지 알려주신다면 정말 정말 감사하겠습니다...! #include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); map<char, int> mp; string word, ret; bool isOdd = false; int cnt = 0; char tmp; cin >> word; for(int i = 0; i < word.size(); i++) { mp[word[i]]++; } for(auto it : mp) { if((it).second % 2 == 1) { cnt++; if(cnt > 1) { cout << "I'm Sorry Hansoo"; break; } tmp = (it).first; isOdd = true; for(int i = 0; i < (it).second / 2; i++){ ret += (it).first; } } else { for(int i = 0; i < (it).second / 2; i++){ ret += (it).first; } } } string word2 = ret; if(isOdd) { word2 += tmp; string temp = ret.substr(0, temp.size() - 1); reverse(temp.begin(), temp.end()); word2 += temp; } else { string temp = ret.substr(0, temp.size()); reverse(temp.begin(), temp.end()); word2 += temp; } if(cnt < 2) cout << word2; return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
알고리즘 교안 33p 질문
알고리즘 교안 33pa.find("love") 부분에 대한 이해가 맞는지 질문드립니다.it = a.find("love") 에서 it 값이 love가 있다라고 결정되면it != string::npos -> string::npos(string이 없다)와 값이 같지 않아서 있다고 인정된다맞을까요? C언어에 대한 기초 강의를 듣고 시작해도 조금 버겁네요ㅜㅜ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-B 시간 복잡도..!
#include <bits/stdc++.h> using namespace std; int N, M, res; int vis[54][54]; char bd[54][54]; string s; vector<pair<int,int>> land; vector<int> select_land; int dy[4] = {0, -1, 0, 1}; int dx[4] = {1, 0, -1, 0}; void bfs(){ pair<int,int> st = land[select_land[0]]; // land pair<int, int> ed = land[select_land[1]]; // land queue<pair<int,int>> Q; Q.push({st.first, st.second}); // Q삽입 vis[st.first][st.second] = 1; // 방문표시 while(!Q.empty()){ pair<int, int> cur = Q.front(); Q.pop(); for(int dir = 0 ; dir < 4 ; dir++){ int ny = cur.first + dy[dir]; int nx = cur.second + dx[dir]; if(ny==ed.first && nx==ed.second) { vis[ny][nx] = vis[cur.first][cur.second] + 1; res = max(res, vis[ny][nx]); return; // 도착하면 종료 } if(ny >= N || nx >= M || ny < 0 || nx < 0) continue; if(bd[ny][nx]=='W' || vis[ny][nx]!=0) continue; // 방문했거나 물이면 pass Q.push({ny, nx}); vis[ny][nx] = vis[cur.first][cur.second] + 1; } } // 도착하지 못했다면, 그냥 for문을 빠져나옴. (res 업데이트 필요 X) } void solve(int n){ if(select_land.size()==2){ // 2개를 고름. bfs(); fill(&vis[0][0], &vis[0][0] + 54*54, 0); // vis배열 초기화 return; } for(int i = n+1 ; i < land.size() ; i++){ // 땅 전체 개수 (0번부터 land.size()-1번까지) select_land.push_back(i); // 01, 02, 03 ..... solve(i); select_land.pop_back(); } return; } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> M; for(int i = 0 ; i < N ; i++){ cin >> s; for(int j = 0 ; j < M ; j++){ bd[i][j] = s[j]; if(s[j]=='L') land.push_back({i,j}); } } // 입력 받기 solve(-1); cout << res-1; }저는 랜드를 모두 구해서 랜드 중에 2개를 뽑고, 최단거리를 구하고 최단거리중 최대값을 뽑는 로직으로 구해봤습니다. 그런데 시간복잡도에서 계속 걸리네요 ㅠㅠ 혹시 크기가 50*50이라 재귀적으로 하려했는데 이 코드는 시간복잡도가 어떻게 되나요 ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 실습 강의 질문합니다.
포인터 실습 강의를 다 보고 연습할 겸 플레이어를 만들고 플레이어가 레벨업을 할 경우 영구적으로 스탯이 증가하는 것을 만드려고 하는데 생각대로 안되더군요..포인터만 사용해서는 만들 수 없는 건가요? struct statinfo{ int hp; int atk; int def;};void player(statinfo* playerinfo){ playerinfo->hp = 300; playerinfo->atk = 30; playerinfo->def = 20;}int playerup(statinfo* abc){ int up = (abc->hp) + 12; cout << up << endl; return up;}int main(){ statinfo playerstat; statinfo* playerstatPTR = &playerstat; player(&playerstat); cout << playerstat.hp << endl; cout << playerstatPTR->hp << endl; playerup(&playerstat);}
-
해결됨CUDA 프로그래밍 (2) - C/C++/GPU 병렬 컴퓨팅 - 벡터 vector 더하기
15강 Block ID 예제 오류 질문입니다.
안녕하세요?Jetson TX2 및 Xavier를 사용하여 CUDA예제를 실행하고 있습니다.Block 예제에서 tx2와 xavier의 결과가 달라서 질문드립니다.dimgrid<<<2,2,1>>>에 의해 Block의 갯수가 4개가 되고, warpid=0인 영역은 blockid가 (0,0), (1,0), (0,1), (1,1)인 곳에서 총 4개가 있을 것입니다.하지만 Tx2에서 예제를 돌려본 결과 blockid가 (0,0), (1,0)인 곳에만 나옵니다.혹시나 해서 xavier에서 실험을 해본 결과 총 4개가 나와 정상적으로 출력됩니다.CUDA언어는 GPU구조와 상관 없이 출력되기 위해 grid-block-thread 구조를 가지므로 속도는 느리지만 동일한 결과를 출력해야하는데, 왜 tx2와 xavier가 같은 예제를 돌렸는데도 다른 결과가 나오는걸까요? (혹시나 해서 <<<2,2,1>>> => <<<4,1,1>>>로 변경하여 돌려봤지만 여전히 tx2에서 blockid 2개만 출력되었습니다.)
-
미해결홍정모의 따라하며 배우는 C++
8:30 printcolorName 함수 switch case 통해 구현 시 질문입니다.
printcolorName 함수를 switch case 구문으로 구현해놓고,main 함수에서 int 형태의 입력 x를 받아 printcolorName(x) 함수를 돌렸는데요. C2664(인수 타입변환 에러)가 발생합니다.인수 x 를 printcolorName함수 입력 자료형인 COLORS로 형변환 하고, printcolorName 함수 내에서 switch case 구문을 이용하기 위해 다시 이 인수를 int로 형변환 하니 정상 실행되네요. 강의에서 알려주신 대로 case에 COLOR 자료형을 직접 넣는것과 별개로, 이렇게 형변환을 거듭해서 사용해도 문제는 없나요?강의에서는 main 함수에서도 int 형 인수가 아닌 COLORS::BLACK를 써서 간단한 것 같긴 한데요.. #include <iostream>using namespace std;enum class COLORS{BLACK,WHITE,RED,GREEN,BLUE,};void PrintColorName(COLORS color) {/*if (color == COLORS::BLACK) cout << "Black" << endl;else if (color == COLORS::WHITE) cout << "White" << endl;else if (color == COLORS::RED) cout << "Red" << endl;...이런식으로 모든 경우에 대해 else if 쓰는 건 너무 불편이때 switch case 문 활용*/switch (static_cast<int>(color)) {case 0:cout << "Black";break;case 1:cout << "White";break;case 2:cout << "Red";break;case 3:cout << "Green";break;case 4:cout << "Blue";break;}}int main() {//PrintColorName(COLORS::BLACK);int x;cin >> x;PrintColorName(static_cast<COLORS>(x));return 0;}
-
미해결홍정모의 따라하며 배우는 C++
8:14부근 코드 질문입니다.
if문 조건부에 constant 1을 넣어서 무조건 실행되게 하면, if문 전 main 함수에 의해 int x=10이 설정되고 cin으로 임의 입력값을 받는데요.이 다음에 if문이 실행되면, 또다시 int x =5를 선언하는데 왜 에러가 안나나요? 같은 변수명 x를 중복선언하는 것 아닌가요?if문 안의 실행부가 x=5이면 이전에 선언해놨던 x에 값만 5로 대입하는 것으로 이해가 되는데요.새로 int x를 또 선언하는데 중복에러가 안나는 이유가 궁금합니다. 아래는 그 코드입니다. #include <iostream>using namespace std;int main() { int x=10; cin >> x; if (x > 10) cout << x << " is greater than 10" << endl; else cout << x << " is not greater than 10" << endl; cout << endl; if (1) int x = 5; else int x = 6; cout << x << endl; return 0;}
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-T 질문있습니다..!
안녕하세요!! 이 문제 해설 코드를 보다가 궁금한 점이 생겨서 질문 드립니다.상어가 이동하고 한칸에 두마리가 있을 때 큰 상어가 나머지 상어를 먹는 부분인데요, 제가 잘못 이해하고 있는 건가 싶은게 있습니다. 코드 67번째 줄 부분인데요. # i는 1부터 M까지 if(temp[ny][nx]) { if(a[temp[ny][nx]].z < a[i].z) { a[temp[ny][nx]].death = 1; temp[ny][nx] = i; } else a[i].death = 1; } else temp[ny][nx] = i;이때 i가 1인 경우에도 이미 상어가 있는 곳으로 이동하는 경우도 있을 수 있지 않나요?제가 잘못 이해하고 있는건지.. 고민하다가 질문드립니다. 감사합니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-H 강의 질문 입니다.
5-H 풀이 강의투포인트 개념적용되는 문제로,중복되는 숫자가 나올때까지 e 를 증가시키고중복되는 수가 나오면 s 를 증가시키는 개념인 것은 이해를 했습니다만,s/e 가 변화해가면서 실질적으로 경우의 수를 산출하는 디테일한 부분에서 설명하신 내용만으로는 이해되지 않는 부분이 있어 질문 남깁니다. 4:41 경에1을 포함하는 집합을 다 빼야한다고 말씀해주셨는데요.말씀하신 문맥 흐름 상으로만 보면 경우의수에서 뺀다는 뜻으로 이해가 될 수가 있을 것 같습니다.코드상 ret 에는 아래와 같이 더해주는데 ret+=(e-s);뺀다는 표현이 어떤 의미인지 확인 부탁드립니다.코드 기반으로 제가 이해한 것은e = 3, s = 0 인 경우 (e-s) = 3 이고,1 / 12 / 123 에 대한 경우의 수를 ret 에다가 더해주는 것으로 저는 이해했습니다. 4:59 경에s=1 이 되면서 "이 구간(=갈색구간?)" 이 완성되는거라고 하셨는데, s 가 0 에서 1 이 되면서 비로소 2 / 3 / 1 구간 설정이 되는것인데, s=1 이 되고 2 / 3 / 1 구간에 대한 경우의 수를 확인할수있게 되는 것으로 보이는데요완성되었다는 표현이 어떤것을 의미하는것인가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2주차는 교안에 원래 없는건가요?
그래프 내용이 없네요 ㅠㅠ 그냥 화면에 있는거 받아적으면 되나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
연구소 조합 재귀풀이
안녕하세요 큰돌님.강의 너무나도 잘 보며 공부하고 있습니다!2-p 연구소 조합을 재귀로 작성해 보았습니다.for문으로 조합을 구하는것과 별로 다른것이 없는거 같은데 재귀로 구하니 백준 2번째 테케가 틀리게 나옵니다! 시간되실때 봐주시면 정말 감사드리겠습니다!http://boj.kr/7ee04a6b382f416abe6647adff8912c6
-
해결됨CUDA 프로그래밍 (5) - C/C++/GPU 병렬 컴퓨팅 - 아토믹 연산 atomic op
32-2의 warp의 early terminate에 대해 질문드립니다.
안녕하세요!정말 재미있게 강의를 보고 있습니다.그런데 강의 32-2를 보다 궁금증이 생겨 질문 드립니다!warp의 early terminate가 정확히 어떤 동작인지 궁금한데요. 제가 생각해 볼 때 __syncthreads() 함수를 호출하게 되면, 블록 내 모든 스레드가 해당 함수에 도달하기까지 대기해야 하고 그러면 뒤에 더 이상의 동작이 없는 Warp들이라 하더라고 해당 함수에서 대기하고 있는 상태여야 할거 같습니다.따라서 그러면 해당 warp는 다른 warp들이 동작을 마칠때까지 기다리게 되어 리소스를 반환하거나 하는 동작이 없을거 같은데 왜이렇게 성능이 향상되는지 궁금합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-J질문
http://boj.kr/b293b7352cda4189a70ce187abf9f9420퍼에서 바로 틀렸습니다 가 계속 뜨는데 어디가 잘못된건지 모르겠습니다. 한줄한줄 보기도하고 TC다 넣어봤는데 이상이 없었습니다