백준 15723 c++

magicdrill·2024년 6월 8일

백준 문제풀이

목록 보기
365/673

백준 15723 c++

오랜만에 풀어본 DFS 알고리즘 문제이다.
지금까지는 재귀로 풀었지만 BFS에서 queue컨테이너를 사용하듯이 stack컨테이너를 사용해 풀어보았다.
또한 정보 저장을 map 연습을 위해 map을 사용해 보았다.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <map>

using namespace std;

void input_info(map<char, vector<char>> &N, vector<pair<char, char>> &M)
{
	int n, m;
	int i;
	string temp;

	cin >> n;
	cin.ignore();//버퍼에 남아있는 개행문자 제거
	for (i = 0; i < n; i++)
	{
		getline(cin, temp);
		N[temp.front()].push_back(temp.back());
	}
	cin >> m;
	cin.ignore();//버퍼에 남아있는 개행문자 제거
	for (i = 0; i < m; i++)
	{
		getline(cin, temp);
		M.push_back({ temp.front(), temp.back() });
	}

	/*
	for (auto j : N)
	{
		cout << j.first << " : ";
		for (i = 0; i < j.second.size(); i++)
		{
			cout << j.second[i] << " ";
		}
		cout << "\n";
	}
	for (auto j : M)
	{
		cout << j.first << " " << j.second << "\n";
	}
	*/

	return;
}

bool DFS(char start, char end, map<char, vector<char>>& N)
{
	//cout << "DFS()\n";
	//스택을 사용해 보겠다.
	vector<bool> visited(26, false);
	stack <char> st;
	char current, next;
	int i;

	st.push(start);
	visited[st.top() - 'a'] = true;
	while (!st.empty())
	{
		current = st.top();
		st.pop();
		for (i = 0; i < N[current].size(); i++)
		{
			next = N[current][i];
			if (visited[next - 'a'] == false)//방문한 적이 없으면
			{
				st.push(next);
				visited[next - 'a'] = true;
			}
			if (visited[end - 'a'])//도착했다면?
			{
				return true;
			}
		}
	}

	return false;
}

void find_answer(map<char, vector<char>>& N, vector<pair<char, char>>& M)
{
	int n = N.size(), m = M.size();
	int i;
	bool answer;

	for (i = 0; i < m; i++)
	{
		answer = DFS(M[i].first, M[i].second, N);//출발지, 도착지, 정보
		if (answer)
		{
			cout << "T\n";
		}
		else
		{
			cout << "F\n";
		}
	}

	return;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	map<char, vector<char>> N;
	vector<pair<char, char>> M;

	input_info(N, M);
	find_answer(N, M);

	return 0;
}

0개의 댓글