코딩테스트/C++

[프로그래머스 Level 2] 도넛과 막대 그래프(C++)

최-코드 2024. 5. 29. 18:46

코딩테스트 연습 - 도넛과 막대 그래프 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

생성한 정점은 나가는 엣지만 존재한다. 하지만 이 때 막대 모양에서 맨 마지막도 같은 경우가 된다. 이는 그 정점에서 나가는 엣지가 2개 이상이면 무조건 새로 생성한 정점이다. 하지만 만약에 막대 모양과 새로 생성한 정점에서 나가는 엣지가 한 개씩일 때도 있는데, 이 때 어떤 정점을 고르든 결과는 같으므로 아무거나 골라준다.

이후 8자 모양일 때는 그래프를 탐색하다가 나가는 엣지가 2개일 때일 경우고, 막대 모양은 한 정점에서 나가는 엣지가 없을 때로 구분지을 수 있다. 그리고 마지막으로 모든 정점을 돌았을 때는 도넛 모양이다.

 

#include <string>
#include <vector>
#include <memory.h>
using namespace std;

vector<int> edge[1000001];
bool checked[1000001];
int vertex;
int findShape(int a) {
	checked[a] = true;
	if (edge[a].size() == 0) {
		return 2;
	}
	if (edge[a].size() == 2) {
		return 3;
	}
	if (!checked[edge[a][0]]) {
		return findShape(edge[a][0]);
	}
	else {
		return 1;
	}
}


vector<int> solution(vector<vector<int>> edges) {
	vector<int> answer(4,0);
	for (int i = 0; i < edges.size(); i++) {
		edge[edges[i][0]].push_back(edges[i][1]);
		checked[edges[i][0]] = true;
		checked[edges[i][1]] = true;
	}
	for (int i = 1; i <= 1000000; i++) {
		if (!edge[i].empty()) {
			for (int j = 0; j < edge[i].size(); j++) {
				checked[edge[i][j]] = false;
			}
		}
	}
	int tmp = 0;
for (int i = 1; i <= 1000000; i++) {
	if (checked[i]) {
		if (edge[i].size() == 1) {
			checked[i] = false;
			tmp = i;
			continue;
		}
		vertex = i;
		checked[i] = false;
		break;
	}
}
if (vertex == 0) {
	vertex = tmp;
}
	answer[0]=vertex;
	for (int i = 0; i < edge[vertex].size(); i++) {
		int tmp = findShape(edge[vertex][i]);
		answer[tmp]++;
	}
	return answer;
}