๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ฏ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€] ๊ฟ€ ๋”ฐ๊ธฐ

by hossii 2024. 11. 13.

1. ๋ฌธ์ œ ์š”์•ฝ

  • N๊ฐœ์˜ ๊ฟ€์„ ๋‹ด๋Š” ๊ณต๊ฐ„์ด ์ฃผ์–ด์ง€๊ณ , ๊ฐ ๊ณต๊ฐ„์—๋Š” ๊ฟ€์˜ ์–‘์„ ์˜๋ฏธํ•˜๋Š” ์ˆซ์ž๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • N๊ฐœ ์ค‘ "ํ•˜๋‚˜"์˜ ๊ณต๊ฐ„์—๋Š” ๋ฒŒ์ง‘์ด ์žˆ๊ณ , 2๋งˆ๋ฆฌ์˜ ๊ฟ€๋ฒŒ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณต๊ฐ„์—์„œ ์‹œ์ž‘ํ•ด ๋ฒŒ์ง‘์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฟ€๋ฒŒ์€ ๋ฒŒ์ง‘์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์‹œ์ž‘์ ์„ ์ œ์™ธํ•œ ๊ณต๊ฐ„์— ๋Œ€ํ•ด ๊ฟ€์„ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ˆ˜์ง‘ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€์˜ ๊ฟ€์˜ ์–‘์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ

  • `int N`
  • `int[] honeys`

๋ฐ˜ํ™˜ ํƒ€์ž…

  • `int maxHoney`

์˜ˆ์ œ

  • N: 7
  • honeys: [9, 9, 4, 1, 4, 9, 9]
  • return: 57

์ฃผ์˜ ์‚ฌํ•ญ

  • ์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ, ์ค‘์ฒฉ for๋ฌธ์„ ์ด์šฉํ•ด ๋ชจ๋“  ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ๊ฐ„ ํšจ์œจ์„ฑ์„ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๊ตฌ๊ฐ„ ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•ด ๋‹จ์ผ for๋ฌธ์„ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฌธ์ œ ํ’€์ด

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;

public class Main {

  public static void main(String[] args) throws IOException {
    try (
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    ) {
      int N = Integer.parseInt(br.readLine());
      int[] honeys = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
      int[] prefixSum = new int[N];

      prefixSum[0] = honeys[0];
      for (int i = 1; i < N; i++) {
        prefixSum[i] = prefixSum[i-1] + honeys[i];
      }

      int maxHoney = 0;
      // Case 1: ๋ฒŒ(1)-๋ฒŒ(2)-๋ฒŒํ†ต
      for (int bee2 = 1; bee2 < N-1; bee2++) {
        int bee1Honey = prefixSum[N-1] - honeys[0] - honeys[bee2];
        int bee2Honey = prefixSum[N-1] - prefixSum[bee2];
        maxHoney = Math.max(maxHoney, bee1Honey + bee2Honey);
      }

      // Case 2: ๋ฒŒํ†ต-๋ฒŒ(1)-๋ฒŒ(2)
      for (int bee1 = N-2; bee1 > 0; bee1--) {
        int bee1Honey = prefixSum[bee1] - honeys[bee1];
        int bee2Honey = prefixSum[N-1] - honeys[bee1] - honeys[N-1];
        maxHoney = Math.max(maxHoney, bee1Honey + bee2Honey);
      }

      // Case 3: ๋ฒŒ(1)-๋ฒŒํ†ต-๋ฒŒ(2)
      for (int hive = 1; hive < N-1; hive++) {
        int bee1Honey = prefixSum[hive] - honeys[0];
        int bee2Honey = prefixSum[N-1] - prefixSum[hive-1] - honeys[N-1];
        maxHoney = Math.max(maxHoney, bee1Honey + bee2Honey);
      }

      bw.write(String.valueOf(maxHoney));
    }
  }

}

 

์‹œ๊ฐ„ ๋ณต์žก๋„

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: `O(N)`
    • Prefix Sum ๊ณ„์‚ฐ: ๋‹จ์ผ for๋ฌธ์„ ์‚ฌ์šฉํ•ด prefixSum ๋ฐฐ์—ด์„ ์ฑ„์šฐ๋Š” ์ž‘์—…์ด `O(N)`์ž…๋‹ˆ๋‹ค.
    • ๊ฐ ๊ฒฝ์šฐ๋ณ„ ์ตœ๋Œ€ ๊ฟ€ ์ˆ˜์ง‘๋Ÿ‰ ๊ณ„์‚ฐ: ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ(Case 1, Case 2, Case 3)์— ๋Œ€ํ•ด ๊ฐ๊ฐ ๋‹จ์ผ for๋ฌธ์„ ์‚ฌ์šฉํ•ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” `O(N)`์ž…๋‹ˆ๋‹ค.