어흥

[백준 1248] 맞춰봐 (C++) 본문

알고리즘/백준

[백준 1248] 맞춰봐 (C++)

라이언납시오 2020. 4. 29. 14:18
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/1248

 

1248번: 맞춰봐

문제 규현이는 멍청하다. 왜냐하면, 1~10까지 수 밖에 모르기 때문이다. 어느 날 규현이 옆을 지나가던 태석이가 규현이를 보고 이렇게 외쳤다. "빵빵!!" 규현이는 "아하!" 하면서 세상에는 빵이란 수도 있구나 했다. 그날 이후로 규현이는 매일 친구들을 볼 때면 "빵빵!!" 거리면서 인사를 했다. 규현이의 친구 중에는 태방이가 있다. 자꾸 규현이가 "빵빵!!" 거릴때 마다 자신을 놀리는 것 처럼 생각했던 태방이는 규현이에게 그건 "빵이 아니고 영이야"

www.acmicpc.net

1. 주의할 점

- -10~10까지 무작정 대입한 후, 비교하지 않도록 한다 -> TLE

- 입력을 배열형태로 받아서 해결하기 편하게 바꾼다

 

2. 구현

- Cal(idx) 함수를 통해 집어 넣은 숫자가 적합한지 검사한다

- Back_tracking(idx) 함수에서 Result[idx][idx]의 값이 +,-,0 인 경우로 나눠서 진행한다

- 0인 경우, Arr[idx]에 0을 대입하고 Sum[] 또한 갱신한다

- -인 경우 S의 값을 -1, +인 경우 S의 값을 1로 설정한 후, Arr[]와 Sum[]배열을 갱신하고 Cal()함수를 통해 적합한지 검사한다.

 

#include <iostream>
using namespace std;
int num, arr[11], sum[11]; //길이, 정답, 1~idx까지의 합
char result[11][11];
bool finish = false;

int cal(int idx) {
	for (int r = 1; r < idx; r++) {
		if (result[r][idx] == '+' && sum[idx] <= sum[r - 1]) return 0;
		if (result[r][idx] == '-' && sum[idx] >= sum[r - 1]) return 0;
		if (result[r][idx] == '0' && sum[idx] != sum[r - 1]) return 0;
	}
	return 1;
}

void back_tracking(int idx) {
	if (finish) return;
	if (idx > num) {
		finish = true;
		for (int i = 1; i <= num; i++)
			cout << arr[i] << " ";
		return;
	}
	//우선 숫자부터 대입
	if (result[idx][idx] == '0') {
		arr[idx] = 0;
		sum[idx] = sum[idx - 1];
		back_tracking(idx + 1);
	}	
	else {
		int s = 1;
		if (result[idx][idx] == '-')
			s = -1;
		for (int i = 1; i <= 10; i++) {
			arr[idx] = i * s;
			sum[idx] = sum[idx - 1] + arr[idx];
			if (cal(idx))
				back_tracking(idx + 1);
		}
	}
}

int main() {
	cin >> num;
	for (int j = 1; j <= num; j++) 
		for (int i = j; i <= num; i++)
			cin >> result[j][i];
	back_tracking(1);
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2887] 행성 터널 (C++)  (0) 2020.05.02
[백준 3860] 할로윈 묘지 (C++)  (0) 2020.05.01
[백준 1400] 화물차 (C++)  (0) 2020.04.28
[백준 8452] 그래프와 쿼리 (C++)  (0) 2020.04.27
[백준 10875] 뱀 (C++)  (0) 2020.04.23
Comments