[백준 2661 : C++] 좋은수열 / 백트래킹
문제

풀이
이 문제의 핵심은 좋은수열인지 판별하는 방법을 알아내는 것이다.
마지막 인덱스를 기준으로 길이를 1부터 시작해 (수열의 길이 / 2)까지 비교한다.

코드
C++ 언어를 이용하여 코드를 살펴보자.
#include <iostream> #include <string> using namespace std; int N; string s; bool flag; void func(string t, int depth) { if (flag) return; int len = t.size(); for (int i = 1; i <= (len / 2); i++) { if (t.substr(len - i, i) == t.substr(len - (2 * i), i)) { t = ""; return; } } if (depth > N) return; if (depth == N) { flag = true; cout << t << "\n"; return; } else { for (int i = 0; i < N; i++) { func(t + "1", depth + 1); func(t + "2", depth + 1); func(t + "3", depth + 1); } } } int main() { cin >> N; func(s, 0); return 0; }
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준 2206 : JAVA] 벽 부수고 이동하기 / BFS (0) | 2020.09.08 |
---|---|
[백준 9370 : JAVA] 미확인 도착지 / 다익스트라 (0) | 2020.08.28 |
[백준 11057 : C++] 오르막 수 / DP (0) | 2019.10.24 |
[백준 11559 : C++] Puyo Puyo / BFS, DFS (0) | 2019.10.18 |
[백준 2749 : C++] 피보나치 수 3 (0) | 2019.08.29 |
댓글
이 글 공유하기
다른 글
-
[백준 9370 : JAVA] 미확인 도착지 / 다익스트라
[백준 9370 : JAVA] 미확인 도착지 / 다익스트라
2020.08.28문제 풀이 최단 경로를 구하는 문제로 다익스트라 알고리즘을 이용해 풀 수 있는 문제다. 위의 예제 입력에서 첫 번째 테스트 케이스를 그래프로 시각화해보자. 특정 목적지로의 최단 경로 중특정 경로를 포함하는지를 확인하는게 문제의 포인트다. 위 케이스의 최단 경로에서 2에서 3으로 가는 경로가 포함되어 있는지 확인하기 위해 생각해볼 수 있는 방법은 두 가지다. 첫 번째, (1 -> 2 최단거리) + (2 -> 3 최단거리) + (3 -> 5 최단거리) == (1 -> 5 최단거리) 또는 (1 -> 3 최단거리) + (3 -> 2 최단거리) + (2 -> 5 최단거리) == (1 -> 5 최단거리) 위 방법은 가장 간단하게 생각해볼 수 있는 방법이지만, 다익스트라 함수를 여러 번 호출해야하기 때문에 비효율적… -
[백준 11057 : C++] 오르막 수 / DP
[백준 11057 : C++] 오르막 수 / DP
2019.10.24풀이 오르막 수는 수의 자리가 오름차순을 이루는 수. (인접한 수가 같아도 오름차순으로 친다.) 수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램. (수는 0부터 시작) DP 문제는 메모이제이션을 어떤 식으로 둬야할지에 대한 아이디어가 굉장히 중요한 거 같다. 이 문제에서는 메모이제이션을 D[i][j] // i: 수의 길이, j: 마지막 수 로 뒀다는게 중요한 포인트다. 코드 C++ 언어를 이용해 코드로 살펴보자. #include using namespace std; constexpr int mod = 10007; int N, ans; long long D[1001][10]; // D[i][j] = 수의 길이가 i이며 마지막 숫자가 j인 수의 오르막 수의 개수 int main() { ci… -
[백준 11559 : C++] Puyo Puyo / BFS, DFS
[백준 11559 : C++] Puyo Puyo / BFS, DFS
2019.10.18 -
[백준 2749 : C++] 피보나치 수 3
[백준 2749 : C++] 피보나치 수 3
2019.08.29풀이 피보나치 수를 K로 나눈 나머지는 항상 주기를 가지게 된다. 이를 피사노 주기(Pisano Period)라고 한다. 피보나치 수를 3으로 나누었을 때 주기는 8이 된다. 이 때, 주기의 길이가 P라면: N번째 피보나치 수를 K로 나눈 나머지 == N%P번째 피보나치 수를 K로 나눈 나머지 코드 C++ 언어를 이용해 코드를 살펴보자. #include using namespace std; // 주기를 구하는 공식 // 피보나치 수를 M으로 나눈 나머지를 구하는 문제에서 나머지는 주기를 가지게 된다. ('파사노 주기'라고 한다.) // M = 10^k일 때, k>2라면 주기는 15 * 10^(k-1) constexpr int MOD = 1000000; constexpr int P = (MOD / 10) …
댓글을 사용할 수 없습니다.