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

[๋ฐฑ์ค€] 4948๋ฒˆ: ๋ฒ ๋ฅดํŠธ๋ž‘ ๊ณต์ค€(์†Œ์ˆ˜, ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด)

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

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

 

4948๋ฒˆ: ๋ฒ ๋ฅดํŠธ๋ž‘ ๊ณต์ค€

๋ฌธ์ œ ๋ฒ ๋ฅดํŠธ๋ž‘ ๊ณต์ค€์€ ์ž„์˜์˜ ์ž์—ฐ์ˆ˜ n์— ๋Œ€ํ•˜์—ฌ, n๋ณด๋‹ค ํฌ๊ณ , 2n๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์†Œ์ˆ˜๋Š” ์ ์–ด๋„ ํ•˜๋‚˜ ์กด์žฌํ•œ๋‹ค๋Š” ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋‹ค. ์ด ๋ช…์ œ๋Š” ์กฐ์ œํ”„ ๋ฒ ๋ฅดํŠธ๋ž‘์ด 1845๋…„์— ์ถ”์ธกํ–ˆ๊ณ , ํŒŒํ”„๋ˆ„ํ‹ฐ ์ฒด๋น„์‡ผํ”„๊ฐ€ 1850๋…„์— ์ฆ๋ช…ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 10๋ณด๋‹ค ํฌ๊ณ , 20๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์†Œ์ˆ˜๋Š” 4๊ฐœ๊ฐ€ ์žˆ๋‹ค. (11, 13, 17, 19) ๋˜, 14๋ณด๋‹ค ํฌ๊ณ , 28๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์†Œ์ˆ˜๋Š” 3๊ฐœ๊ฐ€ ์žˆ๋‹ค. (17,19, 23) n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, n๋ณด๋‹ค ํฌ๊ณ , 2n๋ณด

www.acmicpc.net

์ฝ”๋“œ

import java.util.Scanner;

public class Main {
	
	// n ~ 2n๊นŒ์ง€ ์ˆ˜ ์ค‘ ์†Œ์ˆ˜์˜ ๊ฐฏ์ˆ˜ ๋ฆฌํ„ด
	public static int isPrime(int n) {
		int count = 0;
		int j = 0;
		
		for(int i=n+1; i<=2*n; i++) {
			boolean check = true;
			for(j=2; j<=Math.sqrt(i); j++) {
				if(i%j == 0)	{
					check = false;
					break;
				}
			}
			
			// i%j == 0์ด ์•ˆ๋์„ ๊ฒฝ์šฐ => ์†Œ์ˆ˜
			if(check) 	count ++;
				
		}
		return count;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		while(true) {
			int n = scan.nextInt();
			if(n == 0)
				break;
			System.out.println(isPrime(n));
			
		}
		
		scan.close();
	}

}

ํ’€์ด

์ผ๋ฐ˜ ์†Œ์ˆ˜์ฐพ๊ธฐ ๋ฌธ์ œ์™€ ๋™์ผํ•˜์ง€๋งŒ, ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋Œ€๋กœ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์™œ ? ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ n์˜ ๋ฒ”์œ„๋Š” 123,456์ดํ•˜์ธ๋ฐ,

n < x <= 2*n ์˜ ๋ฒ”์œ„์ด๋ฏ€๋กœ,

์†Œ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด 2์ค‘ for๋ฌธ์—์„œ 200,000 * 200,000 ์ •๋„๋งŒ ํ•ด๋„ ์ˆซ์ž๊ฐ€ ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ๊ธฐ์กด์— ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด j๋ฅผ 2 ~ i-1๊นŒ์ง€ ๋‚˜๋ˆ„๋Š”๊ฒŒ ์•„๋‹Œ j๋ฅผ 2 ~ i์˜ ์ œ๊ณฑ๊ทผ๊นŒ์ง€ ๋‚˜๋ˆ„๋ฉฐ ํŒ๋‹จํ•œ๋‹ค.

๊ทธ๋Ÿด๊ฒฝ์šฐ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ํ†ต๊ณผ๋œ๋‹ค.

 

 

