본문 바로가기
알고리즘/koreatech

1010: 접두 소수

by cjw.git 2020. 12. 9.

Link : judge.koreatech.ac.kr/problem.php?id=1010


1. 문제

  • 숫자 "2333"의 경우 접두 숫자인 "2", "23", "233", "2333" 이 모두 소수입니다.
    길이 n이 주어졌을 때 길이 n에 해당하는 모든 접두 소수를 출력해주세요.

 


2. 문제의 조건

  • 1 <= n <= 8 (접두소수의 길이)

 


더보기

3. 문제 접근

  • 시간 복잡도

    길이가 8일경우 10,000,000 자리가 되면서 최소환 O(N^1.1428) 안에 해결해야한다고 생각하였습니다.


  • 아이디어

    소수판별은 기본적으로 O(N^2)을 갖게 됩니다. 하지만 소수의 성질을 이용하면 O(sqrt(N))까지 줄일 수 있다는 것을 알게 되었습니다.

    접두소수는 맨 앞자리부터 n까지의 길이가 모두 "소수"가 되어야합니다. 결국 맨앞자리 부터 "소수"가 되야 하므로 맨앞자리에 올 수 있는 숫자는 [2, 3, 5, 7]입니다. 그 후 중간부터는 짝수가 들어가게 된다면 2로 나누어 떨어지므로 2의 배수가 되면 안되므로 조건을 줄여줍니다. [1, 3, 5, 7, 9]가 남는데 5도 5로 항상 나뉘어지므로 [1, 3, 7, 9]가 남게 됩니다. 즉 첫수와 끝수는 [2, 3, 5, 7]로 이루어져야만 하고 중간의 수들은 [1, 3, 7, 9]로 이루어져야합니다. 그리고 저는 어떠한 규칙으로 수를 만드는 것은 대부분 재귀를 이용합니다.

    재귀의 시간복잡도는 아직 파악하지 못하였습니다. @ + sqrt(N)이 될 것 같습니다.

 

 

 


4. 풀이 방법

  • 소수를 판별하는 함수를 작성합니다.
  • 규칙에 따라 첫, 끝점이 [2, 3, 5, 7]인 숫자와 중간점이 [1, 3, 7, 9]인 숫자를 만들어주는 재귀를 작성합니다.
    (주의 : n이 5로 주어질 경우 만약 n=>2 [2, 1]단계에서 21은 소수가 아니므로 [2 1 1]로 탐색하는 것이 아닌 바로 [2, 3]으로 넘어가시면 됩니다)
  • 길이가 n만큼 채워졌을경우 최종적으로 비교하고 소수가맞으면 출력합니다.

 


5. 소스코드

 


 

cjw.git@gmail.com

 

소수의 성질 출처 : jm-park.github.io/algorithm/2018/08/06/Prime-Number(%EC%86%8C%EC%88%98)-%ED%8C%90%EB%B3%84%EB%B2%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.html

'알고리즘 > koreatech' 카테고리의 다른 글

1015: 괄호 짝  (0) 2020.12.09
1011: 징검다리  (0) 2020.12.09
1007: 유일한 수  (0) 2020.12.08
1004: 뒤집어 더하기  (0) 2020.12.08
1003: 0을 만들자 - Small  (0) 2020.12.08

댓글