알고리즘 (with JAVA)/코드트리 조별과제

코드트리 조별과제 3회차(7.29 ~ 8.04)

백_곰 2024. 8. 3. 22:13

PreProcessing

 

[ 문제 ]

[4, 2, 1, 5, 7, 3] 와 같이 숫자들이 주어졌을 때, 특정 위치를 적절하게 선택하여 

해당 위치에 놓여있는 숫자와 그 숫자를 포함하여 뒤에 놓여 있는 숫자들 중 최솟 값을

곱한 값이 최대가 되도록 프로그램을 작성하시오.

 

 

[ 해결책(1) - O(N^2) ]

1번째 위치를 선택하게 되면, 1이 최솟값이므로 4*1 = 4 가 된다.

5번째 위치를 선택하게 되면, 3이 최솟값이므로 7*3 = 21 이 된다.

그러므로, 5번째 위치가 나오도록 하면 된다.
무작정 코드를 작성하게 되면, 각 위치를 한번 씩 잡아보면서 그 뒤에 있는 숫자 전부를

확인하면 O(N^2)이 된다.

 

 

[ 해결책(2) - O(N) ]

그러나, 만약 R이라는 배열을 R(i) = i 번째부터 N 번째까지 미리 구해 놓는다면,

각 위치를 체크하면서 구하면 되므로, O(N)으로 구할 수 있게 된다.
그러면 R 배열을 어떻게 구할 수 있을까?

먼저, R(N)은 Arr(N)과 같으므로 초기화하고 N-1 ~ 1까지 R(i) = min(R(i+1), Arr(i))

로 계산하게 되면, O(N)이 된다.
그러면 이제 위 문제를 토대로 한번 R 배열과 실제 코드를 만들어보자!

 

  1 2 3 4 5 6
Arr 4 2 1 5 7 3
R 1 1 1 3 3 3

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;
import java.io.*;
 
public class Main {
    public static final int INT_MIN = Integer.MIN_VALUE;
 
    public static void main(String[] args) {
        int N = 6;
 
        int[] arr = new int[]{0421573};
        int[] R = new int[N+1];
 
        // R 배열을 채워줍니다.
        R[N] = arr[N];
        for(int i = N - 1; i >= 1; i--)
            R[i] = Math.min(R[i + 1], arr[i]);
 
        // 답을 구해줍니다.
        int ans = INT_MIN;
        for(int i = 1; i <= N; i++)
            ans = Math.max(ans, arr[i] * R[i]);
 
        // 가능한 최댓값 = 21
        System.out.print(ans);
    }
}
 
cs

 

이러한 R 배열 생성 및 작업을 전처리 작업이라고 부른다.

 

연습문제 - (코드트리) 괄호 쌍 만들어주기

 

https://www.codetree.ai/missions/8/problems/pair-parentheses?&utm_source=clipboard&utm_medium=text

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.*;
import java.io.*;
 
public class Main {
    static String input;
    static int N, R[];
    static long ans;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        input = br.readLine();
 
        N = input.length();
 
        R = new int[N];
 
        solve();
 
        System.out.println(ans);
    }
 
    static void solve(){
 
        // 전처리 작업
        R[N-1= 0;
 
        for(int i=N-2; i>=0; i--){
            if(input.charAt(i) == ')' && input.charAt(i+1== ')') R[i] = R[i+1+ 1;
            else R[i] = R[i+1];
        }
 
        // 답 도출 
        for(int i=0; i<N-2; i++){
            if(input.charAt(i)=='(' && input.charAt(i+1)=='(') ans += R[i+2];
        }
    }
}
 
cs