Problem Solving/Programmers

Programmers [2020 카카오 인턴십] : 수식 최대화 풀이 및 코드

이진2 2020. 8. 31. 00:25

https://programmers.co.kr/learn/courses/30/lessons/67257

 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 �

programmers.co.kr

수식을 입력받아서, 연산자의 우선순위를 정하고 계산하는 문제이다 !!

수식 연산자는 더하기 빼기 곱하기의 세 가지만 있기 때문에 next_permutation 함수를 이용해서 우선순위를 이용했다

계산 과정은 N, N+1번째 피연산자를 N번째 연산자로 계산해서 N번째 피연산자로 교체하면 된다

후위연산식의 계산 과정은 생각이 났는데, 중위연산식이 생각이 잘 안 났기 때문에 그냥 벡터연산을 이용해서 풀이했다

 

수도코드는 다음과 같다

 

그냥 raw하게 코딩했는데 카카오 테크 블로그에 올라온 모범풀이와 비교해 봐야겠다... 😓

+ 딱히 특별한 접근법이 없는 단순 구현문제 !! 하지만 이 문제는 토큰분리 때문에 C++보다 java가 더 나을듯 ..?

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

using namespace std;

long long calculate(vector<long long> num, vector<char> op, vector<char> rank) {
	for (auto x : rank) {
		for (int i = 0; i < op.size(); i++) {
			if (op[i] == x) {
				vector<long long>::iterator it = num.begin()+i;
				long long one=*it,two=*(it+1);
				num.erase(it,it+2); 

				long long result = 0;
				if (x == '*')
					result = one * two;
				else if (x == '-')
					result = one - two;
				else result = one + two;

				it = num.begin() + i;
				num.insert(it, result);
				vector<char>::iterator ct = op.begin() + i;
				op.erase(ct);
				i--;
			}
		}
	}
	return abs(num[0]);
}

long long solution(string expression) {
	long long answer = 0;
	char str[101];
	vector<char> op;
	vector<long long> num;

	strcpy(str, expression.c_str());
	char* ptr = strtok(str, "+-*");
	

	while (ptr != NULL) {
		num.push_back(atoi(ptr));
		ptr = strtok(NULL, "+-*");
	}
	for (auto x : expression) {
		if (!(x >= '0' && x <= '9'))
			op.push_back(x);
	}

	vector<char> rank{ '*','+','-' };

	do {
		long long k=calculate(num, op, rank);
		if (k > answer)answer = k;
	} while (next_permutation(rank.begin(), rank.end()));

	return answer;
}

시간복잡도: O(N)

expression의 길이를 N이라 할 때, 연산자의 길이는 (N/2)이므로 f(n) = 3! * 3 * (N/2) 이므로 (N! = N^N)

다행히 연산자의 개수는 상수(3)로 고정되어 있기 때문에 시간복잡도는 매우 낮다