위의 문제는 단순히 괄호를 추가하여 가장 작은 값을 만들면 됩니다. 

예제 입력 1

55 - 50 + 40 에서 가장 작은값을 만드는 괄호는

55 - (50 + 40) = -35입니다. => 정답이 -35 로 출력되어 맞죠.

 

 

첫 입력부와 마지막 입력부는 숫자입니다. 

첫입력부 숫자 앞에는 - 부호가 붙지 않으니 무조건 양수입니다. 

 

ex )  A + B - C + D - E - F + G + H - I

A + B - [C + D] - [E] - [F + G + H] - [I]

 

처음 - 부호가 나오고 이후의 숫자들은 +이던 -이던 괄호 처리로 무조건 뺄 수 있습니다.

- 부호 이후부터 나오는 모든 값들을 빼주면, 최대한으로 빼주게 됩니다.

 

 

+와 - 그리고 ()까지 있어서 charater별 check하기위해 string사용하였습니다. 

InputData에서 string으로 식 받아옵니다. 

 

<C++>

#include <iostream>
#include <string>
using namespace std;

//입력받는부분
string input;

void InputData(){

	cin >> input;
}
int main(){

	InputData();

	
	int ans = 0;

	// 숫자 받아올 버퍼입니다.
	string temp;
	//처음 마이너스 부호 구분 flag입니다.
	bool FirstMinusFlag = false;
	
	for(int i = 0; i<= input.size(); i++)
	{
		

		if( input[i] == '-' || input[i] == '+' || input[i] == '\0')
		{

			if(FirstMinusFlag == true)
			{
				//stoi로 string to int 형변형입니다.
				ans -= stoi(temp);

			}
			else
			{
				ans += stoi(temp);
				
			}
			
			// ans에 temp값 처리된 후 다음 숫자를 받아오기 위해 clear합니다.
			temp.clear();
			if(input[i] == '-')
			{
				//처음 minus 부호 시에만 타는 if문입니다.
				FirstMinusFlag = true;
			}
			
			continue;
		}

			//char 한숫자씩 string에 담습니다. stoi로 위에서 형변형을 함으로 10진수 처리 안해줘도 됩니다.
			temp += input[i];
			
			//Debugging Code
			// cout<<"i :"<<i<<"temp :"<<temp<<endl;

	
			//cout<<"i :"<<i<< "ans: "<<ans<<endl;

	}
	cout<<ans<<endl;
	
	return 0;
}

 

<Python>

 

s = str(input())

#int 형
sum = 0

FirstMinusFlag = False

temp = ""

for i in s:

# Python string은 할당된 string이상의 index에 접근하지 못하도록 되어있음
# overflow를 강제로 발생시킬수 없음.
    if(i == '-' or i == '+'):    
        
      
        if(FirstMinusFlag == True):
            sum -= int(temp)
        else :
            sum += (int(temp))
            
        temp = ''
        if(i == '-') :
            FirstMinusFlag = True
        #부호일때 temp에 부호가 추가되지 않도록 continue
        continue
        
    temp += str(i)


#마지막 숫자를 추가해줌
if(FirstMinusFlag == True):
    sum -= int(temp)
else :
    sum += (int(temp))


print(sum)

 

 

 

 

 

 

 

 

 

우선 A, B, C로 각각 다른 조리 시간 버튼의 조합으로 T(요리시간)을 정확하게 맞출 수 있냐?

만약 맞출 수 있다면 A번 누른 횟수, B번 누른 횟수, C번 누른 횟수를 출력하라는 문제입니다. 

 

 

<C++>

// Example program
#include <iostream>
#include <string>

using namespace std;
int main()
{

	//결과값:최소 기능 사용 횟수
	int Acount = 0;
	int Bcount = 0;
	int Ccount = 0;

	// 전자레인지 도구(단위:second)
	int A = 300;
	int B = 60;
	int C = 10;

	//요리시간 T
	int T = 0;

	//불가능 여부 체크 flag
	bool impossibleFlag = false;

	cin >> T;

	while (T != 0)
	{

		if (T >= A)
		{
			//A기능 사용 나눈 몫
			Acount = T / A;
			//A기능 사용 후 나머지
			T = T % A;

		}
		else if (T >= B) {
            
			// B기능 사용 나눈 몫
			Bcount = T / B;
            // B기능 사용 후 나머지
			T = T % B;

		}
		else if (T >= C) {

            // C기능 사용 나눈 몫
			Ccount = T / C;
            // C기능 사용 후 나머지
			T = T % C;
		}
		else
		{

			if (T != 0)

			{
				// A,B,C로 계속 나눴지만 나머지가 남아
				// T 를 나누기 불가능한 경우
				impossibleFlag = true;
				break;
			}
		}
	}

	//T 나누기 불가능 여부 체크 후 
	//각각 결과 값 출력 분기문
	if (impossibleFlag == true)
	{
		cout << -1 << endl;
	}
	else {
		cout << Acount << " " << Bcount << " " << Ccount << endl;

	}
}

 

