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

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค[Java] - ์•ผ๊ทผ ์ง€์ˆ˜

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

https://programmers.co.kr/learn/courses/30/lessons/12927

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์•ผ๊ทผ ์ง€์ˆ˜ | ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

ํšŒ์‚ฌ์› Demi๋Š” ๊ฐ€๋”์€ ์•ผ๊ทผ์„ ํ•˜๋Š”๋ฐ์š”, ์•ผ๊ทผ์„ ํ•˜๋ฉด ์•ผ๊ทผ ํ”ผ๋กœ๋„๊ฐ€ ์Œ“์ž…๋‹ˆ๋‹ค. ์•ผ๊ทผ ํ”ผ๋กœ๋„๋Š” ์•ผ๊ทผ์„ ์‹œ์ž‘ํ•œ ์‹œ์ ์—์„œ ๋‚จ์€ ์ผ์˜ ์ž‘์—…๋Ÿ‰์„ ์ œ๊ณฑํ•˜์—ฌ ๋”ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. Demi๋Š” N์‹œ๊ฐ„ ๋™์•ˆ ์•ผ๊ทผ ํ”ผ๋กœ๋„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋„๋ก ์ผํ•  ๊ฒ๋‹ˆ๋‹ค.Demi๊ฐ€ 1์‹œ๊ฐ„ ๋™์•ˆ ์ž‘์—…๋Ÿ‰ 1๋งŒํผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ํ‡ด๊ทผ๊นŒ์ง€ ๋‚จ์€ N ์‹œ๊ฐ„๊ณผ ๊ฐ ์ผ์— ๋Œ€ํ•œ ์ž‘์—…๋Ÿ‰ works์— ๋Œ€ํ•ด ์•ผ๊ทผ ํ”ผ๋กœ๋„๋ฅผ ์ตœ์†Œํ™”ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜ solution์„ ์™„์„ฑํ•ด์ฃผ์„ธ์š”. ์ œํ•œ ์‚ฌํ•ญ works๋Š” ๊ธธ์ด

programmers.co.kr

ํ‹€๋ฆฐ ์ฝ”๋“œ

import java.util.Arrays;

class Solution {
    public long solution(int n, int[] works) {
        long answer = 0;
        int sum = 0;
        for(int i=0; i<works.length; i++)
			sum += works[i];
		
		// ์ž‘์—…๋Ÿ‰ ๋ณด๋‹ค ํ‡ด๊ทผ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„์ด ๋” ๋งŽ์€๊ฒฝ์šฐ
		if(n >= sum) 
			return 0;
		
		while(n != 0) {
			Arrays.sort(works);
			works[works.length-1] --;
			n --;
		}
		
		for(int i=0; i<works.length; i++) {
			answer += (works[i] * works[i]);
		}
        return answer;
    }
}

ํ’€์ด

 

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋Œ€๋กœ ๊ทธ๋Œ€๋กœ ์ ‘๊ทผํ•ด์„œ ํ’€์—ˆ๋‹ค.

๋‚จ์€ N์‹œ๊ฐ„ ๋™์•ˆ ์ž‘์—…๋Ÿ‰ works์„ ํ•˜๊ณ , ์•ผ๊ทผ ํ”ผ๋กœ๋„๋ฅผ ์ตœ์†Œํ™”ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋ผ.

์˜ˆ์ œ 3๋ฒˆ๊ณผ ๊ฐ™์ด works = [1,1] , N = 3 ์ผ๋•Œ,

works์˜ ํ•ฉ๋ณด๋‹ค N์ด ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด => ๋ชจ๋“  ์ž‘์—…๋Ÿ‰์„ ๋งˆ์ณค์œผ๋ฏ€๋กœ ํ”ผ๋กœ๋„๋Š” 0์ด๋‹ค.

๊ทธ ์™ธ์—๋Š” ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ํ›„ ๊ฐ€์žฅ ํฐ๊ฐ’๋“ค์„ ์ค„์ด๋ฉด ์•ผ๊ทผ์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ N์ด 0์ด ๋ ๋•Œ๊นŒ์ง€, ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๊ณ  ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ค„์ด๋Š” ์‹์œผ๋กœ ํ–ˆ์œผ๋‚˜ ,,

