๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 3985๋ฒˆ: ๋กค ์ผ€์ดํฌ(๊ตฌํ˜„, ์‹œ๋ฎฌ๋ ˆ์ด์…˜)

by ์ฃผ๋ฐœ2 2020. 3. 5.
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/3985

 

3985๋ฒˆ: ๋กค ์ผ€์ดํฌ

๋ฌธ์ œ ์ธ๊ธฐ ํ‹ฐ๋น„ ํ”„๋กœ๊ทธ๋žจ "๋‚˜๋Š” ์š”๋ฆฌ์‚ฌ ์ธ๊ฐ€?"์˜ ์ƒˆ ์‹œ์ฆŒ์ด ์‹œ์ž‘ํ•œ๋‹ค. ์ด๋ฒˆ ์‹œ์ฆŒ์€ ๊ธฐ๋„ค์Šค๋ถ์— ๋“ฑ์žฌ๋  ๋งŒํ•œ ์Œ์‹์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์—ํ”ผ์†Œ๋“œ์— ์ถœ์—ฐํ•˜๋Š” ์š”๋ฆฌ์‚ฌ๋Š” ์ „์„ค์˜ ์š”๋ฆฌ์‚ฌ ๊น€์ƒ๊ทผ์ด๊ณ , ๊ธธ์ด L๋ฏธํ„ฐ์˜ ๋กค ์ผ€์ดํฌ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. ์ƒ๊ทผ์€ ๋ช‡ ์‹œ๊ฐ„๋™์•ˆ ์ง‘์ค‘ํ•ด์„œ ์ผ€์ดํฌ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ์ด์ œ ์ŠคํŠœ๋””์˜ค์˜ ๋ฐฉ์ฒญ๊ฐ N๋ช…์—๊ฒŒ ์ผ€์ดํฌ๋ฅผ ๋‚˜๋ˆ„์–ด ์ฃผ๋ ค๊ณ  ํ•œ๋‹ค. ์ƒ๊ทผ์ด๋Š” ๋กค ์ผ€์ดํฌ๋ฅผ ํŽผ์ณ์„œ 1๋ฏธํ„ฐ ๋‹จ์œ„๋กœ ์ž˜๋ผ ๋†“์•˜๋‹ค. ๊ฐ€์žฅ ์™ผ์ชฝ ์กฐ๊ฐ์ด 1๋ฒˆ, ์˜ค๋ฅธ์ชฝ ์กฐ๊ฐ์ด

www.acmicpc.net

์ฝ”๋“œ

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int L = scan.nextInt();	// ๋กค์ผ€์ดํฌ ๊ธธ์ด
		int N = scan.nextInt();	// ๋ฐฉ์ฒญ๊ฐ์˜ ์ˆ˜
		boolean[] cake = new boolean[L+1];	// ๋กค์ผ€์ดํฌ ๊ธธ์ด+1 ๋ฐฐ์—ด ์„ ์–ธ
		int[] getCake = new int[N+1];
		int[][] arr = new int[N][2];
		int maxIndex = 0;	// ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ ๊ธฐ๋Œ€ํ•œ ๋ฐฉ์ฒญ๊ฐ 
		int maxCake = 0;	// ์‹ค์ œ ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ ๋ฐ›์€ ๋ฐฉ์ฒญ๊ฐ
		for(int i=0; i<N; i++) {
			arr[i][0] = scan.nextInt();
			arr[i][1] = scan.nextInt();
		}
		
		// ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ์„ ๋ฐ›์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•œ ์ผ€์ดํฌ์˜ ์กฐ๊ฐ ์ˆ˜ ์ฐพ๊ธฐ
		for(int i=0; i<N; i++) {
			if(arr[i][1] - arr[i][0] > maxIndex)
				maxIndex = arr[i][1] - arr[i][0];
		}
		
		// ์‹ค์ œ ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ ๋ฐ›์€ ๋ฐฉ์ฒญ๊ฐ ์ฐพ๊ธฐ
		for(int i=1; i<=N; i++) {
			for(int j=arr[i-1][0]; j<=arr[i-1][1]; j++) {
				if(!cake[j]) {	// ๋ฐฉ์ฒญ๊ฐ์ด ๊ธฐ๋Œ€ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ์ฒดํฌ๊ฐ€ ์•ˆ๋˜์–ด ์žˆ๋Š”๊ฒฝ์šฐ
					getCake[i] ++;	// i๋ฒˆ์งธ ๋ฐฉ์ฒญ๊ฐ ์ผ€์ดํฌ +1
					cake[j] = true;	// ์ผ€์ดํฌ๋ฅผ ๋ฐ›์•˜์œผ๋ฏ€๋กœ ์ฒดํฌํ‘œ์‹œ
				}
			}
		}
		
		// ๋ฐฉ์ฒญ๊ฐ ์ค‘ ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ์„ ๋ฐ›์€ ์ผ€์ดํฌ ์ˆ˜ ์ฐพ๊ธฐ
		for(int i=1; i<getCake.length; i++) {
			if(getCake[i] > maxCake)
				maxCake = getCake[i];
		}
		
		// ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ์„ ๋ฐ›์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋˜ ๋ฐฉ์ฒญ๊ฐ์ด ์—ฌ๋Ÿฌ๋ช…์ธ ๊ฒฝ์šฐ => ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์‚ฌ๋žŒ ์ถœ๋ ฅ
		for(int i=1; i<=N; i++) {
			if(maxIndex == arr[i-1][1] - arr[i-1][0]) {
				System.out.println(i);
				break;
			}
		}
		// ์‹ค์ œ ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ์„ ๋ฐ›์€ ๋ฐฉ์ฒญ๊ฐ์ด ์—ฌ๋Ÿฌ๋ช…์ธ ๊ฒฝ์šฐ => ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์‚ฌ๋žŒ ์ถœ๋ ฅ
		for(int i=1; i<getCake.length; i++)
			if(getCake[i] == maxCake) {
				System.out.println(i);
				break;
			}
				
		scan.close();
	}

}

