[1912번] μ—°μ†λœ ν•© JAVAβ˜•

2022. 5. 8. 05:27Β·πŸ”° λ°±μ€€/λ™μ κ³„νšλ²• 1
728x90

www.acmicpc.net/problem/1912

 

1912번: 연속합

첫째 쀄에 μ •μˆ˜ n(1 ≤ n ≤ 100,000)이 μ£Όμ–΄μ§€κ³  λ‘˜μ§Έ μ€„μ—λŠ” n개의 μ •μˆ˜λ‘œ 이루어진 μˆ˜μ—΄μ΄ μ£Όμ–΄μ§„λ‹€. μˆ˜λŠ” -1,000보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1,000보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄λ‹€.

www.acmicpc.net

μ•Œκ³ λ¦¬μ¦˜ [μ ‘κ·Ό 방법]

문제 μ˜ˆμ œλ“€μ„ κ·ΈλŒ€λ‘œ μ μš©ν•΄λ³΄λ©΄ 이렇닀.

 

첫 번째 μ˜ˆμ œλŠ” μ•„λž˜μ™€ κ°™λ‹€. (λ°°μ—΄λ‘œ ν‘œν˜„ν•¨)

 

μ—¬κΈ°μ„œ μ—°μ†λœ 수λ₯Ό μ„ νƒν•˜μ—¬ 뽑아내면 λ‹€μŒκ³Ό κ°™λ‹€.

 

 

두 번째 예제λ₯Ό 보자.

 

 

 

두 번째 예제λ₯Ό 보면 index5 에 -4 λΌλŠ” μŒμˆ˜κ°€ λ“€μ–΄μžˆμ§€λ§Œ 이λ₯Ό ν¬ν•¨ν•˜μ—¬ index7κΉŒμ§€ μ—°μ†μœΌλ‘œ νƒν•˜μ—¬ ν•©ν•œ 것이 μ΅œλŒ“κ°’μž„μ„ μ•Œ 수 μžˆλ‹€.

 

즉, ν¬μΈνŠΈλŠ” 음수 μ–‘μˆ˜ 상관없이 'μ—°μ†μ μœΌλ‘œ μ„ νƒν•œ μˆ˜μ˜ ν•©'이 μ΅œλŒ“κ°’μ΄ λ˜λŠ” 수λ₯Ό 찾으면 λ˜λŠ” 것이닀. 즉, λ©”λͺ¨μ΄μ œμ΄μ…˜μ€ μ΄μ „κΉŒμ§€ νƒμƒ‰ν–ˆλ˜ κ°’κ³Ό ν˜„μž¬ μœ„μΉ˜μ˜ 값을 λΉ„κ΅ν•˜μ—¬ 큰 값을 μ €μž₯ν•˜λ©΄ λ˜λŠ” 것이닀.

 

 

Top-Down 방식인 μž¬κ·€λ‘œ κ΅¬ν˜„ν•˜μžλ©΄ κ°œκ΄„μ μœΌλ‘œ λ‹€μŒκ³Ό κ°™λ‹€.

static int recur(int N) {
 
	// νƒμƒ‰ν•˜μ§€ μ•Šμ€ 인덱슀라면
	if(dp[N] == null) {
 
		// (이전 λ°°μ—΄μ˜ λˆ„μ ν•© + ν˜„μž¬ κ°’)κ³Ό ν˜„μž¬ 값을 λΉ„κ΅ν•˜μ—¬ μ΅œλŒ“κ°’μ„ Nμœ„μΉ˜μ— μ €μž₯
		dp[N] = Math.max(recur(N - 1) + arr[N], arr[N]);
		
	}
		
	return dp[N];
}

λ°˜λŒ€λ‘œ Bottom-Up으둜 ν•˜λ©΄ μœ„ μ½”λ“œλ₯Ό 반볡문으둜 λ‹€μŒκ³Ό 같이 κ΅¬ν˜„ν•  수 μžˆλ‹€.

for (int i = 1; i < N; i++) {
	dp[i] = Math.max(dp[i - 1] + arr[i], arr[i]);
}