์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ๊ตฌํ˜„, ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด ์ด๋ฏ€๋กœ, ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋กœ๋„ ํ’€์–ด๋ณด์•˜๋‹ค.

 

  1. 2๋ถ€ํ„ฐ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ๋‚˜์—ดํ•œ๋‹ค. ๊ทธ๋ฆผ์—์„œ ํšŒ์ƒ‰ ์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‘๋ฅธ ์ˆ˜๋“ค์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•œ๋‹ค.
  2. 2๋Š” ์†Œ์ˆ˜์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์— 2๋ฅผ ์“ด๋‹ค. (๋นจ๊ฐ„์ƒ‰)
  3. ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ 2์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค.
  4. ๋‚จ์•„์žˆ๋Š” ์ˆ˜ ๊ฐ€์šด๋ฐ 3์€ ์†Œ์ˆ˜์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์— 3์„ ์“ด๋‹ค. (์ดˆ๋ก์ƒ‰)
  5. ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ 3์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค.
  6. ๋‚จ์•„์žˆ๋Š” ์ˆ˜ ๊ฐ€์šด๋ฐ 5๋Š” ์†Œ์ˆ˜์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์— 5๋ฅผ ์“ด๋‹ค. (ํŒŒ๋ž€์ƒ‰)
  7. ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ 5์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค.
  8. ๋‚จ์•„์žˆ๋Š” ์ˆ˜ ๊ฐ€์šด๋ฐ 7์€ ์†Œ์ˆ˜์ด๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์— 7์„ ์“ด๋‹ค. (๋…ธ๋ž€์ƒ‰)
  9. ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ 7์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์šด๋‹ค.
  10. ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๊ตฌํ•˜๋Š” ๊ตฌ๊ฐ„์˜ ๋ชจ๋“  ์†Œ์ˆ˜๊ฐ€ ๋‚จ๋Š”๋‹ค

๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ,  11^2>120 ์ด๋ฏ€๋กœ 11๋ณด๋‹ค ์ž‘์€ ์ˆ˜์˜ ๋ฐฐ์ˆ˜๋“ค๋งŒ ์ง€์›Œ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค. ์ฆ‰, 120๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜ ๊ฐ€์šด๋ฐ 2, 3, 5, 7์˜ ๋ฐฐ์ˆ˜๋ฅผ ์ง€์šฐ๊ณ  ๋‚จ๋Š” ์ˆ˜๋Š” ๋ชจ๋‘ ์†Œ์ˆ˜์ด๋‹ค. 

์ฆ‰, ์ œ๊ณฑ๊ทผ ๊นŒ์ง€๋งŒ ๋ฐ˜๋ณตํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

(์ถœ์ฒ˜: ์œ„ํ‚ค๋ฐฑ๊ณผ)

 

 

์œ„ ๊ณผ์ •์„ ์š”์•ฝํ•˜๋ฉด, ์†Œ์ˆ˜๋Š” 1๊ณผ ์ž๊ธฐ์ž์‹ ๋งŒ์ด ์•ฝ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ์ˆ˜์ด๋ฏ€๋กœ, 2๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํ•ด๋‹น ๋ฐฐ์ˆ˜๋ฅผ ์ง€์›Œ๊ฐ€๋Š” ๊ณผ์ •์ด๋‹ค.

2์˜ ๋ฐฐ์ˆ˜ => 2, 4, 6, 8, 10, 12, ... -> ์†Œ์ˆ˜ X

3์˜ ๋ฐฐ์ˆ˜ => 3, 6, 9, 12, 15, 18, ... -> ์†Œ์ˆ˜ X

4์˜ ๋ฐฐ์ˆ˜ => 4, 8, 12, 16, 20, ... -> ์†Œ์ˆ˜ X

 

 

์œ„ ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		while(true) {
			int n = scan.nextInt();
			if(n == 0) break;
			int count = 0;
			int nn = n*2;
			boolean[] data = new boolean[nn+1];
			data[0] = data[1] = false;	// 0, 1์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ false๋กœ ์ง€์ •

			// data[]์˜ ์ดˆ๊ธฐ๊ฐ’ => true๋กœ ์ง€์ •
			for(int i=2; i<=nn; i++)
				data[i] = true;

			// i, j์˜ ๋ฐฐ์ˆ˜ => ์†Œ์ˆ˜ ์•„๋‹ˆ๋ฏ€๋กœ false๋กœ ์ฒดํฌ
			for(int i=2; i<=Math.sqrt(nn); i++) {
				if(!data[i])	continue;	// ์ด๋ฏธ ๊ฑธ๋Ÿฌ์ง„ ์ˆ˜์˜ ๋ฐฐ์ˆ˜๋Š” pass
				for(int j=2; j*i<=nn; j++)
					data[i*j] = false;
			}

			for(int i=n+1; i<=nn; i++) 
				if(data[i])	count ++;

			System.out.println(count);
		}
		scan.close();
	}

}

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€