본문 바로가기
코딩테스트 준비/백준 C#

백준 C# - 6588 +) 풀이

by 코딩하는 돼징 2023. 11. 5.
반응형

문제를 풀기 앞서 아래 문제를 먼저 푸는 것을 추천한다.

백준 C# - 1929

 

백준 C# - 1929 +) 에라토스테네스의 체

풀이 처음에 1978과 같은 형식으로 문제를 풀었는데 계속 시간초과가 나왔다. 백준 C# - 1978 +) 풀이 풀이 소수 찾기 문제이다. 소수는 1과 자기 자신 만을 약수로 가지는 수이다. 01 1은 소수가 아니

code-piggy.tistory.com


풀이

01 에라토스테네스의 체 알고리즘 사용

상세 설명은 위의 문제에서 확인

StringBuilder sb = new StringBuilder();
int num = -1;
bool[] isPrime = Enumerable.Repeat(true, 1000000 + 1).ToArray();
int[] prime = new int[1000001];
int index = 0;
for (int i = 2; i * i <= 1000000; i++)
{
    if (isPrime[i])
    {
        prime[index] = i;
        index++;
        for (int j = i * i; j <= 1000000; j += i)
        {
            isPrime[j] = false;
        }
    }
}

02 두 소수 찾기

while (num != 0)
{
    num = int.Parse(Console.ReadLine());
    int a = 0;
    int b = 0;
    if (num == 0)
        break;
    for (int i = 0; i <= num / 2; i++)
    {
        a = prime[i];
        b = num - a;
        if (isPrime[a] && isPrime[b])
        {
            sb.AppendLine($"{num} = {a} + {b}");
            break;
        }
    }
}

 

왜 i <= num이 아니라 i <= num / 2인가요?

for (int i = 0; i <= num / 2; i++)

 

그 이유는 크리스티안 골드바흐에 따르면 4 이상의 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다. 짝수 num을 두 홀수 소수의 합으로 나타낼때 하나의 홀수 소수는 num / 2 이하의 값을 가지고 나머지 값을 또 다른 소수로 채우면 된다. 

그러므로 num / 2까지만 구하면 된다.


코드 전문

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace baek2
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            int num = -1;
            bool[] isPrime = Enumerable.Repeat(true, 1000000 + 1).ToArray();
            int[] prime = new int[1000001];
            int index = 0;
            for (int i = 2; i * i <= 1000000; i++)
            {
                if (isPrime[i])
                {
                    prime[index] = i;
                    index++;
                    for (int j = i * i; j <= 1000000; j += i)
                    {
                        isPrime[j] = false;
                    }
                }
            }

            while (num != 0)
            {
                num = int.Parse(Console.ReadLine());
                int a = 0;
                int b = 0;
                if (num == 0)
                    break;
                for (int i = 0; i <= num / 2; i++)
                {
                    a = prime[i];
                    b = num - a;
                    if (isPrime[a] && isPrime[b])
                    {
                        sb.AppendLine($"{num} = {a} + {b}");
                        break;
                    }
                }
            }
            Console.WriteLine(sb.ToString());
        }
    }

}

 

 

 

 

 

 

 

반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# - 1676 +) 풀이  (0) 2023.11.05
백준 C# - 10872 +) 풀이  (0) 2023.11.05
백준 C# - 1929 +) 에라토스테네스의 체  (0) 2023.10.31
백준 C# - 1978 +) 풀이  (0) 2023.10.31
백준 C# - 1934  (0) 2023.10.31

댓글