그러면 λ©”λͺ¨μ΄μ œμ΄μ…˜μ΄ 된 dpλ°°μ—΄μ—λŠ” 각 μΈλ±μŠ€κΉŒμ§€μ˜ μ΅œλŒ“값이 μ €μž₯λ˜μ–΄μžˆλ‹€λŠ” μ˜λ―Έλ‹€. μ˜ˆλ‘œλ“€μ–΄ dp[3]이라 ν•˜λ©΄ dp[0] ~ dp[3] μ—μ„œ μ—°μ†μœΌλ‘œ μ„ νƒν•œ λΆ€λΆ„ μˆ˜μ—΄μ˜ μ΅œλŒ“값이 μ €μž₯λ˜μ–΄μžˆλ‹€λŠ” μ˜λ―Έλ‹€.

 

그리고 λ‚˜μ„œ dp λ°°μ—΄μ˜ μ›μ†Œλ“€ 쀑 κ°€μž₯ 큰 κ°’을 μ°Ύμ•„μ„œ 좜λ ₯ν•˜λ©΄ λ˜λŠ” 것이닀.

 

이 λ•Œ dpλ°°μ—΄μ˜ μ΅œλŒ“κ°’μ„ μ •λ ¬ λ˜λŠ” ν•˜λ‚˜ν•˜λ‚˜ νƒμƒ‰ν•˜μ—¬ μ°Ύμ•„λ‚΄λŠ” 방법도 μžˆμ§€λ§Œ, μ²˜μŒλΆ€ν„° μ•„μ˜ˆ μž¬κ·€ λ˜λŠ” λ°˜λ³΅λ¬Έμ•ˆμ— maxλ³€μˆ˜λ₯Ό ν•˜λ‚˜ 두어 μ΅œλŒ“κ°’μ„ κ°±μ‹  ν•˜λŠ” 것이 λ”μš± 효율적일 것이닀.



풀이 및 μ½”λ“œ

- 방법 1 : [Scanner + Top-Down]

import java.util.Scanner;
 
public class Main {
	
	static int[] arr;		// λ°°μ—΄ 
	static Integer[] dp;		// λ©”λͺ¨μ΄μ œμ΄μ…˜ ν•  dp
	static int max;			// μ΅œλŒ“κ°’ λ³€μˆ˜ 
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		
		int N = in.nextInt();
		
		arr = new int[N];
		dp = new Integer[N];
		
		for(int i = 0; i < N; i++) {
			arr[i] = in.nextInt();
		}
		
		/*
		 * dp[0]은 첫 μ›μ†Œλ‘œ 이전에 더이상 탐색할 것이 μ—†κΈ° λ•Œλ¬Έμ—
		 * arr[0] 자체 값이 λ˜λ―€λ‘œ arr[0]으둜 μ΄ˆκΈ°ν™” ν•΄μ€€λ‹€.
		 * maxλ˜ν•œ 첫 번째 μ›μ†Œλ‘œ μ΄ˆκΈ°ν™” ν•΄μ€€λ‹€.
		 */
		dp[0] = arr[0];
		max = arr[0];
		
		// dp의 λ§ˆμ§€λ§‰ indexλŠ” N-1μ΄λ―€λ‘œ N-1λΆ€ν„° Top-Down 탐색 
		recur(N - 1);
		
		System.out.println(max);
	}
	
	static int recur(int N) {
		
		// νƒμƒ‰ν•˜μ§€ μ•Šμ€ 인덱슀라면
		if(dp[N] == null) {
			dp[N] = Math.max(recur(N - 1) + arr[N], arr[N]);
 
			// ν•΄λ‹Ή dp[N]κ³Ό max 쀑 큰 κ°’μœΌλ‘œ max κ°±μ‹  
			max = Math.max(dp[N], max);
		}
		
		return dp[N];
	}
}

μ•žμ„œ λ§ν–ˆλ“― 탐색 κ³Όμ •μ—μ„œ μ•„μ˜ˆ maxλ³€μˆ˜λ₯Ό 두고 ν•΄λ‹Ή index n의 μœ„μΉ˜μ— μ €μž₯ 될 μ΅œλŒ“κ°’κ³Ό ν˜„μž¬ max값을 λΉ„κ΅ν•˜λ©΄μ„œ μ΅œλŒ“κ°’μ„ κ°±μ‹ μ‹œν‚€λŠ” 것이닀. μ΄λ ‡κ²Œ ν•˜λŠ” 것이 ꡳ이 recur() 탐색 μ’…λ£Œ ν›„ 또 dp배열을 νƒμƒ‰ν•˜λ©΄μ„œ μ΅œλŒ“κ°’μ„ 찾을 ν•„μš” 없이 recur() 탐색 κ³Όμ •μ—μ„œ ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 μžˆμœΌλ‹ˆ μ’€ 더 νš¨μœ¨μ μ΄λ‹€.


