관리 메뉴

Partially Committed

[λ°±μ€€ 27210] 신을 λͺ¨μ‹œλŠ” 사당(JAVA) λ³Έλ¬Έ

πŸ”₯ Algorithm || λ¬Έμ œν’€μ΄/PS

[λ°±μ€€ 27210] 신을 λͺ¨μ‹œλŠ” 사당(JAVA)

WonderJay 2023. 1. 16. 18:07
728x90
λ°˜μ‘ν˜•
SMALL

 

μ‹œκ°„ μ œν•œλ©”λͺ¨λ¦¬ μ œν•œμ œμΆœμ •λ‹΅λ§žνžŒ μ‚¬λžŒμ •λ‹΅ λΉ„μœ¨
2 초 512 MB 285 124 98 47.573%

문제

신을 λͺ¨μ‹œλŠ” μ‚¬λ‹Ήμ—λŠ” 신을 μ‘°κ°ν•œ λŒμƒ Nκ°œκ°€ 일렬둜 놓여 μžˆλ‹€. 각 λŒμƒμ€ μ™Όμͺ½ λ˜λŠ” 였λ₯Έμͺ½μ„ 바라보고 μ„œμžˆλ‹€. μ°½μ˜μ΄λŠ” μ—°μ†ν•œ λͺ‡ 개의 λŒμƒμ— κΈˆμΉ μ„ ν•˜μ—¬ ꢁ극의 κΉ¨λ‹¬μŒμ„ μ–»κ³ μž ν•œλ‹€.

ꢁ극의 κΉ¨λ‹¬μŒμ„ μ–»κΈ° μœ„ν•΄μ„œλŠ” κ°€λŠ₯ν•œ ν•œ λ§Žμ€ κΈˆμƒ‰ λŒμƒλ“€μ΄ 같은 λ°©ν–₯을 바라보아야 ν•œλ‹€. λ°©ν–₯이 λ‹€λ₯Έ λŒμƒμ€ κΉ¨λ‹¬μŒμ— 치λͺ…적이닀. κΉ¨λ‹¬μŒμ˜ 양은 μ•„λž˜μ™€ 같이 μ •μ˜λœλ‹€.

| (μ™Όμͺ½μ„ λ°”λΌλ³΄λŠ” κΈˆμƒ‰ λŒμƒμ˜ 개수) - (였λ₯Έμͺ½μ„ λ°”λΌλ³΄λŠ” κΈˆμƒ‰ λŒμƒμ˜ 개수) |

μ°½μ˜μ΄λŠ” ꢁ극의 κΉ¨λ‹¬μŒμ„ 얻을 수 μžˆμ„κΉŒ?

μž…λ ₯

첫째 쀄에 λŒμƒμ˜ 개수 N이 주어진닀.

λ‘˜μ§Έ 쀄에 λŒμƒμ΄ λ‚˜μ—΄λœ μˆœμ„œλŒ€λ‘œ, 각 λŒμƒμ΄ 바라보고 μžˆλŠ” λ°©ν–₯이 주어진닀. μž…λ ₯의 νŽΈμ˜μƒ μ™Όμͺ½μ€ 1, 였λ₯Έμͺ½μ€ 2라고 ν•˜μž.

좜λ ₯

μ΅œλŒ€ν•œ λ§Žμ€ κΉ¨λ‹¬μŒμ„ μ–»κΈ° μœ„ν•΄ κΈˆμ„ μΉ ν•˜μ˜€μ„ λ•Œ, 얻을 수 μžˆλŠ” κΉ¨λ‹¬μŒμ˜ 양을 좜λ ₯ν•œλ‹€.

μ œν•œ

  • 1 ≤ N ≤ 100,000

https://usedto-wonderwhy.tistory.com/entry/%EB%B0%B1%EC%A4%80-1912-%EC%97%B0%EC%86%8D%ED%95%A9-DP

 

[λ°±μ€€ 1912] 연속합 (DP)

