Search

순열장난

주차
0
문제번호
10597
언어
C++
티어
실버
유형
수학
조합론
백트래킹
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

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++
복사