오늘보다 더 나은 내일의 나에게_

자바 알고리즘 문제 풀이 Array Q06_뒤집은 소수 본문

ALGORITHM/inflearn_javaAlgorithm

자바 알고리즘 문제 풀이 Array Q06_뒤집은 소수

chan_96 2022. 2. 13. 17:58
728x90
설명

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하는 프로그램을 작성하세요.

예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력한다. 단 910을 뒤집으면 19로 숫자화 해야 한다.

첫자리부터의 연속된 0은 무시한다.


입력

첫 줄에 자연수의 개수 N(3 <=N <=100)이 주어지고, 그다음 줄에 N개의 자연수가 주어진다.

각 자연수의 크기는 100,000를 넘지 않는다.


출력

첫 줄에 뒤집은 소수를 출력합니다. 출력 순서는 입력된 순서대로 출력합니다.

 


예시 입력1


예시 출력

9
32 55 62 20 250 370 200 30 100
23 2 73 2 3

 

코드

해설 코드

import java.util.*;
class Main {	
	public boolean isPrime(int num){
		if(num==1) return false;
		for(int i=2; i<num; i++){
			if(num%i==0) return false;
		}
		return true;
	}

	public ArrayList<Integer> solution(int n, int[] arr){
		ArrayList<Integer> answer = new ArrayList<>();
		for(int i=0; i<n; i++){
			int tmp=arr[i];
			int res=0;
			while(tmp>0){
				int t=tmp%10;
				res=res*10+t;
				tmp=tmp/10;
			}
			if(isPrime(res)) answer.add(res);
		}
		return answer;
	}
	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		int[] arr=new int[n];
		for(int i=0; i<n; i++){
			arr[i]=kb.nextInt();
		}
		for(int x : T.solution(n, arr)){
			System.out.print(x+" ");
		}
	}
}

 

 

풀이 및 정리 

문제 풀이 순서를 정리해보면 
1. n 정수 입력 후 n개만큼의 반복문 작성 후 int []배열 입력
2. int[] 배열의 각각의 인덱스를 뒤집기
3. 각각의 인덱스가 소수이면 ArrayList<Integer>에 추가
4. 출력
이런 식으로 정리할 수 있다.

수를 뒤집는 방법은 여러 가지가 있겠지만 해설과 같은 코드로 할 수 있다.
int tmp = arr[i];
int res = 0;

while(tmp > 0) {
    int t = tmp % 10;
    res = res*10 + t;
    tmp /= 10;
}​

예를 들어 arr[i]대신 348이란 숫자를 tmp에 대입시켜보면

while문에서 348 % 10 = 8로 int t = 8
res = 0 * 10 + 8 => res = 8
tmp = 348 / 10 => tmp = 34
---------------------------------------------
다시 while문 진행
int t = 34 % 10 => int t = 4
res = 8 * 10 + 4 => res = 84
tmp = 34 / 10 => tmp = 3
---------------------------------------------
다시 while문 진행
int t = int 3 % 10 => int t = 3
res = 84 * 10 + 3 => res = 843
tmp = 3 / 10 => tmp = 0
---------------------------------------------
while문 종료
=> tmp = 348 값이
res에 뒤집어진 상태로 대입 res = 843

num 임의의 수 소수인지 판별하는 방법
public boolean isPrime(int num) {
    if(num==1) return false;

    for (int i = 2; i < num; i++) {
        if(num%i==0) return false;
    }

    return true;
}​

먼저 1은 소수가 아니다.
for문을 통해 i=2부터 i <num까지 i++로 작성한다.
그래고 if문에 조건으로 num을 i로 나눠 나머지가 0이 되면 return false;
왜냐하면 소수는 1과 자기 자신으로 나눠지는 수이기 때문에 1에서 num-1까지 사이의 숫자로 나눠지면 안 된다
728x90
Comments