C++

[C++] 5월 12일 코딩 테스트 수업

k-codestudy 2025. 5. 12. 17:50
#pragma once

#include <iostream>
#include <queue>

class C_KRUSKAL
{
private:
	struct S_NODE
	{
		char c1;
		char c2;
		int nLength;

		bool operator()(S_NODE s1, S_NODE s2) const 
		{
			return s1.nLength > s2.nLength;
		}
	};

private:
	int m_arNode[127][127];
	std::priority_queue<S_NODE, std::vector<S_NODE>, S_NODE> m_heap;

public:
	C_KRUSKAL() = default;
	void add(char cDst, char cSrc, int nLenght);
	void print();
	void run();
};

 

#include "kruskal.h"
#include <list>

void C_KRUSKAL::add(char cDst, char cSrc, int nLenght)
{
	m_arNode[cDst][cSrc] = nLenght;
	m_arNode[cSrc][cDst] = nLenght;

	if(cDst < cSrc)
		m_heap.push({ cDst, cSrc, nLenght });
	else
		m_heap.push({ cSrc, cDst, nLenght });
}

void C_KRUSKAL::print()
{
	for (char c1 = 'A'; c1 <= 'I'; c1++)
	{
		for (char c2 = 'A'; c2 <= 'I'; c2++)
		{
			printf("%2d ", m_arNode[c1][c2]);
		}
		printf("\n");
	}
}

void C_KRUSKAL::run()
{
	char arParent[127]{};
	for (int i = 0; i < 127; i++)
	{
		arParent[i] = i;
	}

	std::list<S_NODE> listResult{};

	while (!m_heap.empty())
	{
		S_NODE node = m_heap.top();
		m_heap.pop();
	
		// 둘이 부모가 같으면 패스
		// 둘이 부모가 다를경우 작은 부모로 둘다 교체 
		// 결과에 추가 
		if (arParent[node.c1] != arParent[node.c2])
		{
			char cParent = arParent[node.c1];

			if (cParent > arParent[node.c2])
				cParent = arParent[node.c2];

			arParent[node.c1] = cParent;
			arParent[node.c2] = cParent;

			// 과제 : 이거 버그가 있는게 c -> b를 연결할때 H의 부모도 A로 바뀌어야하는데 안됨 , 힌트는 포인터

			listResult.push_back(node);
		}
	}
}

 

#include <iostream>

#include "kruskal.h"

int main()
{
	C_KRUSKAL cKruskal{};

	cKruskal.add('A', 'B', 3);
	cKruskal.add('A', 'I', 7);
	cKruskal.add('B', 'C', 5);
	cKruskal.add('B', 'I', 6);

	cKruskal.add('C', 'H', 4);
	cKruskal.add('C', 'G', 6);
	cKruskal.add('C', 'F', 8);
	cKruskal.add('C', 'D', 9);

	cKruskal.add('D', 'F', 12);
	cKruskal.add('D', 'E', 9);
	cKruskal.add('E', 'F', 10);
	cKruskal.add('F', 'G', 2);

	cKruskal.add('G', 'I', 11);
	cKruskal.add('H', 'I', 7);

	//cKruskal.print();
	cKruskal.run();
}