개발자 피터
Peter's Dev Blog
개발자 피터
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 🧑🏻‍💻 Develop (13)
      • Devops (3)
      • Elasticsearch (3)
      • Design Pattern (1)
      • SQL (4)
      • Architecture (1)
      • APM (1)
    • 💻 Service (7)
      • E-ROOM (3)
      • Briefing (4)
    • 💡 Problem Solving (43)
      • Baekjoon (40)
      • Programmers (2)
    • 📚 Reading (12)
      • Tech (9)
      • Self-Help (3)
    • 💬 Etc (1)
    • 📈 Retrospective (1)

블로그 메뉴

  • 🌟 깃허브
  • 🏷️ 태그 클라우드
  • 📝 방명록

공지사항

인기 글

태그

  • 그리디
  • 브루트포스
  • E-ROOM
  • 구현
  • elasticsearch
  • boj
  • 백트래킹
  • MySQL
  • 백준
  • 문자열
  • SQL
  • briefing
  • java
  • Programmers
  • 독서

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자 피터

Peter's Dev Blog

💡 Problem Solving/Baekjoon

[백준 - 7490] 0 만들기 [C++]

2023. 10. 19. 21:00
728x90
반응형

1. 문제

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

 

7490번: 0 만들기

각 테스트 케이스에 대해 ASCII 순서에 따라 결과가 0이 되는 모든 수식을 출력한다. 각 테스트 케이스의 결과는 한 줄을 띄워 구분한다.

www.acmicpc.net

 

2. 풀이

전형적인 브루트포스 문제이다..

나의 경우 두번 '출력 형식이 잘못되었습니다' 를 받았었는데..

'각 테스트 케이스의 결과는 한 줄을 띄워 구분한다.' 이것을 간과한채 제출했었다..

케이스별로 한 줄씩 띄워주니까 맞았다..

 

문제는 연산자 3개로 표현가능한 모든 식을 만들어보고 그 식을 계산했을 때 0인지 판정하면된다.

c++에는 eval함수가 없어서 직접 구현했다..

 

3. 코드

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;
int T, n;
char opers[3] = { ' ', '+', '-' };
vector<string> answers;

string makeExpression(vector<int> numbers, vector<char>& operators) {
    string ret = to_string(numbers[0]);
    for(int i=1; i<n; i++) {
        ret += operators[i-1];
        ret += to_string(numbers[i]);
    }

    return ret;
}

int eval(string expression) {
    int ret = 0;
    string num = "";
    char oper = '+';
    for(int i=0; i<expression.size(); i++) {
        if(expression[i] == ' ') continue;
        if(expression[i] == '+') {
            if(oper == '+') ret += atoi(num.c_str());
            else ret -= atoi(num.c_str());
            oper = '+';
            num = "";
        }
        if(expression[i] == '-') {
            if(oper == '+') ret += atoi(num.c_str());
            else ret -= atoi(num.c_str());
            oper = '-';
            num = "";
        }
        else {
            num += expression[i];
        }
    }

    if(oper == '+') ret += atoi(num.c_str());
    else ret -= atoi(num.c_str());
    
    return ret;
}

void dfs(vector<int> numbers, vector<char>& operators) {
    // 종료조건
    if(operators.size() == n-1) {
        string expression = makeExpression(numbers, operators);
        // cout << expression << "\n";
        if(eval(expression) == 0) cout << expression << "\n";
        return;
    }
    

    // DFS
    for(int i=0; i<3; i++) {
        char o = opers[i];

        operators.push_back(o);
        dfs(numbers, operators);
        operators.pop_back();
    }
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    cin >> T;
    for(int i=0; i<T; i++) {
        cin >> n;
        vector<int> numbers;
        for(int j=0; j<n; j++) numbers.push_back(j+1);
        vector<char> operators;
        dfs(numbers, operators);
        cout << "\n";
    }

    return 0;
}
728x90
반응형
저작자표시 (새창열림)

'💡 Problem Solving > Baekjoon' 카테고리의 다른 글

[백준 - 20055] 컨베이어 벨트 위의 로봇 [C++]  (0) 2023.10.20
[백준 - 1197] 최소 스패닝 트리 [C++]  (0) 2023.10.20
[백준 - 1629] 곱셈 [C++]  (0) 2023.10.19
[백준 - 11286] 절댓값 힙 [C++]  (0) 2023.10.18
[백준 - 1931] 회의실 배정 [C++]  (0) 2023.10.17
    '💡 Problem Solving/Baekjoon' 카테고리의 다른 글
    • [백준 - 20055] 컨베이어 벨트 위의 로봇 [C++]
    • [백준 - 1197] 최소 스패닝 트리 [C++]
    • [백준 - 1629] 곱셈 [C++]
    • [백준 - 11286] 절댓값 힙 [C++]
    개발자 피터
    개발자 피터
    Backend Engineer 🔥

    티스토리툴바