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

 

1253๋ฒˆ: ์ข‹๋‹ค

์ฒซ์งธ ์ค„์—๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 2,000), ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” i๋ฒˆ์งธ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Ai๊ฐ€ N๊ฐœ ์ฃผ์–ด์ง„๋‹ค. (|Ai| โ‰ค 1,000,000,000, Ai๋Š” ์ •์ˆ˜)

www.acmicpc.net

 

 

 

 

 

 

๋ฌธ์ œ

  • N๊ฐœ์˜ ์ˆ˜ ์ค‘์—์„œ ์–ด๋–ค ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ˆ˜ ๋‘ ๊ฐœ์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ์ˆ˜๋ฅผ โ€œ์ข‹๋‹ค(GOOD)โ€๊ณ  ํ•œ๋‹ค.
  • N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ทธ ์ค‘์—์„œ ์ข‹์€ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” ๋ช‡ ๊ฐœ์ธ์ง€ ์ถœ๋ ฅํ•˜๋ผ.
  • ์ˆ˜์˜ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฐ’์ด ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ์ˆ˜์ด๋‹ค.

 

์ œํ•œ์‚ฌํ•ญ

  • N(1 โ‰ค N โ‰ค 2,000)
  • i๋ฒˆ์งธ ์ˆ˜ : |Ai| โ‰ค 1,000,000,000

 

 

ํ’€์ด

์ฒ˜์Œ์— ๋– ์˜ค๋ฅธ ํ’€์ด๋Š” ์ด์ค‘ for๋ฌธ์„ ๋Œ๋ ค ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ , ๊ทธ ์ˆ˜๊ฐ€ ๋ฐฐ์—ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ‹€๋ ค์„œ ๊ฒŒ์‹œํŒ์—์„œ ์ฐพ์•„๋ณด๋‹ˆ, "N๊ฐœ์˜ ์ˆ˜ ์ค‘์—์„œ ์–ด๋–ค ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ˆ˜ ๋‘ ๊ฐœ์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด"์˜ ์กฐ๊ฑด์„ ์ž์„ธํžˆ ๋ณด๋ฉด "์ฃผ์–ด์ง„ N๊ฐœ์˜ ์ˆ˜ ์ค‘์—์„œ '์ž์‹ ์„ ์ œ์™ธํ•œ' ๋‹ค๋ฅธ ๋‘ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด"์˜ ์˜๋ฏธ๋ผ๊ณ  ํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ํ’€์ด๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ดค๋‹ค.

 

๋ฐฉ๋ฒ•1 : 2์ค‘ for๋ฌธ

1. ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ๋Œ์•„๊ฐ€๋ฉฐ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

2. ๋‚˜๋จธ์ง€ ๋‘ ์ˆ˜๋ฅผ ์ด์ค‘ for๋ฌธ์œผ๋กœ ์–ป๊ณ , ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

3. ๋‘ ์ˆ˜์˜ ํ•ฉ์ด ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜์™€ ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.

 

์ด ํ’€์ด๋Š” 3์ค‘ for๋ฌธ์œผ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N^3)์ด๋‹ค. N์ด ์ตœ๋Œ€๋กœ 2000์ด๋‹ˆ๊นŒ, ์ตœ๋Œ€ 8,000,000,000(80์–ต)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค!

 

 

 

 

๋‘ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐ, O(n^2)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ๊ทธ ์ดํ•˜๋กœ ์ค„์ผ ๋ฐฉ๋ฒ•์œผ๋กœ ํˆฌํฌ์ธํ„ฐ์™€ ํ•ด์‰ฌํ…Œ์ด๋ธ”์ด ์ƒ๊ฐ์ด ๋‚ฌ๋‹ค.

 

 

 

๋ฐฉ๋ฒ•2 : ํ•ด์‰ฌํ…Œ์ด๋ธ”

1. ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ๋Œ์•„๊ฐ€๋ฉฐ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

2. ํ•ด๋‹น ์ˆ˜์˜ ์ธ๋ฑ์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ์ˆ˜๋ฅผ ์ˆœํšŒํ•œ๋‹ค.

3. HashSet์— (ํ˜„์ œ ์ˆ˜ - ๋ชฉํ‘œ ์ˆ˜)์˜ ๊ฐ’์„ ๊ธฐ๋กํ•œ๋‹ค. ์•ž์œผ๋กœ ๊ทธ ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

4. ์ˆœํšŒํ•˜๋ฉฐ ๋‚˜์˜ค๋Š” ์ˆ˜๊ฐ€ HashSet์— ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

 

