백준[baekjoon]/C언어

백준(baekjoon) [C] - 2644번: 촌수계산

_KTH_ 2023. 2. 17. 23:09
728x90

https://www.acmicpc.net/problem/2644

 

2644번: 촌수계산

사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어

www.acmicpc.net


~~ 1 ~~

#include <stdio.h>  // 촌수계산

int graph[101][101] = { 0, };
int visit[101] = { 0, };
int cnt = -1;
int ans = -1;

void dfs(int n, int now, int goal)
{
	visit[now] = 1;
	cnt++;

	if (now == goal)
	{
		ans = cnt;
		return;
	}

	for (int i = 1; i <= n; i++)
	{
		if (visit[i] == 0 && graph[now][i] != 0)
		{
			dfs(n, i, goal);
		}
	}
	cnt--;
}


int main()
{
	int n;
	scanf("%d", &n);

	int goal1, goal2;
	scanf("%d %d", &goal1, &goal2);
	
	int m;
	scanf("%d", &m);
	for (int i = 0; i < m; i++)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		graph[x][y] = 1;
		graph[y][x] = 1;
	}
	dfs(n, goal1, goal2);

	printf("%d", ans);
	

	return 0;
}

~~ 2 ~~

#include <stdio.h>  // 촌수계산
#include <stdlib.h>

int graph[101][101] = { 0, };
int visit[101] = { 0, };
int depth[101] = { 0, };

typedef struct
{
	int data;
	struct node* next;
}node;

typedef struct
{
	node* front;
	node* rear;
	int size;
}QUEUE;

void init_QUEUE(QUEUE* q)
{
	q->rear = q->front = NULL;
	q->size = 0;
}

int is_empty(QUEUE* q)
{
	if (q->size <= 0)
		return 1;
	else
		return 0;
}

void push(QUEUE* q, int data)
{
	node* newnode = malloc(sizeof(node));
	newnode->next = NULL;
	newnode->data = data;
	if (is_empty(q))
	{
		q->front = newnode;
	}
	else
	{
		q->rear->next = newnode;
	}
	q->rear = newnode;
	(q->size)++;
}

int pop(QUEUE* q)
{
	if (is_empty(q))
	{
		return;
	}
	else
	{
		node* temp;
		temp = q->front;
		int data = temp->data;
		q->front = temp->next;
		(q->size)--;
		free(temp);

		return data;
	}
}

void bfs(QUEUE* q, int n, int now)
{
	visit[now] = 1;
	push(q, now);
	int POP;

	while (!is_empty(q))
	{
		POP = pop(q);
		for (int i = 1; i <= n; i++)
		{
			if (visit[i] == 0 && graph[POP][i] == 1)
			{
				visit[i] = 1;
				depth[i] = depth[POP] + 1;
				push(q, i);
			}
		}
	}
}


int main()
{
	int n;
	scanf("%d", &n);

	int goal1, goal2;
	scanf("%d %d", &goal1, &goal2);
	
	int m;
	scanf("%d", &m);
	for (int i = 0; i < m; i++)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		graph[x][y] = 1;
		graph[y][x] = 1;
	}
	QUEUE q;
	init_QUEUE(&q);

	bfs(&q, n, goal1);

	if (depth[goal2] != 0)
		printf("%d", depth[goal2]);
	else
		printf("%d", -1);

	return 0;
}

MEMO

[1]

-- dfs 구현이 가능하면 어렵지 않은 문제

-- 재귀를 이용하기에 재귀에 대한 이해가 필요

[2]

-- 큐를 통해서 bfs를 구현하여 해결

 

!! 꾸준히 여러가지 자료구조 익히기 !!

728x90
728x90