ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10. 정수론
    [Do it_java] 2023. 6. 2. 23:20

    p. 215~253


    < 정수론 : 수의 성질을 탐구하고 공부하는 분야 >

     정수론에서 가장 많이 등장하는 부분

     

    1) 소수 구하기 *에라토스테네스의 체 활용

          - 자신보다 작은 2개의 자연수를 곱해 만들 수 없는 1보다 큰 자연수

          - 1과 자기 자신 외에 약수가 존재하지 않는 수

     

     ✔ 에라토스테네스의 체 원리

        1. 구하고자 하는 소수의 범위만큼 1차원 배열 생성

        2. 2부터 시작, 현재 숫자가 지워지지 않을 때는 현재 선택된 숫자의 배수에 해당하는 수를 

          배열에서 끝까지 탐색하면서 지웁니다. *선택된 숫자는 지우지 않습니다.

       3. 배열의 끝까지 '2'를 반복한 후 배열에서 남아있는 모든 수를 출력합니다.

     

     ✔ 백준 1929번 - 소수 구하기

    ✔ 문제 분석

    * M이상 N이하의 소수를 모두 출력 (1줄에 1개씩 증가하는 순서)

    - 1번째 줄에 M과 N이 빈칸을 사이에 두고 주어지고 M이상 N이하의 소수가 1개이상 있는 입력만 주어짐

    - 소수를 찾을 때는 2이상부터 자기 자신보다 작은 수로 나웠을 때 나머지가 0이 아닌 수를 찾는다.

     ✔ 문제 풀기

    * 주의사항: 숫자 사이에 소수를 출력하는 것으로 N의 최대 범위가 너무 커서 일반적인 방식으로 하면 시간 초과 발생

                       에라토스테네스 방법 이용

    - 크기가 N +1인 배열을 선언한 후 값을 각각의 인덱스 값으로 채우기

    - 1은 소수가 아니므로 삭제

    - 2~N의 제곱근까지 값을 탐색, 값이 인덱스 값이면 두고 그 값의 배수를 탐색해 0으로 변경

    - 배열에 남아 있는 수 중 M이상 N이하의 수를 모두 출력

     

     

     ✔ 코드 작성

    - 화면을 통해 받은 데이터 M, N에 받기

    - A배열 생성하기

     

    - 반복문으로 N의 제곱근까지 반복하고 배수 지우기

    - 소수만 출력하기


     2) 오일러의 피

          - 오일러 피 함수는 증명 과정을 공부해야 완벽하게 알 수 있기에 구현만 이해하기

     

     ✔ 오일러 피의 원리

         1. 구하고자 하는 오일러 피의 범위만큼 배열을 초기화

        2. 2부터 시작, 현재 배열의 값과 인덱스가 값으면 (소수일 때)

            현재 선택된 숫자의 배수에 해당한 수를 배열에 끝까지 탐색하며

            P[i] = P[i] - P[i]/K 연산을 수행한다 * i는 K의 배수

       3. 배열의 끝까지 '2'를 반복하여 오일러의 피 함수를 완성한다.

     


     3) 유클리드 호제법

          -  두 수의 최대공약수를 구하는 알고리즘

          -  MOD 연산의 활용 (10%4 = 2) 

     

    ✔ MOD 연산으로 구현하는 유클리드 호재법

         1. 큰 수를 작은 수로 나누는 MOD 연산을 수행한다.

         2. 앞 단계에서의 작은 수와 MOD 연산 결괏값으로 MOD연산을 수행한다.

         3. 나머지가 0이 되는 순간의 작은 수를 최대 공약수로 선택

     

     ✔ 백준 1850번 - 최대공약수

    ✔ 문제 분석

    * A와 B의 최대공약수를 출력한다 *천만 자리를 넘지 않는다

    - 1번째 줄에 자연수 A와 B를 이루는 1의 개수가 주어진다. 

     

     ✔ 문제 풀기

    * 주의사항: A가 3이면 111, B가 6이면 111111 

    - 유클리드 호제법으로 A와 B의 공약수를 구한다

    -  공략수 길이만큼 1을 출력 * 시간초과가 되지 않도록 BufferedWriter을 사용

     

     

     ✔ 코드 작성


    4)  확장된 유클리드 호제법

          - 정확히 이해하기 위해선 수학 증명 과정을 공부해야 하기에 알고리즘만 이해하기

          -  해를 구하고자 하는 방정식 ax + by = c(a, b, c, x, y는 정수)

     

     확장된 유클리드 호제법 원리 

        * 5x + 9y =2 일 때 이식을 만족하는 정수 x, y를 구하기

     

         1. 5x + 9y가 정수해를 갖게 하는 c의 최솟값이 gcd(5,9) 적용

            gcd(5,9) = 1 이므로 5x + 9y =1로 식을 다시 정리

         2. a, b로 반복실행하며 몫과 나머지를 저장

            나머지가 0이 되면 중단

        3, 4

        - 유클리드로 구한 나머지와 몫을 이용해 역순으로 x = y`,    y = x` - y`  * q 를 계산

        - 최종 x, y는 ax + by = gcd(a, b)를 만족


    아......................... 현타온다 

    너무 어렵다

    '[Do it_java]' 카테고리의 다른 글

    11-2. 그래프의 표현  (0) 2023.06.05
    11. 그래프 (서론)  (0) 2023.06.04
    9. 그리디(greedy) 알고리즘  (0) 2023.05.31
    7. 깊이 우선 탐색(DFS), 너비 우선 탐색(BFS)  (0) 2023.05.29
    5. 버블정렬, 선택정렬  (0) 2023.05.27
Designed by Tistory.