[Algorithm] ๐Ÿ ์šธํƒ€๋ฆฌ ์ž˜๋ผ๋‚ด๊ธฐ

HaJingJingยท2021๋…„ 4์›” 3์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
8/119
post-thumbnail

0. ๋ฌธ์ œ

๋„ˆ๋น„๊ฐ€ ๊ฐ™๊ณ  ๋†’์ด๊ฐ€ ๋‹ค๋ฅธ ํŒ์ž๋“ค์ด ๋ถ™์–ด์„œ ์šธํƒ€๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ์„ ๋•Œ, ์šธํƒ€๋ฆฌ์—์„œ ์ž˜๋ผ ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค์–ด๋ผ

์ž…๋ ฅ
ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค(C)
๋‚˜๋ฌด ํŒ์ž์˜ ์ˆซ์ž
๋‚˜๋ฌด ํŒ์ž์˜ ๊ฐ ๋†’์ด

์ถœ๋ ฅ
๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด


1. ๋ฌธ์ œ ๊ฐ„๋‹จ ํ•ด์„

๋ถ™์–ด์žˆ๋Š” ํŒ์ž์—์„œ ์ž๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๊ตฌํ•ด๋ผ

2. ์•„์ด๋””์–ด

๐Ÿ’ก ์ด 3๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€๋Šฅํ•จ
1) ๋ฐ˜์ ˆ์„ ์ž˜๋ž์„ ๋•Œ ์™ผ์ชฝ ๋ถ€๋ถ„์—์„œ์˜ ์ง์‚ฌ๊ฐํ˜•์ด ๊ฐ€์žฅ ํด ๋•Œ
2) ๋ฐ˜์ ˆ์„ ์ž˜๋ž์„ ๋•Œ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ์˜ ์ง์‚ฌ๊ฐํ˜•์ด ๊ฐ€์žฅ ํด ๋•Œ
3) ์ค‘๊ฐ„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋†’์ด๊ฐ€ ๋†’์€ ์ชฝ์œผ๋กœ ๋„“ํ˜€๋‚˜๊ฐ”์„ ๋•Œ์˜ ์ง์‚ฌ๊ฐํ˜•์ด ๊ฐ€์žฅ ํด ๋•Œ

1,2 ๋Š” ๋ถ„ํ• ์ •๋ณต์„ ํ†ตํ•ด์„œ
3์€ ์˜ค๋ฅธ์ชฝ ์™ผ์ชฝ์„ ๋น„๊ตํ•ด์„œ ๋†’์ด๊ฐ€ ๋„“์€์ชฝ์œผ๋กœ ๊ณ„์†ํ•ด์„œ ์ง์‚ฌ๊ฐํ˜•์˜ ๋„“์ด๋ฅผ ๋„“ํ˜€๊ฐ€๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ


3. ํ•ต์‹ฌ ํ’€์ด

1) ๋ถ„ํ• ์ •๋ณต

int ret = Math.max(solve(left,mid), solve(mid+1,right));

2) 3์˜ ๊ฒฝ์šฐ

while(left < low || high < right) {
			if(high < right && (low == left || arr[low-1] < arr[high+1])) {
				++high;
				height = Math.min(height, arr[high]);
			} else {
				--low;
				height = Math.min(height, arr[low]);
			}
			
			ret = Math.max(ret, height*(high-low+1));
}

4. ์ฝ”๋“œ

import java.util.Scanner;

public class Fence {
	static int n;
	static int arr[];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		int C = sc.nextInt();
		
		for(int i=0; i<C; i++) {
			n = sc.nextInt();
			arr = new int[n];
			
			for(int j=0; j<n; j++) {
				arr[j] = sc.nextInt();
			}
			
			System.out.println(solve(0,n-1));
		}
	}
	
	static int solve(int left, int right) {
		if(left == right) return arr[left];
		
		int mid = (left+right)/2;
		
		int ret = Math.max(solve(left,mid), solve(mid+1,right));
		
		int low = mid, high = mid+1;
		int height = Math.min(arr[low], arr[high]);
		
		ret = Math.max(ret, height*2);
		
		while(left < low || high < right) {
			if(high < right && (low == left || arr[low-1] < arr[high+1])) {
				++high;
				height = Math.min(height, arr[high]);
			} else {
				--low;
				height = Math.min(height, arr[low]);
			}
			
			ret = Math.max(ret, height*(high-low+1));
		}
		
		return ret;
	}

}

5. ๊ฒฐ๊ณผ


์„ฑ๊ณต~

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€