개발자 피터
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)

블로그 메뉴

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

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

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

Peter's Dev Blog

💡 Problem Solving/Baekjoon

[백준 - 15658] 연산자 끼워넣기 (2) [C++]

2021. 1. 26. 23:37
728x90
반응형

1. 문제

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

 

15658번: 연산자 끼워넣기 (2)

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1보다 크거나 같고, 4N보다 작거나 같은 4개의 정수가 주어지는데, 차례대

www.acmicpc.net

2. 풀이과정

모든 수의 사이에 연산자를 끼워 넣을 수 있는 모든 경우에 대해서 식의 결과의 최대, 최소를 구한다.

[코드설명]

dfs함수는 모든 수의 사이에 연산자를 끼워 넣을 수 있는 모든 경우에 대해 탐색한다.

 

주의해야 할 점은 최대값, 최소값을 저장하는 변수의 초기값을 잘 설정해줘야 하는 것이다.

연산자를 어떻게 끼워넣어도 항상 -10억보다 크거나 같고,

10억보다 작거나 같은 결과가  나오는 입력만 주어지므로

최대값의 초기값은 -10억보다 작은 값,

최소값의 초기값은 10억보다 큰 값으로 설정해줘야한다.

(climits헤더의 INT_MIN, INT_MAX을 사용해도 된다)

 

3. 코드

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

using namespace std;
int n;
vector<int> nums;
int opers[4];
int max_v = -1000000010, min_v = 1000000010;


void dfs(int plus, int minus, int multiply, int divide, int ret, int depth) {
    if(depth == n-1) {
        max_v = max(max_v, ret);
        min_v = min(min_v, ret);
        return ;
    }
    if(plus>0) dfs(plus-1, minus, multiply, divide, ret + nums[depth+1], depth+1);
    if(minus>0) dfs(plus, minus-1, multiply, divide, ret - nums[depth+1], depth+1);
    if(multiply>0) dfs(plus, minus, multiply-1, divide, ret * nums[depth+1], depth+1);
    if(divide>0) dfs(plus, minus, multiply, divide-1, ret / nums[depth+1], depth+1);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    nums.resize(n);
    for(int i=0; i<n; i++) {
        cin >> nums[i];
    }
    for(int i=0; i<4; i++) {
        cin >> opers[i];
    }
    int ret = nums[0];
    dfs(opers[0], opers[1], opers[2], opers[3], ret, 0);
    cout << max_v << "\n" << min_v;
    return 0;
}
728x90
반응형
저작자표시 (새창열림)

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

[백준 - 14500] 테트로미노 [C++]  (0) 2021.03.06
[백준 - 14501] 퇴사 [C++]  (0) 2021.02.14
[백준 - 15666] N과 M (12) [C++]  (0) 2021.01.26
[백준 - 15665] N과 M (11)  (0) 2021.01.26
[백준 - 15664] N과 M (10) [C++]  (0) 2021.01.24
    '💡 Problem Solving/Baekjoon' 카테고리의 다른 글
    • [백준 - 14500] 테트로미노 [C++]
    • [백준 - 14501] 퇴사 [C++]
    • [백준 - 15666] N과 M (12) [C++]
    • [백준 - 15665] N과 M (11)
    개발자 피터
    개발자 피터
    Backend Engineer 🔥

    티스토리툴바