ํ’€์ด

 

๋ฌธ์ œ์˜ ์กฐ๊ฑด๋Œ€๋กœ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋‹ค ๋ณด๋‹ˆ ์ข€ ๋ณต์žกํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฌธ์ œ์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ์„ ๋ฐ›์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฐฉ์ฒญ๊ฐ์ด๋‚˜ ์‹ค์ œ ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ์„ ๋ฐ›์€ ๋ฐฉ์ฒญ๊ฐ์ด ์—ฌ๋Ÿฌ๋ช…์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์‚ฌ๋žŒ์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์ ‘๊ทผ๋ฐฉ๋ฒ•์€,

 

1) ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ์„ ๋ฐ›์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•œ ์ผ€์ดํฌ์˜ ์กฐ๊ฐ ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.

		for(int i=0; i<N; i++) 
			if(arr[i][1] - arr[i][0] > maxIndex)
				maxIndex = arr[i][1] - arr[i][0];

 

 

2) ์‹ค์ œ ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ ๋ฐ›์€ ๋ฐฉ์ฒญ๊ฐ์„ ์ฐพ๋Š”๋‹ค.

		for(int i=1; i<=N; i++) {
			for(int j=arr[i-1][0]; j<=arr[i-1][1]; j++) {
				if(!cake[j]) {	// ๋ฐฉ์ฒญ๊ฐ์ด ๊ธฐ๋Œ€ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ์ฒดํฌ๊ฐ€ ์•ˆ๋˜์–ด ์žˆ๋Š”๊ฒฝ์šฐ
					getCake[i] ++;	// i๋ฒˆ์งธ ๋ฐฉ์ฒญ๊ฐ ์ผ€์ดํฌ +1
					cake[j] = true;	// ์ผ€์ดํฌ๋ฅผ ๋ฐ›์•˜์œผ๋ฏ€๋กœ ์ฒดํฌํ‘œ์‹œ
				}
			}
		}

๋ฐฉ์ฒญ๊ฐ ์ˆœ์œผ๋กœ ํ•ด์„œ P๋ฒˆ ~ K๋ฒˆ ์กฐ๊ฐ ๊นŒ์ง€ ๋งŒ์•ฝ ์ฒดํฌ๊ฐ€ ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด 

๊ทธ ๋ฐฉ์ฒญ๊ฐ์€ ๊ทธ ์ผ€์ดํฌ์กฐ๊ฐ์„ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ +1 ํ•˜๊ณ , ์ฒดํฌ ํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.

 

 

3) ์œ„์—์„œ ๊ณ„์‚ฐํ•œ ๊ฐ€์žฅ ๋งŽ์€ ๋ฐฉ์ฒญ๊ฐ์„ ํ†ตํ•ด ๊ฐ€์žฅ ๋งŽ์€ ์กฐ๊ฐ์„ ๋ฐ›์€ ์ผ€์ดํฌ๋Š” ๋ช‡์กฐ๊ฐ์ธ์ง€ ์ฐพ๋Š”๋‹ค.

		for(int i=1; i<getCake.length; i++) 
			if(getCake[i] > maxCake)
				maxCake = getCake[i];

 

 

4) ์œ„ ์ž‘์—…์ด ๋๋‚œ ํ›„ ๋ฐฉ์ฒญ๊ฐ์ด ์—ฌ๋Ÿฌ๋ช…์ผ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ž‘์€ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

		for(int i=1; i<=N; i++) {
			if(maxIndex == arr[i-1][1] - arr[i-1][0]) {
				System.out.println(i);
				break;
			}
		}
        
        
       	 	for(int i=1; i<getCake.length; i++) {
			if(getCake[i] == maxCake) {
				System.out.println(i);
				break;
			}
		}

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€