-
O - [ 그리디 ] 02 곱하기 혹은 더하기 - R알고리즘/이코테 - 기출 2021. 10. 5. 17:31
난이도 : 하 풀이시간 : 30/8 시간제한 : 1초 기출 : Facebook 인터뷰
[ 그리디 ] 02 곱하기 혹은 더하기
각 자리가 숫자(0부터 9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며
숫자 사이에 'x' 혹은 '+' 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰 수를 구하는 프로그램을 작성하세요.
단, + 보다 x를 먼저 계산하는 일반적인 방식과는 달리, 모든 연산은 왼쪽에서부터 순서대로 이루어진다고 가정합니다.
예를 들어 02984라는 문자열로 만들 수 있는 가장 큰 수는 ((((0 + 2) x 9) x 8) x 4) = 576입니다.
또한 만들어질 수 있는 가장 큰 수는 항상 20억 이하의 정수가 되도록 입력이 주어집니다.
:: 입력 조건
첫째 줄에 여러 개의 숫자로 구성된 하나의 문자열 S가 주어집니다. (1 <= S의 길이 <= 20)
:: 출력 조건
첫째 줄에 만들어질 수 있는 가장 큰 수를 출력합니다.
아이디어
1. 문자열 s를 입력받고
2. 각 자리의 숫자를 정수형으로 바꿔서 vector에 집어넣음
3. 하나씩 꺼내서 꺼낸 숫자가 0 또는 1이거나 그 당시의 결과값이 0인 경우 더하기 수행
그 이외의 경우 무조건 곱하기를 수행함
4. 모든 연산이 끝나면 결과 출력
내 코드
#include <iostream> #include <vector> #include <algorithm> #include <queue> #include <string> using namespace std; int main() { vector<int> v; string s; cin >> s; for (int i = 0; i < s.length(); i++) { v.push_back(s[i] - '0'); } int result = 0; for (int i = 0; i < s.length(); i++) { if (v[i] == 0 || v[i] == 1 || result == 0) { result += v[i]; } else result *= v[i]; } cout << result; }
정답 코드
#include <bits/stdc++.h> using namespace std; string str; int main(void) { cin >> str; // 첫 번째 문자를 숫자로 변경한 값을 대입 long long result = str[0] - '0'; for (int i = 1; i < str.size(); i++) { // 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행 int num = str[i] - '0'; if (num <= 1 || result <= 1) { result += num; } else { result *= num; } } cout << result << '\n'; }
리뷰
굳이 값을 벡터에 옮길 필요 없이 string에서 값을 추출해서 연산해도 된다는 걸 생각 못함
'알고리즘 > 이코테 - 기출' 카테고리의 다른 글
X - [ 그리디 ] 만들 수 없는 금액 - R (0) 2021.10.06 △ - [ 그리디 ] 03 문자열 뒤집기 - R (0) 2021.10.05 △ - [ 그리디 ] 01 모험가 길드 - R (0) 2021.10.05 X - [ 구현 ] 10 자물쇠와 열쇠 (0) 2021.07.20 X - [ 구현 ] 09 문자열 압축 (0) 2021.07.19