์ •ํ™•์„ฑ์€ ๋ชจ๋‘ ํ†ต๊ณผํ–ˆ์ง€๋งŒ ํšจ์œจ์„ฑ์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

works ์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” 20,000 ์ด๊ณ  n์€ 1,000,000 ์ด๋‹ค.

1,000,000 * 20,000 ์˜ ํฐ ์ˆซ์ž๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜์„œ ์ ‘๊ทผ์„ ๋‹ค๋ฅด๊ฒŒ ํ–ˆ๋‹ค .

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹๋Œ€๋กœ๋ผ๋ฉด,, ์˜ˆ๋ฅผ๋“ค์–ด ์ž‘์—…๋Ÿ‰์ด [1000, 1000, 1000, 1000, 2, 3, ... ] ์™€ ๊ฐ™๋”๋ผ๋„

์ž‘์—…๋Ÿ‰์ด ๊ฐ€์žฅ ํฐ 1000์€ ์—ฌ๋Ÿฌ๊ฐœ์ด์ง€๋งŒ, ํ•œ๋ฒˆ์— ํ•œ ๊ฐœ๋ฐ–์— ๊ฐ์†Œ์‹œํ‚ค์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ ์ด๋‹ค.

๋”ฐ๋ผ์„œ works๋ฐฐ์—ด์—์„œ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๊ณ , ์ตœ๋Œ“๊ฐ’๊ณผ ๋™์ผํ•  ๋•Œ ํ•œ๋ฒˆ์— ๊ฐ์†Œ์‹œํ‚ค๋„๋ก ํ•ด๋ดค๋‹ค.

(์ฆ‰, n์„ ๋น ๋ฅด๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณด์•˜๋‹ค.)

 

๊ทธ๋Ÿฌ์ž ํšจ์œจ์„ฑ์—์„œ๋„ ํ†ต๊ณผ๊ฐ€ ๋๋‹ค. ๊ธฐํƒ€ ์„ค๋ช…์€ ์ฃผ์„๋ฌธ , ,

	class Solution {
		public long solution(int n, int[] works) {
			long answer = 0;
			int sum = 0;
			for(int i=0; i<works.length; i++)
				sum += works[i];

			// ์ž‘์—…๋Ÿ‰ ๋ณด๋‹ค ํ‡ด๊ทผ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„์ด ๋” ๋งŽ์€๊ฒฝ์šฐ
			if(n >= sum) 
				return 0;

			// ๋‚จ์€ ์‹œ๊ฐ„ ๋งŒํผ ์ž‘์—…๋Ÿ‰ ๊ฐ์†Œํ•˜๊ธฐ
			while(n != 0) {
				int max = 0;

				// ํ˜„์žฌ ๋ฐฐ์—ด ์ค‘ ์ž‘์—…๋Ÿ‰์ด ๊ฐ€์žฅ ํฐ ์ˆ˜ ์ฐพ๊ธฐ
				for(int i=0; i<works.length; i++) 
					if(works[i] > max)	max = works[i];

				// ๋ฐฐ์—ด ์š”์†Œ์ค‘ max ๊ฐ’๊ณผ ๋™์ผํ•˜๋ฉด ์ „๋ถ€ ๋‹ค ๊ฐ์†Œ์‹œํ‚ค๊ธฐ
				for(int i=0; i<works.length; i++) {
					if(works[i] == max) {
						works[i] --;
						n --;
						// n์ด 0์ผ์‹œ => ๋”์ด์ƒ ๊ฐ์†Œ์‹œํ‚ค์ง€ ๋ง๊ณ  ์ข…๋ฃŒ
						if(n == 0)	break;
					}
				}
			}

			// ๋‚จ์€ ์ž‘์—…๋Ÿ‰ ์ œ๊ณฑํ•ด์„œ ๋ชจ๋‘ ๋”ํ•˜๊ธฐ
			for(int i=0; i<works.length; i++) {
				answer += (works[i] * works[i]);
			}

			return answer;
		}
	}

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€