https://www.acmicpc.net/problem/7490

[필자 사고]
재미난 문제다. DFS를 이용하여 풀었다.
idx와 expr을 dfs매개변수로 받고 각 경우의 맞게 Ascll 코드 오름차순 형태로 탐색을 진행했따.
만약 N값 보다 idx가 크게 되는 경우 이제 계산할 차례다.
각 char ch : expr 에서 부호들을 찾을 경우 numStr의 값을 nums백터에 넣고 부호 벡터에 넣는 형태로 구한다.
numStr을 "" 로 초기화하는거 잊지 말자.
다음으로 공백은 무시하자 만약 문자열을 만나게 되면 numStr+=ch 형태로 만들면 된다.
이제 nums배열에 넣은 숫자들과 ops배열에 넣은 부호들을 이용하여 계산에 진행하자.
미리 처음 숫자 int result = nums[0]을 받은 뒤
각 부호에 맞게 계산을 진행하자.
만약 result ==0 이라면 성공
아래는 자세한 코드 해설이다.
[코드 해설]
dfs(int idx, string expr)
- 백트래킹(DFS)으로 식을 생성하는 함수이다.
- 매개변수:
- idx: 현재 붙일 숫자
- expr: 지금까지 만든 수식 문자열
- 동작 과정:
- idx > N일 경우 → 모든 숫자가 다 붙었으므로 완성된 수식을 평가한다.
- 문자열을 순회하며 숫자와 연산자를 분리한다.
- '+' 또는 '-'가 나오면 지금까지 누적된 숫자를 정수로 변환하여 nums에 저장하고, 연산자를 ops에 넣는다.
- ' '은 무시하고, 나머지 숫자는 문자열로 이어 붙인다.
- 마지막 남은 숫자도 정수로 변환해 nums에 추가한다.
- 계산 단계에서는 nums[0]을 시작값으로 두고, ops를 순서대로 적용해 결과를 구한다.
- 최종 결과가 0이면 해당 식을 출력한다.
- 문자열을 순회하며 숫자와 연산자를 분리한다.
- idx <= N일 경우 → 다음 숫자를 붙이는 세 가지 선택을 모두 탐색한다.
- 숫자 앞에 ' '을 붙이는 경우 (즉, 숫자 이어붙이기)
- 숫자 앞에 '+'를 붙이는 경우
- 숫자 앞에 '-'를 붙이는 경우
- idx > N일 경우 → 모든 숫자가 다 붙었으므로 완성된 수식을 평가한다.
main()
- 입출력 최적화를 설정한다.
- 테스트 케이스 개수를 입력받는다.
- 각 테스트 케이스마다 N을 입력받은 후,
- dfs(2, "1")을 호출해 1에서 시작하는 수식을 만든다.
- 한 테스트 케이스 결과가 끝나면 빈 줄을 출력해 구분한다.
전체 흐름
- 입력으로 주어진 N에 대해 1부터 N까지의 수열을 만든다.
- DFS로 모든 가능한 식을 만들어 본다. (공백, 더하기, 빼기)
- 완성된 식을 직접 계산한다.
- 값이 0인 식만 출력한다.
- 각 테스트 케이스 결과 사이에는 공백 줄을 둔다.
[소스 코드]
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int N;
void dfs(int idx, string expr) {
if (idx > N) {
string numStr = "";
vector<int> nums;
vector<char> ops;
for (char c : expr) {
if (c == '+' || c == '-') {
ops.push_back(c);
nums.push_back(stoi(numStr));
numStr = "";
}
else if (c != ' ') {
numStr += c;
}
}
nums.push_back(stoi(numStr));
int result = nums[0];
for (int i = 0; i < ops.size(); i++) {
if (ops[i] == '+')result += nums[i + 1];
else result -= nums[i + 1];
}
if (result == 0) cout << expr << "\n";
return;
}
dfs(idx + 1, expr + " " + to_string(idx)); // 공백
dfs(idx + 1, expr + "+" + to_string(idx)); // +
dfs(idx + 1, expr + "-" + to_string(idx)); // -
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
cin >> N;
dfs(2, "1");
cout << "\n";
}
return 0;
}'백준 > 구현' 카테고리의 다른 글
| 백준 16197 c++ "두 동전" -PlusUltraCode- (0) | 2025.10.07 |
|---|---|
| 백준 1025 c++ "제곱수 찾기" -PlusUltraCode- (0) | 2025.09.28 |
| 백준 16927 c++ "배열 돌리기 2" -PlusUltraCode- (0) | 2025.09.27 |
| 백준 16918 c++ "봄버맨" -PlusUltraCode- (0) | 2025.09.24 |
| 백준 17086 c++ "아기 상어 2" -PlusUltraCode- (0) | 2025.09.23 |