모두의 코드
모두의 코드

총 42 개의 강의로 준비된 씹어먹는 C 언어 강좌를 통해 C 언어의 처음부터 끝까지 배우실 수 있습니다! 특히 악명 높은 C 언어의 포인터나, 어려운 개념들을 충실히 짚고 넘어갑니다.

이 강좌는 2010년에 완결되었지만, 지속적으로 개선 및 보완하고 있습니다.

C 언어 문법을 아시는 분들이라면, 씹어먹는 C++ 강좌를 통해 C++ 기초 부터 최근의 C++ 17 까지 모든 내용을 배우실 수 있습니다. C 언어와 C++ 의 기본적인 문법이 비슷하기 때문에, C 언어를 어느 정도 아는 독자를 가정하여 쓰여져 있습니다.

이 강좌는 2020년에 완결되었고 총 50 개의 강좌가 준비되어 있습니다.

사이트 내에서 검색 하기
C 언어 레퍼런스
표준 입출력 라이브러리 stdio.h
문자열 관련 라이브러리 string.h
시간 관련 라이브러리 time.h
C ++ 레퍼런스
문자열 라이브러리 string
알고리즘 라이브러리 algorithm
최근 댓글
ad 01.19
가계도 관리 라이브러리 코드를 짜려고 했는데, 명세대로 맞추어 짜려니 생각보다 쉽지가 않네요.. 일부일처제로 가정을 하고, 최대한 명세에 맞게 타입을 맞추려고 했는데 잘 짜신 분들의 코드가 궁금합니다 ㅠ #include <iostream> #include <vector> #include <memory> #include <string> class Member { private : std::vector<std::shared_ptr<Member>> children; std::vector<std::weak_ptr<Member>> parents; std::vector<std::weak_ptr<Member>> spouses; public: friend class FamilyTree; static int cnt; std::string idx; Member() : idx(std::to_string(cnt)) { //std::cout << "Member Number : " << idx << std::endl; ++cnt; } void AddParent(const std::shared_ptr<Member>& parent); void AddSpouse(const std::shared_ptr<Member>& spouse); void AddChild(const std::shared_ptr<Member>& child); std::vector<std::shared_ptr<Member>> GetChildren() const { return children; } std::vector<std::weak_ptr<Member>> GetParents() const { return parents; } std::vector<std::weak_ptr<Member>> GetSpouses() const { return spouses; } }; void Member::AddParent(const std::shared_ptr<Member>& parent) { parents.push_back(parent); } void Member::AddSpouse(const std::shared_ptr<Member>& spouse) { spouses.push_back(spouse); } void Member::AddChild(const std::shared_ptr<Member>& child) { child->AddParent(std::shared_ptr<Member>(this)); children.push_back(child); } // initialize static variable of Member class int Member::cnt = 0; class FamilyTree { public: std::vector<std::shared_ptr<Member>> entire_family; // 두 사람 사이의 촌수를 계산 int CalculateChon(Member* mem1, Member* mem2); void addFamily(const std::shared_ptr<Member>& member) { entire_family.push_back(member); } }; int FamilyTree::CalculateChon(Member* mem1, Member* mem2) { if (mem1 == nullptr || mem2 == nullptr) return 0; if (mem1 == mem2) return 0; // Find LCA - O(n^2) Member* lca1 = mem1; Member* lca2 = mem2; int cnt1 = 0; int cnt2 = 0; bool exit_flag = false; int spouse_cnt = 0; Member* ori_mem(mem2); while (!(mem1->GetParents()).empty()) { // mem2 초기화 mem2 = ori_mem; cnt2 = 0; while (!(mem2->GetParents()).empty()) { if (mem1 == mem2) exit_flag = true; if (mem1->GetSpouses()[0].lock() == mem2->GetSpouses()[0].lock()) { ++spouse_cnt; exit_flag = true; } if (exit_flag) break; // mem2 부모 찾기 std::vector<std::weak_ptr<Member>> pVec = mem1->GetParents(); if (!pVec[0].lock()->GetParents().empty()) { mem1 = &(*((pVec[1].lock()->GetParents())[0].lock())); } else mem1 = &(*((pVec[1].lock()->GetParents())[1].lock())); ++cnt2; } if (exit_flag) break; // mem1 부모 찾기 std::vector<std::weak_ptr<Member>> pVec = mem1->GetParents(); if (!pVec[0].lock()->GetParents().empty()) { mem1 = &(*((pVec[1].lock()->GetParents())[0].lock())); } else mem1 = &(*((pVec[1].lock()->GetParents())[1].lock())); ++cnt1; } return cnt1 + cnt2 + spouse_cnt; } int main() { std::shared_ptr<Member> m0 = std::make_shared<Member>(); std::shared_ptr<Member> m1 = std::make_shared<Member>(); std::shared_ptr<Member> m2 = std::make_shared<Member>(); std::shared_ptr<Member> m3 = std::make_shared<Member>(); std::shared_ptr<Member> m4 = std::make_shared<Member>(); std::shared_ptr<Member> m5 = std::make_shared<Member>(); std::shared_ptr<Member> m6 = std::make_shared<Member>(); m0->AddSpouse(m1); m0->AddChild(m2); m0->AddChild(m3); m1->AddSpouse(m0); m1->AddChild(m2); m1->AddChild(m3); m3->AddSpouse(m4); m3->AddChild(m5); m3->AddChild(m6); m4->AddSpouse(m3); m4->AddChild(m5); m4->AddChild(m6); FamilyTree ft; ft.addFamily(m0); ft.addFamily(m1); ft.addFamily(m2); ft.addFamily(m3); ft.addFamily(m4); ft.addFamily(m5); ft.addFamily(m6); std::cout << "CalculateChon between 0 and 0 : " << ft.CalculateChon(&(*ft.entire_family[0]), &(*ft.entire_family[0])) << std::endl; }
hash 01.14