본문 바로가기

JAVA/알고리즘 예제

[JAVA] 소수로 삼각형 찍기

아래 실행 결과 처럼 2차원 배열에 직각 삼각형 형태로 1000까지의 자연수 중 2부터 시작하여 순차적으로 소수를 15개 까지 저장하는 알고리즘을 작성하라.



package javalesson.com.javalesson.ch01test;


public class T06PrimeTriangle {

public static void main(String[] args) {

int pri[] = new int[15];  //소수 15개를 넣을 배열

int  array[][] = new int[5][5];  //삼각형을 출력하기 위한 2차원배열

int cnt;  //소수인지 판별하기 위해 이전에 구해진 소수로 나누어 줄 횟수

int P,Q;  //P : 소수 Q: 소수 판별 반복문을 위한 변수

int mok,na;  //소수를 판별하기 위한 몫과 나머지

pri[0]=2;pri[1]=3; //예외 사항이므로 미리 초기값을 줌

cnt=1;

for(P=5;P<=1000;P+=2){  //5부터 1000까지 홀수만 소수인지 판별하겠다

for(Q=1;Q<cnt;Q++){  //P를 이전에 구해진 소수로 나누며 판별하겠다.

na=P-mok*pri[Q-1]; //P%pri[Q-1] 나머지가 0이면 소수가 아니다.

if(na==0)break;

}

if(Q==cnt){  //반복문을 끝까지 돌았을 경우에만 아래를 실행하겠다.

cnt++;  //소수를 찾으면 증가시킨다. ex) 7을 판별하려면 3과 5로 나눠봐야한다.

pri[cnt]=P;  //현재의 P를 배열에 저장한다.

}

if(cnt==14)break//15개의 소수를 찾으면 탈출한다.

}

cnt=0;  

for(P=0;P<5;P++){  //5*5 2차원 배열에 소수를 직각 삼각형 형태로 넣어준다.

for(Q=4-P;Q<5;Q++){

array[P][Q]=pri[cnt];

cnt++;

}

}


                //출력

for(P=0;P<5;P++){

for(Q=0;Q<5;Q++){

                              if(array[P][Q]==0){

     System.out.printf("   ");

}else{

                             System.out.printf("%3d",array[P][Q]);

                        }

                   }

System.out.println();

}

}

}


더 생각해 볼 점

예외사항 (pri[0]=2, pri[1]=3)을 최대한 배제한 로직으로 수정해보기