Memo
최근에 접했던 백트레킹 문제 중에 가장 까다롭지 않았나.. 생각이 듭니다.
로직 설명
•
N의 값이 따로 입력으로 주어지지 않기 때문에, 입력으로 주어지는 krili의 수열을 토대로 N을 구했습니다.
•
처음에는 1개씩 끊어서 생각을 하고, 이미 방문중인 숫자인 경우에는 2 개씩 끊어서 생각합니다. 2개씩 끊어야 할 경우에, i 가 s.size() - 2보다 크면, i+1은 인덱스 범위를 넘어가므로 return 0 을 해줍니다.
어려웠던 부분 
•
완전 탐색을 어떻게 돌려야 할 지 감이 잘 오지 않았고, dfs 함수 내에서 if - else 구문을 생각해내는 것이 어려웠습니다.
개선할 부분 
•
인덱스 감각을 더 키워야 할 것으로 보입니다. (범위)
Code
제출 날짜
@4/27/2021
메모리
2020 KB
시간
0 ms
#include <iostream>
#include <string>
#include <vector>
std::string s;
std::vector<int> ans;
int visited[51];
int N;
void io_faster()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
io_faster();
std::cin >> s;
if (s.size() <= 9)
N = s.size();
else
N = (s.size() - 9) / 2 + 9;
}
bool dfs(int i)
{
if ((int)ans.size() > N)
return (0);
if ((size_t)i >= s.size())
return (1);
if (s[i] - '0' > N || s[i] - '0' == 0)
return 0;
if (!visited[s[i] - '0'])
{
visited[s[i] -'0'] = 1;
ans.push_back(s[i] - '0');
if (dfs(i + 1))
return 1;
ans.pop_back();
visited[s[i] - '0'] = 0;
}
if (i > (int)s.size() - 2)
return 0;
else
{
int val = (s[i] - '0')*10 + (s[i + 1] - '0');
if (val > N || visited[val])
return 0;
visited[val] = 1;
ans.push_back(val);
if (dfs(i + 2))
return 1;
ans.pop_back();
visited[val] = 0;
}
return 0;
}
void solve()
{
dfs(0);
}
void print_val()
{
for (size_t i = 0 ; i < ans.size(); i++)
std::cout << ans[i] << " " ;
}
int main()
{
input();
solve();
print_val();
return (0);
}
C++
복사