반응형
<문제 분석>
숫자 문자열의 왼쪽부터 오른쪽까지 하나씩 숫자끼리 연산을 해서 가장 큰수를 구하라.
연산은 '+'와 'x' 두개만 사용할 수 있다. 모든 연산은 왼쪽부터 순서대로 이루어진다.
<첫번째 풀이 - 성공>
문자열을 정수형 배열에 변환해서 담는다.
for문으로 숫자를 하나씩 확인하면서 만약 0이면 다음에 '+', 아니면 'x'를 오게해서 Queue에 저장한다.
다음 for문으로 큐에서 연산자를 하나씩 빼면서 숫자 연산을 해서 ans에 누적시킨다.
-----------------------------------------------------------------------------------------------
<해설>
첫번째 수는 ans 변수에 저장한다. 그 뒤 숫자부터 for문을 돌리면서
두 수중 하나라도 1이나 0이면 두 수를 '+' 연산을 누적해서 하고,
아니면 '*'연산을 누적해서 한다.
내가 짠 코드보다 (1)큐를 사용하지 않았고, (2) for문도 한개만 사용했다.
<정답코드>
import java.util.Scanner;
//import java.util.Queue;
//import java.util.LinkedList;
// [이코테](그리디) 02. 곱하기 혹은 더하기
public class Main {
static int A[];
public void InputData() {
Scanner sc = new Scanner(System.in);
String s = sc.next();
A = new int[s.length()];
for (int i=0; i<s.length(); i++) {
A[i] = s.charAt(i) - '0';
}
}
public void Solve() {
int ans = 0;
// 1. Queue를 사용한 풀이
// Queue<Character> Q = new LinkedList<>();
// for (int x : A) {
// if (x == 0 || x == 1) {
// Q.offer('+');
// } else {
// Q.offer('*');
// }
// }
// ans = A[0];
// for (int i=1; i<A.length; i++) {
// char c = Q.poll();
// if (c == '+') {
// ans += A[i];
// } else {
// ans *= A[i];
// }
// }
// 2. 큐를 사용하지 않는 개선안
ans = A[0]; // 첫번째 수를 담는다.
for (int i=1; i<A.length; i++) {
// 앞뒤 두 수중 하나라도 0이나 1이면 '+'를 한다.
if (A[i] <= 1 || ans <= 1) {
ans += A[i];
} else { // 아니면 '*'를 한다.
ans *= A[i];
}
}
System.out.println(ans);
}
public static void main (String[] args)
{
Main m = new Main();
m.InputData();
m.Solve();
}
}
반응형
'알고리즘 PS > 이것이 코딩 테스트다' 카테고리의 다른 글
[이코테][기출] 05. 볼링공 고르기 (0) | 2022.10.18 |
---|---|
[이코테][기출] 04. 만들 수 없는 금액 (0) | 2022.10.18 |
[이코테][기출] 03. 문자열 뒤집기 (0) | 2022.10.18 |
댓글