연속합 https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 쀄에 μ •μˆ˜ n(1 ≤ n ≤ 100,000)이 주어지고 λ‘˜μ§Έ μ€„μ—λŠ” n개의 μ •μˆ˜λ‘œ 이루어진 μˆ˜μ—΄μ΄ 주어진닀. μˆ˜λŠ” -1,000보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1,000보닀 μž‘κ±°

usedto-wonderwhy.tistory.com

μœ„ λ¬Έμ œμ™€ 거의 μœ μ‚¬ν•˜λ‹€.

μ™Όμͺ½μ„ λ°”λΌλ³΄λŠ” κΈˆμƒ‰ λŒμƒμ˜ 개수λ₯Ό -1 이라고 μ •μ˜ν•˜κ³  였λ₯Έμͺ½μ„ λ°”λΌλ³΄λŠ” κΈˆμƒ‰ λŒμƒμ˜ 개수λ₯Ό +1 이라고 μ •μ˜ν•˜λ©΄

주어진 μž…λ ₯은 -1, +1 둜 이루어진 ν•˜λ‚˜μ˜ 연속 μˆ˜μ—΄μ΄ 되며,

 

ν•΄λ‹Ή μˆ˜μ—΄μ—μ„œ ꡬ할 수 μžˆλŠ” μ—°μ†ν•©μ˜ μ΅œλŒ€λ₯Ό κ΅¬ν•˜λ©΄ λœλ‹€.

 

dp [ i ] λ₯Ό i λ²ˆμ§ΈκΉŒμ§€μ˜ μ΅œλŒ€ 연속합이라고 μ •μ˜ν•˜λ©΄,

dp [ i ] = Max ( dp[i-1]+arr[i] , arr[i] ) 와 κ°™λ‹€.

(i-1 λ²ˆμ§ΈκΉŒμ§€μ˜ μ΅œλŒ€ 연속합에 ν˜„μž¬ i 번째 μ›μ†Œλ₯Ό λ”ν•œ 것과, ν˜„μž¬ i 번째 μ›μ†Œ 쀑 더 큰 값이 i λ²ˆμ§ΈκΉŒμ§€μ˜ μ΅œλŒ€ 연속합)

 

λ‹€λ§Œ, μ™Όμͺ½μ„ -1, 였λ₯Έμͺ½μ„ +1 둜 바라본 κ²½μš°μ™€

μ™Όμͺ½μ„ +1, 였λ₯Έμͺ½μ„ -1 둜 바라본 경우λ₯Ό 각각 κ΅¬ν•˜μ—¬ λ‘˜ 쀑 μ΅œλŒ€κ°’μ„ κ΅¬ν•΄μ£ΌλŠ” 것을 μœ μ˜ν•΄μ•Ό ν•œλ‹€.

 

이λ₯Ό κ΅¬ν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        int n;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stk = new StringTokenizer(br.readLine());
        n = Integer.parseInt(stk.nextToken());
        int[] arr = new int[n];

        stk = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(stk.nextToken());
        }

        int[] dp = new int[n];
        int ans = -10;
        for (int i = 0; i < n; i++) {
            int cur = arr[i] == 1 ? -1 : 1;
            if (i == 0) {
                dp[i] = cur;
            } else { // i!=0
                dp[i] = Math.max(dp[i - 1] + cur, cur);
            }
        }
        for (int i = 0; i < n; i++) {
            ans = Math.max(ans, dp[i]);
        }

        dp = new int[n];
        for (int i = 0; i < n; i++) {
            int cur = arr[i] == 1 ? 1 : -1;
            if (i == 0) {
                dp[i] = cur;
            } else { // i!=0
                dp[i] = Math.max(dp[i - 1] + cur, cur);
            }
        }
        for (int i = 0; i < n; i++) {
            ans = Math.max(ans, dp[i]);
        }
        System.out.println(ans);
    }
}

728x90
λ°˜μ‘ν˜•
LIST
Comments