250x250
Notice
Recent Posts
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 소프트웨어아키텍처 기술 동향
- 객체 지향형 DB
- 개발프레임워크의 기술 동향
- 개발프레임워크
- 계층형DB
- aws winscp
- 프로그래밍 언어 기술 동향
- ANSI-SPARC
- boj 11659
- vector unique erase
- 시간초과
- Flutter
- 네트워크형DB
- TOPCIT
- BOJ
- Backtracking
- c++
- 메인 메모리 DB
- 클라우드기반 IDE
- 정렬
- 공간DB
- 객체관계형DB
- sync_with_stdio(0)
- 소프트웨어 개발도구
- 멀티미디어DB
- 온라인처리
- compare
- compare구조체
- 프로그래밍 언어
- 백트래킹
Archives
옐그's 코딩라이프
[boj][c++] 좋은수열 (백트래킹/시간초과/2661) 본문
문제
숫자 1, 2, 3으로만 이루어지는 수열이 있다. 임의의 길이의 인접한 두 개의 부분 수열이 동일한 것이 있으면, 그 수열을 나쁜 수열이라고 부른다. 그렇지 않은 수열은 좋은 수열이다.
다음은 나쁜 수열의 예이다.
- 33
- 32121323
- 123123213
다음은 좋은 수열의 예이다.
- 2
- 32
- 32123
- 1232123
길이가 N인 좋은 수열들을 N자리의 정수로 보아 그중 가장 작은 수를 나타내는 수열을 구하는 프로그램을 작성하라. 예를 들면, 1213121과 2123212는 모두 좋은 수열이지만 그 중에서 작은 수를 나타내는 수열은 1213121이다.
입력
입력은 숫자 N하나로 이루어진다. N은 1 이상 80 이하이다.
출력
첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다.
풀이 방법
* 가장 작은 수를 찾는 것 -> 백트래킹
* 수열의 최대 갯수는 3^80개이다 -> 너무 많으므로 이 모든 걸 다 확인하면 시간 초과 남
1. 수열 작은 수부터 만들기
2. 좋은 수열인지 확인하기
- 수를 만들 때, 1 - 11 - 111 - 1111 이렇게 만드는데
11에서 이미 나쁜 수열이므로 111, 1111까지 가지 않고 미리 끝내기 -> 그래야 시간 초과가 안 남
3. 좋은 수열 찾으면 다 종료하기
#include <bits/stdc++.h>
using namespace std;
int N;
string flag="";
string res="";
bool check(string num){ //좋은 수열인지 체크
for(int i=1; i <= num.length()/2; i++){
for(int j=0; j<(num.length() - i*2 + 1); j++){
if(num.substr(j, i) == num.substr(j+i, i)){
return false;
}
}
}
return true;
}
void make_num(int n){
if(n == 0){
if(check(res)==true) flag = res;
return;
}
if(check(res)==false) return; //수열의 앞부분에 나쁜 수열이 있으면 더 안보고 종료
for(char c='1'; c<='3'; c++){
if(flag != "") return; //for문 중에 이미 좋은 수열을 찾았으면 종료
res += c;
make_num(n - 1);
res.pop_back();
}
return;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin >> N;
string num;
make_num(N);
cout << flag << '\n';
}
기억하고 넘어갈 점
1. 백트래킹으로 풀 경우, 시간복잡도 잘 계산하기
2. 최대한 아닌 건 빨리 내치기 (return하기)
728x90
'c++ > boj' 카테고리의 다른 글
[boj][c++] N-Queen (백트래킹/dfs/9663) (1) | 2024.01.26 |
---|---|
[boj][c++] 회의실 배정 (정렬/시간초과/1931) (0) | 2024.01.18 |
[boj][c++] 구간 합 구하기 4 (구간합/시간초과/11659) (0) | 2024.01.18 |
[boj][c++] N과 M (9) (15663) (1) | 2024.01.17 |
[boj][c++] N과 M (2) (15650) (1) | 2024.01.15 |