<Python>

# T 요리시간 단위 초
T = int(input())

# 조리시간 A,B,C도 초 단위로 맞춤
A = 300
B = 60
C = 10


#A,B,C각각의 count를 저장할 변수
A_cnt = 0;
B_cnt = 0;
C_cnt = 0;

#A,B,C로 나누어 떨어지지 않을 경우를 위한 flag
impossible_flag = False

while T != 0:
    
    
    if T >= A:
        A_cnt = int(T/A)
        T = T%A
    
    elif T>= B:
        B_cnt = int(T/B)
        T = T%B
    elif T>= C:
        C_cnt = int(T/C)
        T = T%C
    else:
        if T!= 0:
            impossible_flag = True
            break
        
if impossible_flag == True:
    print(-1)
else:
    print(A_cnt, B_cnt, C_cnt)

 

 

 

 

예제 입력 1

 

 

5 는 N (사람 수)이고 

3 1 4 3 2 는 각 사람들의 ATM사용 시간입니다. 

ATM을 사용하는데 N명의 사람이 기다리는 최소누적시간을 구하는 문제입니다. 

 

 

위의 문제 설명 Array로 설명해 놓았습니다.

1번째 예시

P[0] = 3 , P[1] = 1, P[2] = 4, P[3] = 3, P[4] = 2

와 같은 순서대로 계산하면 총 걸리는 시간(result)은 3+4+8+11+13 = 39분 입니다. 

result값은 각 사람들의 걸리는 시간의 누적되어 더해집니다

 

 

모두의 기다리는 시간 최소로 만드는 방법은

사용시간이 짧은 사람을 앞순서로 정렬하는 것입니다.

 

2번째 예시

 P[1] = 1, P[4] = 2, P[0] = 3, P[3] = 3 , P[2] = 4

와 같은 순서대로 계산하면 총 걸리는 시간(result)은 1+3+6+9+13 = 32분 입니다. 

 

 

<C++>

#include <iostream>
#include <list>
using namespace std;


int N;
int Wtime[1000];
int Wtime_sorted[1000];


int main(){

    //각 사람의 걸리는 시간을 list로 잡았습니다.
	list<int> mylist;
	
    //N명의 값을 받습니다.
	cin>> N;

    //N명 각각의 걸리는 시간을 받습니다.
	for(int i = 0; i<N; i++)
	{
		cin>> Wtime[i];
        //list에도 담아줍니다.
		mylist.push_back(Wtime[i]);		
	}

	//list 오름차순으로 sort 합니다.
	mylist.sort();

	for(int i = 0; i<N; i++)
	{

        //Wtime_sorted Array에 list front값을 가져옵니다.
		Wtime_sorted[i] = mylist.front();
        //담아둔 front값을 pop 하여 버립니다.
		mylist.pop_front();

	}


	int Sum = 0;

	for(int k= 0; k < N; k++)
	{
        //N명분 사람의 걸린 시간 반복합니다.
		for (int j = 0; j <= k; j++)
		{
            //0 ~ N-1번째 사람 앞사람의 걸린 시간 Sum에 더합니다.
			Sum += Wtime_sorted[j]; 
		}
	}

	cout<<Sum<<endl;

	return 0;
}

 

<Python>

n = int( input())
s = list(map(int, input().split()))


sum= 0;


#오름차순으로 정렬해줍니다. 
s.sort()
# print(s)

#큰 for loop n번까지 진행하는 i 입니다. 
for i in range(n):
    #i의 큰 loop가 돌때마다 i번까지 한번더 도는 작은 for loop입니다.
    for j in range(i+1):
        sum+= s[j]

print(sum)

 

 

+ Recent posts