선생님 안녕하세요!! 다름이 아니라 p147의 재귀를 이용한 순열에서 코드 질문이 있어 질문 남깁니다.!! swap(a[i], a[depth]); makePermutation(n, r, depth + 1); swap(a[i], a[depth]); 여기서 마지막에 swap함수를 한번 더 사용하는지 이유를 잘 모르겠습니다. 결국에 중간에 재귀함수로 돌면서 종료조건을 지키면 마지막에 swap을 한번 더 하는 의미가 무엇인지 모르겠습니다!! 알려주시면 감사하겠습니다!!!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 스스로 코드를 짜고 틀려서 한자리 입력에서 잘못된 것 같아서 반례를 계속 실행하던 중 특이한 점을 발견했습니다. 반례 중 3 1 1:0 2 1:1 2 2:0 을 사용해서 실행해봤습니다. 이때 제 코드가 계속 올바른 답이 나오지 않아서 선생님이 해주신 코드로 했을 때도 특이하게 실행 결과가 00:00 46:00 다음과 같이 나옵니다. 제출했을 때는 맞았다고 뜨긴합니다... 제가 생각한 예제가 아예 잘못 생각한 예제인지 궁금합니다.
단일 상속 시에는 member initializer list에서 부모 클래스의 생성자와 멤버 간의 순서를 바꾸어도 무조건 부모 클래스의 생성자가 먼저 호출되었었는데, 다중 상속시에는 어떤 부모 클래스의 생성자가 먼저 호출될 지 궁금해서 테스트를 해봤습니다. // USBDevice의 constructor USBDevice(long id) : m_id(id) { cout << "USB" << endl; } // ~~~ // NetworkDevice의 constructor NetworkDevice(long id) : m_id(id) { cout << "Network" << endl; } 먼저 생성자의 호출 순서를 알 수 있게 간단하게 문자열을 출력하도록 수정하였습니다. class USBNetworkDevice : public USBDevice, public NetworkDevice { public: USBNetworkDevice(long usb_id, long net_id) : USBDevice(usb_id), NetworkDevice(net_id) { } }; 위 코드와 같은 수정하지 않은 상태에서는 USB 가 먼저 출력되고 그 다음 Network 가 출력되었습니다. member initializer list에서 순서를 바꾸어도 똑같았구요. class USBNetworkDevice : public NetworkDevice, public USBDevice { public: USBNetworkDevice(long usb_id, long net_id) : USBDevice(usb_id), NetworkDevice(net_id) { } }; 다음으로는 상속할 클래스를 나열할 때의 순서를 바꾸었더니 Network 가 먼저 출력되고 다음으로 USB 가 출력되었습니다. 상속할 클래스를 나열한 순서에 따라서 생성자의 호출 순서가 바뀐다고 보면 될까요? 아 그리고 이런 생성자 호출 순서를 고려해야 하는 작업이 있나요? 객체지향적으로 설계한다면 생성자의 호출 순서에 따라 결과가 바뀌도록 설계하진 않을 것 같아서요.
*, %는 연산자 우선순위가 같으니까 6:00 부근쯤 설명한 분배법칙을 적용하려면 해당 코드를 변경(주석처리 부분)해야 하는것 아닌가요? typedef long long ll; ll go(ll a, ll b, ll c) { if (b == 1) { return a % c; } ll ret = go(a, b / 2, c); //ret = (ret * ret) % c; ret = ret % c * ret % c; if (b % 2) { ret = (ret * a) % c; } return ret; }
한 GameObject 내부에서 선언되는 Parent, Children와 한 MeshRenderer 내부에서 선언되는 Mesh, Material 등등과 같은 리소스들은 각각 Scene과 ResourceManager내부에서 관리(생성, 파괴)되기 때문에 이런 관리해주는 클래스 에서만 shared_ptr로 생성해주고 다른 클래스 에서는 weak_ptr로 전해받았었습니다. 그런데 문뜩 든 생각이 결국 다른 클래스에서 이런 객체들을 사용하기 위해 프레임마다 weak_ptr::lock을 사용하여 shared_ptr로 만들어서 사용할텐데 이러면 비용 부담이 너무 많이되어 배보다 배꼽이 큰 상황이 발생하는 것 같다는 생각이 들었고 이럴바엔 그냥 왠만한 클래스에선 리소스를 shared_ptr로 선언하고 사용한 후 관리해주는 클래스(Scene, ResourceManager)들에서 삭제될때 여기서도 동시에 shared_ptr를 지워버리는식으로 관리를 해주는게 더 좋을 것 같다고 생각을했는데 과연 옳은 생각인 건가요?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
void ChooseLotto(int numbers[], int count) { // 랜덤으로 1~45 사이의 숫자 6개.... 중복 없이 int lotto[45]; for (int i = 0; i < 45; i++) { lotto[i] = i + 1; } // 공을 섞는 과정 for (int i = 0; i < 1000; i++) { int randNum1 = rand() % 45; int randNum2 = rand() % 45; Swap(&lotto[randNum1], &lotto[randNum2]); } for (int i = 0; i < count; i++) { numbers[i] = lotto[i]; } } 안녕하세요, 강의 잘 보고 있습니다. 저는 실습 풀이를 이렇게 했는데요. 로또 추첨을 할 때 커다란 통에 공을 집어넣고 6개의 번호가 쓰인 공을 꺼낸다고 하면, 한 번 꺼낸 공은 다시 추첨기에서 나오지 않아야 한다고 생각했습니다. 따라서 1~45의 값이 들어있는 배열을 선언하고, 해당 배열을 rand()와 swap()을 이용해 계속 반복하여 섞어주고, 마지막에 0번~5번 인덱스까지 6개의 수를 numbers 배열에 담아주었습니다. 이런 방식으로 로또 번호를 생성하는 것도 랜덤으로 번호를 생성한 것이라고 볼 수 있을까요?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
bool Handle_C_LEAVE_GAME(PacketSessionRef& session, Protocol::C_LEAVE_GAME& pkt) { auto gameSession = static_pointer_cast<GameSession>(session); PlayerRef player = gameSession->player.load(); if (player == nullptr) return false; RoomRef room = player->room.load().lock(); if (room == nullptr) return false; room->HandleLeavePlayer(player); return true; } 잡큐에서 처리를 한다면 문제가 발생하지 않을거로 보이지만, 잡큐에서 실행하지 않고 room->HandleLeavePlayer 함수를 직접 호출하고 있습니다. _objects 자료구조에 접근하여 제거하는데요 Thread Safe 하지 않을거로 보여서요. 혹시 의도된건지 궁금합니다. 코드 흐름상 이정도는 알아서 수정하세요라는 느낌이 강하지만 혹시나해서 여쭤봅니다.
[Qt/QML 기초 Part 1] C++ 연동과 시그널-슬롯으로 배우는 크로스플랫폼 앱 개발
강의에서 알려주신 것처럼 Visual studio 2019 community와 QT6를 설치했는데 아래 에러가 뜨면서 실행이 안되네요.. "ninja: build stopped: subcommand failed." 영상에서 알려준 설정을 모두 동일하게 적용했는데 왜 그럴까요..ㅜㅜ
큰돌님 안녕하세요. 저는 이 문제를 map을 쓰지 않고 그냥 vector에서 find_if함수를 이용하여 풀었는데요. 제가 생각했을때에 sort한다면 입력받는 순서대로 vector에 push하게 되니까 먼저 나온것이 앞에 있어야된다는 조건을 자동적으로 처리될꺼라 생각했는데 오류가 났습니다. 그래서 stable_sort를 사용하여 결국 풀긴했는데 왜 그냥 sort는 안되는 것일까요? 소스코드 : http://boj.kr/84577fb3c0724cc3954dfd6ccfa2b412
안녕하세요, 좋은 강의 잘 듣고 있습니다. if (items_flag & opt1) 이런식으로 item1이 있는지 없는지 판단하는데, 여기서 if() 안의 표현식이 0이 아닌 값으로 평가되면 true가 나온다는걸 이용하는건 알겠는데요, 이 방식이 현업에서도 많이 쓰이나요? 강의 초반에서도 교수님이 보는 이를 배려하는 코드, 가독성이 좋은 코드를 강조했는데, if() 안의 표현식이 0, 1, 2, 3, 4, 5 ... 등등 으로 평가되는 것보다 깔끔하게 0,1 혹은 true false 로만 평가되는게 가독성 측면에선 더 낫지 않나요?
8.11강 3분쯤 보다가 궁금한 점이 있어 질문 남깁니다. class Something { private: static int s_value; public: int getValue() { return s_value; } } int Something::s_value = 1024; 이렇게 클래스 내부에서 s_value 선언을 하고, 클래스 외부에서 초기화를 하셨는데, 클래스 외부에서 private 안에서 선언된 멤버변수로 접근하는것이 불가능한것으로 알고 있는데, 이 경우는 어떻게 가능한건지 알고 싶습니다. int main() { cout << something.getValue() << endl; // cout << something.s_value << endl; // 에러 } 그리고 이렇게 cout으로 출력했을 때, 아래 부분이 에러나는 이유도 궁금합니다. private 내의 static 멤버변수는 외부에서 접근이 불가능한거고, 초기화만 외부에서 해줄 수 있는건가요?
http://boj.kr/a89a03fa7dcd4e108a3576e95e177b5c 이 코드는 강의를 보기 전에 제가 자력으로 풀어본 코드입니다. 인접리스트로 트리를 구현하고, 지울 노드를 입력할 시 erase 함수를 통해 해당 노드의 하위 트리를 모두 삭제한 후 지울 노드를 삭제합니다. 그 후에 calculate 함수를 통해 값을 구하는데요, 강의에서 dfs 하나만으로 푸시는걸 보니 굳이 erase가 필요할까 싶기도 했네요.. 무식하게 일단 풀어본다는게 이렇게 된거 같은데 여기서 좀 더 코드를 다듬을 수 있을까요?
BFS로 풀었을 때 답은 맞는데 제출하면 메모리 초과로 틀렸다고 나오는데, 혹시 이 코드에서 메모리를 줄여서 맞힐 수 있는 방법이 있는지 여쭤보고 싶습니다! #include<bits/stdc++.h> using namespace std; int N; const int dy[4] = {-1,0,1,0}; const int dx[4] = {0,1,0,-1}; const int max_n = 100; int arr[max_n][max_n]; int visited[max_n][max_n]; int x,y; int Max = 0; int main(){ cin >> N; fill(&arr[0][0], &arr[0][0] + max_n*max_n, 0); for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ cin >> arr[i][j]; } } for(int h = 1; h <= 100; h++){ int cnt = 0; fill(&visited[0][0], &visited[0][0] + max_n*max_n, 0); for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ if(arr[i][j] >= h && visited[i][j] == 0){ queue<pair<int,int>> q; q.push({i,j}); cnt++; while(q.size()){ tie(y,x) = q.front(); q.pop(); visited[y][x] = 1; for(int n = 0; n < 4; n++){ int ny = y + dy[n]; int nx = x + dx[n]; if(ny < 0 || ny >= N || ny < 0 || ny >= N){ continue; } if(arr[ny][nx] < h){ continue; } if(visited[ny][nx]){ continue; } q.push({ny,nx}); } } } } } Max = max(Max, cnt); } cout << Max; return 0; }
강의 5:20에서 보면 std::max()는 <algorithm>이라는 라이브러리 안에 저장되어 있어서 #include로 불러와야 사용이 가능하다고 하셨습니다. #include <iostream> using namespace std; int main() { cout << std::max(100,2) << endl; return 0; } 근데 왜 저는 <algorithm>을 불러오지 않아도 오류 없이 사용이 가능할까요? 궁금하네요... 감사합니다.
namespace의 사용이유는 std::cout, std::cin, std::in처럼 함수를 목적에 따라 분류하기 위해서 사용하는 건가요? 함수만 namespace에 저장할 수 있는 지 궁금해져서 #include <iostream> using namespace std; namespace Space1 { int a = 10; } int main() { cout << Space1::a << endl; return 0; } 이렇게 입력했더니 정수형 변수 a도 namespace에 저장할 수 있었습니다. 함수 이외에도 namespace를 사용하는 경우가 있을까요?? 감사합니다.