Min:D's Devlog

[SWEA][모의 SW 역량테스트][C++] 4008 숫자 만들기 본문

알고리즘/SWEA

[SWEA][모의 SW 역량테스트][C++] 4008 숫자 만들기

Min:D 2020. 7. 19. 13:21

문제

SWEA 모의 SW 역량테스트 - 4008 숫자 만들기

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


문제 풀이

접근 방식

연산자의 순서를 조합하여 연산의 최댓값과 최소값을 구하고, 그 값들의 차를 구하는 문제이다.

조합을 만들기 위해 next_permutation을 사용해 주었다.

그리고 연산자를 입력 받을 때 +는 0, -는 1, ×는 2, ÷는 3으로 저장하고,

switch문을 사용하여 연산을 해주었다.

 


풀이 코드 - C++

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main(int argc, char** argv)
{
    int test_case;
    int T, N;
    // freopen("input.txt", "r", stdin);
    cin >> T;
    for (test_case = 1; test_case <= T; ++test_case) {
        int n;
        int MAX = -100000000;
        int MIN = 100000000;
        vector<int> opers;
        vector<int> nums;
 
        // 입력 받기
        cin >> N;
        for (int i = 0; i < 4; i++)  {
            cin >> n;
            for (int j = 0; j < n; j++) {
                opers.push_back(i);
            }
        }
        for (int i = 0; i < N; i++) {
            cin >> n;
            nums.push_back(n);
        }
 
        // 연산자 조합하기
        do {
            int result = nums[0];
            for (int i = 0; i < N - 1; i++)  {
                switch (opers[i]) {
                case 0: // +
                    result += nums[i + 1];
                    break;
                case 1: // -
                    result -= nums[i + 1];
                    break;
                case 2: // *
                    result *= nums[i + 1];
                    break;
                case 3: // /
                    result /= nums[i + 1];
                    break;
                }
            }
 
            if (result > MAX)
                MAX = result;
            if (result < MIN)
                MIN = result;
        } while (next_permutation(opers.begin(), opers.end()));
         
        cout << "#" << test_case << " " << MAX - MIN << endl;
    }
    return 0;
}

실행 결과

Comments