묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C++
4:30 부근 질문입니다.
ref를 함수 인자로 넘기면 변수의 복사가 일어나는게 아니라 변수를 직접 넘기는 것은 이해했습니다.아래 질문들을 보고 const ref에는 literal도 대입될 수 있다는 것도 이해했구요.그런데, const ref를 함수 인자로 쓰면 literal을 함수 인자로 그대로 쓰는 게 장점이라고 강의에 말씀하셨는데, 그건 그냥 일반 변수를 인자로 받는 함수도 마찬가지 아닌가요? 그게 왜 장점이 되는지 모르겠습니다.아래 코드에서 보시면, doSomething과 doSomething2 역시 doSomething4와 동일하게 literal을 인자로 받을 수 있습니다. literal을 함수 인자로 쓰는 경우는 메모리 주소가 필요한 상황이 아니니(애초에 literal은 R-value니까) 위에서 언급하신 "변수 복사가 아니라 같은 주소값을 갖는 그 변수 자체가 넘어간다"는 이점도 없어보입니다. literal을 인자로 받는 함수에서 인자를 const ref로 받는 것이 정말 다른 경우에 비해 효용성이 큰가요? #include <iostream>using namespace std;void doSomething(const int x) { cout << "In doSomething : " << x << endl; cout << "In Dosomething : " << &x << endl;}void doSomething2(int x) { cout << "In doSomething2 : " << x << endl; cout << "In Dosomething2 : " << &x << endl;}void doSomething3(int& x) { cout << "In doSomething3 : " << x << endl; cout << "In Dosomething3 : " << &x << endl;}void doSomething4(const int& x) { cout << "In doSomething4 : " << x << endl; cout << "In Dosomething4 : " << &x << endl;}int main() { int x = 5; int& ref_x = x; /*ref를 쓰기 위해선 메모리 주소가 있어야 하기 때문에 literal은 대입 불가. 즉, int& ref1 = 5; int& ref2 = 3 + 4; 는 불가능.그러나, const ref는 가능.즉, 아래 코드는 가능. 주소값도 있음*/ const int& ref3 = 3; cout << ref3 << endl; cout << &ref3 << endl; /*심지어 주소도 있음. 그럼 이게 const int ref3 = 3;이랑 뭐가 다르냐? 함수 파라미터로 넣을 때 아주 유용함*/ doSomething(ref3); cout << ref3 << endl; cout << &ref3 << endl; doSomething2(ref3); cout << ref3 << endl; cout << &ref3 << endl; doSomething4(ref3); cout << ref3 << endl; cout << &ref3 << endl; doSomething(90); doSomething2(90); doSomething4(90);//const ref를 함수 입력인자로 받으면 literal 직접 입력 가능 return 0;}
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-O 시간복잡도
안녕하세요 큰돌님!해당 문제의 시간 복잡도 관련된 질문이 있어서 여쭤봅니다.3-O 번 문제에 대해서 어떤 로직을 쓸 지 고민하다가,사다리 3개 조작, 사다리 내려가기 << 이렇게 2 가지 로직이 필요 하다고 생각했습니다.그래서 제가 계산한 바는,사다리 3개 조작 : 300 C 3사다리 내려가기 : 30 * 10이 둘의 로직이 동시에 일어나야 한다고 생각해서,300 C 3 * (30 * 10) 라고 결론 냈습니다.http://boj.kr/475effafef89456687b5176ac5dcf21c(정답코드 링크)그런데, 강의를 보니까선생님은 300 C 3 만 언급하셧는데요. 이 부분이 이해가 되지 않습니다. 정답코드의 재귀 함수만 보더라도, 2중 for문 안에서 go()가 호출되는데, 이런 경우는 사다리 내려가기에 대한 시간복잡도가 영향을 받지 않는건가요?// 경우의 수를 두면서 재귀. for(int i = here; i <= h; i++){ for (int j = 1; j <= n; j++) { // 이미 존재하는 경우는 예외 if(line[i][j] || line[i][j-1] || line[i][j+1]) continue; // 경우의 수 추가 line[i][j] = 1; go(i, cnt + 1); line[i][j] = 0; } } 질문이 좀 길어졌네요. 정리하면 이렇습니다.Q1. 제가 계산했던, 사다리 조작 * 사다리 내려가기 에 대한 시간 복잡도 계산은 틀렸나요? 틀렸다면 어디서 로직 오류가 있는건가요?Q1-1. 혹시, 제가 계산했던 시간 복잡도에서,300 C 3 + (30*10) 으로 계산해도 무방한가요?Q2.선생님은 왜 300 C 3 이라고만 계산하셨나요?완탐이든/백트래킹이든 재귀로 탐색(?)해야 하는 건 알겠는데, go() 함수가 호출되는 2중 for문에 대한 시간복잡도는 계산 안하셨는지 모르겠습니다.답변 기다리고 있겠습니다!감사합니다~!!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-H 질문합니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. https://www.acmicpc.net/source/57910682출력은 제대로 나오는거 같은데 틀렸다고 나와서 어디가 잘못됐는지 모르겠습니다. ㅜㅜ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
스택 큐 연결리스트만 나오는 코테 문제는 없나요?
스택이나 큐 연결리스트 맵 해시 이런거는 코테에서 안 물어보나요? 8주 강의에 있는 것 만 달달 공부하면 네이버 코테 통과할 수 있을까요? 물론 강의가 절대 쉬운 건 아니긴 해요 ㅠㅠ
-
미해결홍정모의 따라하며 배우는 C++
4:04 코드 질문입니다.
변수 앞의 const는 "그 변수의 값"을 안바꾸겠다는 의미지만, 포인터 앞의 const는 "포인터가 저장한 주소값"을 안바꾸겠다는 게 아니라 "그 주소에 있는 값"을 안바꾸겠다는 것. 이라고 설명해주셨는데요.근데 그럼 아래 코드의 13~15째 줄과 충돌되는 내용인 거 아닌가요?14줄이 "ptr2에 저장된 주소값에 있는 값(=value2의 값 = 10)"을 안바꾸겠다는 의미인데, 15번째 줄에서 그걸 12로 변경이 가능한 거로 앞서 설명하셨어서요.게다가, 16번째 줄에 코딩한 대로 추가로 한줄 더 테스트 해보니 역참조로 값에 직접 접근해서 바꾸는 건 또 안되네요. 무슨 차이가 있는 건가요?아래 코드 캡쳐 내 주석 24~29번째 줄도 상술한 것과 같은 내용 질문입니다(강의 들으면서 바로바로 주석으로 적은 질문이라 말투가 좀 날 것 그대로네요..죄송합니다)
-
미해결홍정모의 따라하며 배우는 C++
9:03 코드 질문
delete 후 다시 ptr(주소값)과 *ptr(직접참조:value)를 출력하면, 강의와 달리 주소값부터 다르게 나옵니다. debug 모드로 돌리면 delete 이후 ptr의 주소값이 아예 달라지는데요. 컴파일러 버전에 따라 다른건가요? visual studio 2019 사용 중입니다.
-
미해결홍정모의 따라하며 배우는 C++
코드 작성한 것을 실행시킬 때 ctrl+f5, f5 둘 중 뭘 해야 하나요?
질문 그대로 코드 작성한 것을 실행시킬 때 디버깅하지 않고 시작(ctrl+f5)해서 실행이 되면 맞는 코드인 건가요? 저는 디버깅 시작(f5)을 하면 맞는 코드인데도 프로그램이 끝날 때 항상 exe_common.inl이 뜨면서 if (!__scrt_is_managed_app()) 이 부분에 예외가 발생했다고 떠요. 그래서 저는 그냥 이때까지 ctrl+f5로만 실행시켰었거든요...ㅜㅜ
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
이중 포인터를 이용한 값 변경 질문입니다.
이중 포인터를 이용한 값 변경 질문입니다.const char* msg = "Hello"; 1 번 함수 void SetMessage(const char* msg) { msg = "Bye" // 값이 변경되어지지 않음. // *msg = "Bye" <= 불가능, 식이 수정할수 없는 lvalue } 2 번 함수 void SetMessage(const char** msgPtr) { *msgPtr = "Bye" // 값이 변경됨. }1번 : 함수의 경우 msg는 역참조가 불가능1. 역참조 시 const 타입 주소로 이동. 2. const 타입은 값을 변경할 수 없는 형태임 3. 그래서 1번 함수에서 msg를 역참조해서 값을 변경하는 것은 불가능.2번 : 함수의 경우 msgPtr은 역참조가 가능1. msgPtr은 "Hello"주소값을 가지고 있는, msg 포인터를 가리키고 있음.2. 역참조시 msg 포인터로 이동.3. *msgPtr = "Bye"; <= 이 부분에서 혼동이 와서 질문드립니다.질문 : 2번의 연장선Hello의 시작 주소값은 편의상 HAddr 이라고 칭하겠습니다.1. msg는 8바이트 형태의 포인터이다.2. msg는 "Hello"의 시작 주소값 HAddr을 가지고 있다.3. 해당 시작 주소값은 'H'라는 값을 가지고 있다.4. *msgPtr = "Bye"5. 수행시 - 메모리에 'B', 'y', 'e'라는 값을 가지는 const char* 타입 변수 생성.6. *msgPtr을 통해 msg 포인터를 역참조. - msg포인터가 가지고 있는 값 HAddr을 'Bye'의 시작 주소 값 B의 주소값으로 변경?
-
미해결홍정모의 따라하며 배우는 C++
연습문제 질문
아래와 같이 연습문제를 풀어봤는데요(16번째 줄 Ptractice-while 출력 다음부터).16번째 줄 이전은 수업때 보여주신 출력 코드입니다.visual studio 2019 x64 쓰고있는데, 제가 보는 출력화면에서는 강의대로 입력한 코드에서 마지막 \0이 출력 안되고, jack jack만 출력됩니다.연습문제로 제가 구현한 코드도 jack jack만 출력되구요(마지막 \0 미출력) 컴파일러 버전에 따라 cout이 \0을 출력안하는 건가 싶은데 맞나요?? #include <iostream>using namespace std;int main() { char name[] = "jack jack"; const int n_name = sizeof(name) / sizeof(name[0]); char* ptr = name; for (int i = 0; i < n_name; i++) { cout << *(name + i); } cout << "--"; cout << endl << "----" << endl; cout << "Practice - while" << endl; int i = 0; while (true) { cout << *ptr; ++ptr; if (*ptr == '\0') break; } cout << "--"; return 0;}
-
미해결홍정모의 따라하며 배우는 C++
1:47 uintptr_t 질문입니다.
uintptr_t 가 hex로 반환되는 값을 unsigned int 10진수로 바꿔주는 것으로 알았는데요.직접 형변환을 해보니 값이 다르게 나오네요. 왜그런건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
당근마킷 엔지니어 승원이 예제에 대한 질문입니다
안녕하세요 강사님승원이 예제를 풀다가 궁금한 것이 있어 질문드립니다.승원이의 위치(y, x)를 (sy, sx)로 선언하셨고 문제에서 승원이 위치에서 출발한다고 했기 때문에시작위치는 (sy, sx)이고, 그렇기 때문에 queue에 q.push({sy, sx})를 한 것은 이해가 되었습니다.그 다음 q.front()를 통해 큐에 있는 가장 앞에 있는 요소를 참조하는데 큐에 push했던 (sy, sx)가 아닌 (y, x)가 되는지 이해가 되지 않아서 질문드립니다! 어떻게 push하지 않은 (y, x)가 큐 맨앞에 요소로 참조될 수 있는지 궁금합니다! // 아래는 제 질문에 해당하는 코드입니다while ( q.size() ) { tie ( y , x ) = q.front() ; q.pop() ; // ----???
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[3-G 질문] 오버플로우 다르게 확인 하는 법..
안녕하세요 큰돌님!덕분에, 코테도 준비하며 강의도 잘 보고 있습니다. http://boj.kr/320a351402cb451d8aff7a538e73189d3-G 문제를 공부하면서 질문이 있습니다.Q1. 오버플로우 확인 할 때, 이렇게 작성하면 어떤 문제가 생기나요? visited[next] == visited[here]+1 과 같이, 소모되는 시간이 같은 경우도, 동일한 cnt[]에 누적해야 한다는 로직은 이해했지만 코드로 옮기기 어려워서 질문드립니다 ㅠ*링크 내의 아래와 같이 적힌 부분이 질문입니다.if(next < 0 || next >= MAX || visited[next]) continue;visited[next] = visited[here] + 1;cnt[next] += cnt[here];...if(visited[next] == visited[here]+1) cnt[next] += cnt[here];
-
해결됨홍정모의 따라하며 배우는 C++
소멸자, delete 질문
중요한 내용은 아닌 것 같지만 궁금해서 질문 올려봅니다.8:06 쯤에 작성한 코드 delete[] my_int_arr.m_arr;처럼 쓰지 않고, 클래스 안에서 소멸자와 함께 delete를 쓴다... 는 것은 이해했습니다.그런데 만약에 main함수 속 while문 안에서 delete[]를 쓴다면, 강의처럼 m_arr에 빨간줄을 띄우지 않고 쓸 수 있는 방법이 있나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-E 쿼드트리 질문
string qurad(int y, int x, int size){ if(size == 1) return string(1, a[y][x]); char b = a[y][x]; string ret = ""; bool flag = 0; for(int i = y; i < y + size; i++){ for(int j = x; j < x + size; j++){ if(b != a[i][j]){ ret += '('; ret += quard(y, x, size / 2); ret += quard(y, x + size / 2, size / 2); ret += quard(y + size / 2, x, size / 2); ret += quard(y + size / 2, x + size / 2, size / 2); ret += ')'; return ret; } } } return string(1, a[y][x]); }안녕하세요 선생님 항상 좋은 강의를 올려주셔서 감사합니다. 위에 있는 코드에서 변수 flag는 사용되지 않았는데 혹시 flag를 변수를 선언할 때 어떤 의도로 선언했는지 알려주실 수 있나요?
-
미해결홍정모의 따라하며 배우는 C++
9:56 getRandomNumber 함수 질문
getRandomNumber 함수를 보면,int getRandomNumber(int min, int max){const double fraction = 1.0/(RAND_MAX +1.0);return min+static_case<int>((max-min+1)*(rand()*fraction));} 으로 구현하셨는데요. 여기서 rand의 seed를 time을 이용해 바꾸지 않았으니 매번 실행할 때마다 같은 seed가 들어가서 같은 결과가 나올테니, getRandomNumber함수도 매번 실행할 때마다 같은 값이 나오게 될 것 같은데 맞나요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
nullptr 자체 구현 과정에 대하여 질문이 있습니다.
안녕하세요.nullptr 수업 중 알려주신"nullptr 자체 구현 과정"에 대하여 질문이 있습니다.#include <iostream> using namespace std; #include <vector> #include <list> #include <deque> #include <map> #include <set> #include <algorithm> void Test(void* ptr) { cout << "Test(*)" << endl; } class NullPrt { public: // 그 어떤 타입의 포인터와도 치환 가능 template<typename T> operator T* ()const { return 0; } // 그 어떤 타입의 멤버 포인터와도 치환 가능 template<typename C, typename T> operator T C::* () const { return 0; } private: void operator&() const; // 주소값 &을 막는다. }; const NullPrt _NullPtr; int main() { Test(_NullPtr); return 0; }위와 같은 코드에서 Test(_NullPtr);를 실행하면,왜 NullPtr의 template<typename T> operator T* ()const { return 0; }로 진입하는 지에 대하여 조금만 더 자세히 설명해주실 수있을까요?Test 함수로 _NullPtr 객체를 보내주는데,왜 operator T* () const로 진입하지는 약간 이해가 되지 않습니다. 혹시 관련하여 참고할만한 구글링 키워드를 알려주셔도 좋습니다. ^^항상 잘 배우고 있습니다.감사합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K문제 cnt배열크기 재질문입니다.
http://boj.kr/06440aeccbb045b8829d9cdadf5f6a33이 링크는 답지 12행에 있는 if(cnt[i])가 아니라 while(cnt[i)로 바꾸고 이에 맞춰, 18-20행을 바꿔보았습니다.제출하게되면, 시간초과가 나는데 while을 이용한 제 코드의 시간복잡도는 얼마인가요..? http://boj.kr/1cb106485f6b478ab640c60a6dda5cc0전에 제가 cnt배열크기를 26이 아닌 200으로 설정한 이유를 여쭤봤었는데, 답변으로 26으로 설정해도 되며 강사님께서 200으로 설정한 이유는 크게 잡기 위해서라고 하셨습니다.하지만, 링크를 실행하게되면 배열크기를 26, 30으로 잡고했더니 시간초과가 뜹니다.배열크기를 60, 70으로 설정하면 메모리 초과로 뜹니다. 배열크기를 100으로 해야 정답입니다 라고 뜹니다. 이렇게 배열의 크기가 26이 아닌것 같아서 어떤 근거로 배열 크기를 설정 해야하는지 재 질문 드립니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
완전탐색 시간초과
안녕하세요 큰돌님덕분에 알고리즘을 재미있게 공부하고 있습니다!질문사항이 있는데요완전탐색으로 풀이를 해보았는데 시간초과가 났습니다.그래서 방법을 바꿔 visited를 사용하지 않고 풀어보았는데 통과했습니다.시간초과가 발생한 정확한 이유를 모르겠어서 디버깅을 해보았는데 두코드간의 함수호출 횟수가 분명 차이가 있었습니다.하지만 그 원리를 이해하지 못해서 질문드립니다.디버깅을 하면 할수록 머리가 더 복잡해지는것 같습니다...시간초과 코드http://boj.kr/9ca3908dd4624835a28aca2db266321e정답 코드http://boj.kr/18bd16121a7d46ada6f06e4313594796
-
해결됨CUDA 프로그래밍 (6) - C/C++/GPU 병렬 컴퓨팅 - 서치 & 소트
예제 코드에 대해서 질문 드립니다.
안녕하세요!38-4 강의를 수강하고 예제 코드를 확인하는 과정에서 몇 가지 궁금증이 생겨 질문을 드립니다.kernel 함수 내 변수에서 register를 붙이시던데 이렇게 붙였을때 이점이 있을까요?두 번째 for문 같은 경우에 halfsize *= 2 이렇게 표현할 수 있는데 비트연산으로 나타 내시던데 이유를 알 수 있을까요??변수를 선언할때 unsigned 만 작성하시던데 이것도 이유가 있을까요??어찌 보면 굉장히 사소할 수 있는 질문들이지만, 그래도 이유를 알면 배울 수 있는 부분이 많을거 같아 질문 드립니다.
-
미해결홍정모의 따라하며 배우는 C++
conditional operator 우선순위 질문
강의 마지막부분에서 int x = 5;cout << (x % 2 == 0) ? "even" : "odd" << endl;이 코드에서 가운데 출력부분에 전체 괄호를 감싸지 않으면 오류가 나는 이유를 생각해 보라고 해주셨는데 잘 모르겠어서 질문드립니다. 찾아보면 결합방향이 오른쪽에서 왼쪽이라고 되어있긴한데 오른쪽에서 왼쪽이라는게 저 위에 코드에서는 어떻게 적용이되는지가 이해가 잘 안되네요.. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.