백준의 맞춰봐(1248) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
1) 먼저, 문제를 읽고 구해야 하는 값이 무엇인지, 예제입력이 의미하는 것이 무엇인지부터 확실하게 알아보고 가자.
예제입력을 한번 봐보자.
-+0++++--+ 이고 출력이 [ -2 , 5 , 3, 1 ] 이다.
그럼 입력부터 알아보자. 문제에서 "A[i]부터 A[j]까지의 합이 0보다 크면 +, 작으면 -, 0이면 0" 을 적어놨다고 했다.
즉, 예제입력에서 가장 앞에 '-'가 의미하는 것은 A[0]부터 A[0] 까지 모두 더한 값이 음수입니다를 의미한다.
실제로 예제 출력을 보면 [ -2, 5, 3, 1 ] 이 있고, 이 때, A[0]부터 A[0]까지 더하게 되면 -2로 음수가 된다.
그 다음은 '+' 이다. 이 '+'가 의미하는 것은 A[0]부터 A[1]까지 더하면 양수가 나옵니다를 의미한다.
실제로 예제 출력에서 A[0]부터 A[1]까지 더해보면 -2 + 5 > 0 으로 양수가 나오게 된다.
이런식으로, A[0] ~ A[N - 1] 까지, A[1] ~ A[N - 1]까지, A[2] ~ A[N -1] , A[N - 1] ~ A[N-1]까지의
결과를 입력으로 준 것이다.
그럼 문제를 정말 간단하게 말하자면 다음과 같이 말할 수 있다.
"-10부터 10까지 총 21개의 숫자가 있습니다. 이 중에서 입력의 조건을 만족하는, N개의 수열을 아무거나 뽑아서
출력하세요 !"
2) 본인은 그래서 중복순열을 구현하였다. 먼저, 순서에 따라서 결과가 달라질 수 있기 때문에 조합이 아닌 순열을 구현하였고,
문제에서 같은 숫자를 다시 뽑지 않는다는 조건이 없었기에 중복 순열로 구현을 해 주었다.
중복순열을 아직 모른다면 아래의 글을 읽고 오도록 하자.
중복순열을 구현하면서 중간중간 조건에 만족하는지 체크를 해 주었다.
기존에 뽑은 숫자들과, 지금 현 시점에서 뽑은 숫자들을 모두 더해가면서 입력의 조건을 만족하는 숫자인지 체크해주면서
뽑는 과정을 진행해 주었다.
[ 소스코드 ]
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include<iostream> #define endl "\n" #define MAX 10 using namespace std; int N; char Res[MAX][MAX]; int Select[MAX]; void Input() { cin >> N; for (int i = 0; i < N; i++) { for (int j = i; j < N; j++) { cin >> Res[i][j]; } } } bool Check(int Idx) { int Sum = 0; for (int i = Idx; i >= 0; i--) { Sum = Sum + Select[i]; if (Res[i][Idx] == '+' && Sum <= 0) return false; if (Res[i][Idx] == '-' && Sum >= 0) return false; if (Res[i][Idx] == '0' && Sum != 0) return false; } return true; } void DFS(int Cnt) { if (Cnt == N) { for (int i = 0; i < Cnt; i++) { cout << Select[i] << " "; } cout << endl; exit(0); } for (int i = -10; i <= 10; i++) { Select[Cnt] = i; if (Check(Cnt) == true) DFS(Cnt + 1); } } void Solution() { DFS(0); } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 2098 ] 외판원 순회 (C++) (4) | 2020.03.02 |
---|---|
[ 백준 16935 ] 배열 돌리기3 (C++) (0) | 2020.03.01 |
[ 백준 2424 ] 부산의 해적 (C++) (0) | 2020.02.29 |
[ 백준 2169 ] 로봇 조종하기 (C++) (0) | 2020.02.28 |
[ 백준 2800 ] 괄호 제거 (C++) (0) | 2020.02.28 |