![article thumbnail image](https://blog.kakaocdn.net/dn/djr0rQ/btqLkfYtxVM/ULHYHkSsdkmXWyBJKGcygK/img.png)
반응형
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, cnt = 0;
int map[21][21];
int ch[21];
void DFS(int L)
{
int i;
if (L == n)
{
++cnt;
}
else
{
for (i = 1; i <= n; ++i)
{
if (map[L][i] == 1 && ch[i] == 0)
{
ch[i] = 1;
DFS(i);
ch[i] = 0;
}
}
}
}
int main(void)
{
int m, i, a, b;
cin >> n >> m;
for (i = 1; i <= m; ++i)
{
cin >> a >> b;
map[a][b] = 1;
}
ch[1] = 1;
DFS(1);
cout << cnt << endl;
return 0;
}
출력 결과
채점 결과
앞 문제랑 동일하다 했더니 배열이 아니라 vector를 이용하는 방법이었다.
#include <iostream>
#include <vector>
using namespace std;
int ch[30], cnt = 0, n;
vector<int> map[30];
void DFS(int v)
{
if (v == n)
{
++cnt;
}
else
{
for (int i = 0; i < map[v].size(); ++i)
{
if (ch[map[v][i]] == 0)
{
ch[map[v][i]] = 1;
DFS(map[v][i]);
ch[map[v][i]] = 0;
}
}
}
}
int main(void)
{
int m, i, j, a, b;
cin >> n >> m;
for (i = 0; i < m; ++i)
{
cin >> a >> b;
map[a].push_back(b);
}
ch[1] = 1;
DFS(1);
cout << cnt << endl;
return 0;
}
인접 배열이 아닌 인접 리스트를 사용하면 메모리 낭비를 막을 수 있다. 기존 배열 방식의 경우, 미리 해당 메모리를 다 할당해 놓고 모든 방을 다 돌면서 해당 방의 데이터가 0보다 클 경우 체크하는 방식으로 구현했는데, 데이터 개수가 커진다면 순회하는 것만으로도 많은 연산을 하게 될 것이다.
=> 따라서 연결돼 있는 경우에만 vector에 push_back 처리를 해 주면 된다.
해당 포스트는 'it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비' 강의를 수강하며 개인 백업용으로 메모하였습니다.
인프런: https://www.inflearn.com/course/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98#
it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 - 인프런
알고리즘과 자료구조를 이용해 문제해결력을 기르는게 주 목적입니다. 초급 취업 ・ 이직 프로그래밍 언어 알고리즘 C++ 알고리즘 코딩 테스트 개발자취업 온라인 강의 알고리즘
www.inflearn.com
반응형