본문 바로가기
알고리즘 PS/이것이 코딩 테스트다

[이코테][기출] 02. 곱하기 혹은 더하기

by 백호루이 2022. 10. 18.
반응형

 

<문제 분석>

숫자 문자열의 왼쪽부터 오른쪽까지 하나씩 숫자끼리 연산을 해서 가장 큰수를 구하라.

연산은 '+' '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();
	}
}
반응형

댓글