- 방법 2 : [Scanner + Bottom-Up]

import java.util.Scanner;
 
public class Main {
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		
		int[] arr = new int[N];
		int[] dp = new int[N];
		
		for(int i = 0; i < N; i++) {
			arr[i] = in.nextInt();
		}
		
 
		/*
		 * dp[0]은 첫 μ›μ†Œλ‘œ 이전에 더이상 탐색할 것이 μ—†κΈ° λ•Œλ¬Έμ—
		 * arr[0] 자체 값이 λ˜λ―€λ‘œ arr[0]으둜 μ΄ˆκΈ°ν™” ν•΄μ€€λ‹€.
		 * maxλ˜ν•œ 첫 번째 μ›μ†Œλ‘œ μ΄ˆκΈ°ν™” ν•΄μ€€λ‹€.
		 */
		dp[0] = arr[0];
		int max = arr[0];
		
		for (int i = 1; i < N; i++) {
			// (이전 dp + ν˜„μž¬ arrκ°’) κ³Ό ν˜„μž¬ arrκ°’ 쀑 큰 것을 dp에 μ €μž₯ 
			dp[i] = Math.max(dp[i - 1] + arr[i], arr[i]);
			// μ΅œλŒ“κ°’ κ°±μ‹  
			max = Math.max(max, dp[i]);
		}
		System.out.println(max);
 
	}
}
728x90
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ”° λ°±μ€€/λ™μ κ³„νšλ²• 1' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [12865번] ν‰λ²”ν•œ λ°°λ‚­ JAVAβ˜•
  • [9251번] LCS JAVAβ˜•
  • [2565번] 전깃쀄 JAVAβ˜•
  • [11054번] κ°€μž₯ κΈ΄ 바이토닉 λΆ€λΆ„ μˆ˜μ—΄ JAVAβ˜•
juno1105
juno1105
κ³΅λΆ€ν•˜λŠ” κ²Έ 포폴 λΈ”λ‘œκ·Έ
  • juno1105
    @juno1105
    juno1105
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (89)
      • πŸ’¬ 자유 (3)
      • πŸ“– μ–΄ν•™ 곡뢀 (0)
      • πŸ“” 개발 ν”„λ‘œμ νŠΈ (4)
      • πŸ›  ν”„λ‘œκ·Έλž¨ 였λ₯˜ 해결법 (1)
      • πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜ (53)
        • μŠ€νƒ (4)
        • 큐 (4)
        • μ •λ ¬ 및 탐색 (17)
        • 리슀트 (5)
        • ν•΄μ‹œ (1)
        • 트리 (8)
        • νž™ (2)
        • κ·Έλž˜ν”„ (12)
      • πŸ’» 컴퓨터 ꡬ쑰 (0)
      • πŸš₯ λ…Όλ¦¬νšŒλ‘œ (8)
      • πŸ”° λ°±μ€€ (20)
        • 큐, μŠ€νƒ, 덱 (0)
        • DFS 와 BFS (3)
        • 그리디 (0)
        • λ™μ κ³„νšλ²• 1 (16)
        • λ™μ κ³„νšλ²• 2 (0)
        • μ΅œλ‹¨ 경둜 (0)
        • 트리 (0)
        • λ°±νŠΈλž˜ν‚Ή (0)
        • μœ λ‹ˆμ˜¨ νŒŒμΈλ“œ (0)
        • μ§‘ν•©κ³Ό λ§΅ (1)
      • 🌈 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (0)
      • πŸ“± μ•ˆλ“œλ‘œμ΄λ“œ μ•± (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

    • ✨자료ꡬ쑰 μ•Œκ³ λ¦¬μ¦˜ 컀리큘럼✨
  • 인기 κΈ€

  • νƒœκ·Έ

    토읡
    μ•Œκ³ λ¦¬μ¦˜
    토읡 920점
    μ΅œλ‹¨κ²½λ‘œ
    μ •λ ¬
    토읡 900점
    토읡 900μ λŒ€
    토읡 900
    μ •λ ¬ μ΅œμ„ μ˜ 경우
    κ·Έλž˜ν”„νƒμƒ‰
    μ‹œκ°„λ³΅μž‘λ„
    토읡 950점
    λΉ…μ˜€ν‘œκΈ°λ²•
    μ •λ ¬ μ΅œμ•…μ˜ 경우
    토읡 910점
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
juno1105
[1912번] μ—°μ†λœ ν•© JAVAβ˜•
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”