11-2. 곱하기 혹은 더하기

연성·2020년 9월 24일
0

코딩테스트

목록 보기
26/261

1. 문제

각 자리가 숫자(0부터 9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 '*' 혹은 '+' 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰 수를 구하는 프로그램을 작성하세요. 단, +보다 *를 먼저 계산하는 일반적인 방식과는 달리, 모든 연산은 왼쪽에서부터 순서대로 이루어진다고 가정합니다.
예를 들어 02984라는 문자열이 주어지면, 만들어질 수 있는 가장 큰수는 ((((0+2)*9)*8)*4) = 576 입니다.

2. 입력

첫째 줄에 여러 개의 숫자로 구성도니 하나의 문자열 S가 주어집니다. (1<=S의 길이<=20)

3. 출력

첫째 줄에 만들어질 수 있는 가장 큰 수를 출력합니다.

4. 풀이

  • 대부분 곱하는 게 이득이지만 0과 1은 더하는 게 이득
  • 처음에는 앞, 뒤 둘 중 하나라도 0, 1이 있으면 더해야 하는 지 알았는데 그냥 뒤가 현재 뒤(현재 숫자)만 신경쓰면 되는 거였다.
  • 근데 제일 더한 결과 값도 0, 1이면 더해야 한다.(이것 때문에 앞, 뒤 다 신경써야 하는 지 알았다.)

5. 처음 코드와 달라진 점

  • sum==0 || sum ==1 이라고 썼는데 그냥 sum<=1이라고 쓰면 되는 거였다. 코드 길이가 줄었다.
  • S 자리 수가 꽤 길어서 다 곱하면 꽤 큰 수가 나올 것 같다.(int -> long long)

6. 코드

#include <iostream>

using namespace std;

int main(){
	long long sum = 0;
	string s;
	cin>>s;
	
	for(char ch : s ){
		int num = ch - '0';
		if(sum == 0 || sum == 1 || num == 0 || num == 1)	sum+=num;
		else sum*=num;
	}
	
	cout<<sum<<endl;
	
}

0개의 댓글