๋‘ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์€ ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฏ€๋กœ O(N)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ํƒ€์ผ“์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ๊ตฌํ•˜๋‹ˆ, ์ด O(N^2)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ณ„๋„๋กœ ๊ฐ’์ด ํ•ด์‰ฌ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋„ฃ๋Š” ์—ฐ์‚ฐ O(1)์ด ์ถ”๊ฐ€๋กœ ๋“ ๋‹ค. ์ด๊ฑธ ์ด์ค‘ for๋ฌธ ์•ˆ์—์„œ ํ•˜๋‹ˆ ์ž์„ธํžˆ ๋”ฐ์ง€๋ฉด O(N^2)์ด ์ถ”๊ฐ€๋กœ ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด์‰ฌํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๋ฐ, ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋“ ๋‹ค. 

 

 

๋ณดํ†ต ํ•ด์‰ฌํ…Œ์ด๋ธ”์ด ์ •๋ ฌ ๋•Œ๋ฌธ์— O(N*logN)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ํˆฌํฌ์ธํ„ฐ๋ณด๋‹ค ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์‰ฌํ…Œ์ด๋ธ”๋กœ ํ’€๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, ์‹ค์€ ์–ด์ฐจํ”ผ ๋ฐ”๊นฅ์—์„œ target์„ ์ •ํ•˜๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์œผ๋กœ for๋ฌธ์„ ๋Œ๋ฆฌ๊ฒŒ ๋˜์–ด O(N)์ด ์•„๋‹Œ, O(N^2)์˜ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค... ์ •๋ ฌ์€ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋ฌธ์ œ์—์„œ ํˆฌํฌ์ธํ„ฐ๋ฅผ ์“ฐ๊ฒŒ ๋  ๊ฒฝ์šฐ์—๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ  O(N*logN)์ด ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๋” ํšจ์œจ์ ์ด๋‹ค.

 

 

 

๋ฐฉ๋ฒ•3 : ํˆฌํฌ์ธํ„ฐ

1. ํฌ์ธํ„ฐ๋ฅผ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋์— ๋‘๊ณ  ํƒ์ƒ‰์„ ํ•˜๊ธฐ ์œ„ํ•ด, ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์„ ํ•œ๋‹ค.

2. ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ์ฐพ์•„์•ผ ๋  ํ•ฉ(target)์œผ๋กœ ์ •ํ•œ๋‹ค.

3. ํฌ์ธํ„ฐ์˜ ์™ผ์ชฝ์„ 0์—, ์˜ค๋ฅธ์ชฝ์„ N - 1์— ๋‘๊ณ  ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

4. ๋งŒ์•ฝ target์˜ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด, ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.

5. ๋‘ ์ˆ˜์˜ ํ•ฉ target์ด๋ผ๋ฉด, ์นด์šดํŠธ๋ฅผ ์˜ฌ๋ ค์ฃผ๊ณ  target์— ํ•ด๋‹นํ•˜๋Š” ํƒ์ƒ‰์„ ๋๋‚ธ๋‹ค.

6. ํ•ฉ์ด target ๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ์ค„์—ฌ์ฃผ๊ณ , ์ž‘๋‹ค๋ฉด, ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค.

7. left < right ์ผ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

 

๋‘ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์€ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฏ€๋กœ O(N)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ํƒ€์ผ“์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ๊ตฌํ•˜๋‹ˆ, ์ด O(N^2)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ, ํƒ์ƒ‰ ์ „ ์ •๋ ฌ ๋•Œ๋ฌธ์— O(N*logN)์ด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

ํ•ด์‰ฌํ…Œ์ด๋ธ”

package algorithm;

import java.io.*;
import java.util.*;

public class BOJ_์ข‹๋‹ค {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int[] arr = new int[N];
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		//๊ตฌํ˜„
		int count = 0;
		for(int i = 0; i < N; i++) {
			int target = arr[i];
			
			HashSet<Integer> set = new HashSet<>();
			for(int j = 0; j < N; j++) {
				if(i == j) continue;
				
				int diff = target - arr[j];
				
				if(set.contains(arr[j])) {
					count++;
					break;
				}
				
				set.add(diff);
			}
		}
		
		System.out.println(count);
	}

}

 

 

 

 

ํˆฌํฌ์ธํ„ฐ

package algorithm;

import java.io.*;
import java.util.*;

public class BOJ_์ข‹๋‹ค2 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int[] arr = new int[N];
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}

		//๊ตฌํ˜„
		Arrays.sort(arr); //์ •๋ ฌ
		
		int count = 0;
		for(int i = 0; i < N; i++) {
			int target = arr[i];
			int left = 0;
			int right = N - 1;
			
			while(left < right) {
				if(left == i) {
					left++;
				} else if(right == i) {
					right--;
				}
				
				if(left == right) continue;
				
				int sum = arr[left] + arr[right];
				
				if(sum == target) {
					count++;
					break;
				} else if(sum > target) {
					right--;
				} else {
					left++;
				}
			}
		}
		
		System.out.println(count);
	}

}

 

 

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

์œ„ : ํ•ด์‰ฌํ…Œ์ด๋ธ” ํ’€์ด

์•„๋ž˜ : ํˆฌํฌ์ธํ„ฐ ํ’€์ด 

 

 

 

 

 

๋ฐฐ์šด์ 

giraffe_