뒤집은 소수

Seungmin Lim·2022년 2월 6일
0

코딩문제연습

목록 보기
19/63
post-thumbnail

문제

나의풀이

import java.util.*;

class Main {
	public ArrayList<Integer> solution(int n,int[] arr) {
			ArrayList<Integer> answer = new ArrayList<>();
			
			for(int i=0; i<arr.length; i++) {
				//숫자뒤집기
				String rv = new StringBuilder(Integer.toString(arr[i])).reverse().toString();
				int a = Integer.parseInt(rv);
				//뒤집힌 숫자의 제곱근
				int rt = (int) Math.sqrt(a);
				boolean prime = true;
				
				//소수판별
				for(int j=2; j<=rt;j++) {
					if(a%j == 0) prime = false;
				}
				if(prime && a>1) answer.add(a);
			}
			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+ " ");
		}
	}
	
}

다른 isPrime을 따로 만든 풀이법

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; //끝자리 321
					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. 처음엔 에라토스테네스의 체를 써서 해당 수의 제곱근까지의 배수만 전부 제외 시키는것을 따로 함수를 작성하지 않고 해결했는데,
    for문에서 rt까지 포함시켜야되는 사실을 모르고 애먹었다..

2.isPrime을 따로 두고 숫자를 뒤집는것도 stringBuilder를 쓰지않고 일일히 뒤집었다.
tmp가 현재 숫자이고 t가 tmp를 10으로 나눈것의 나머지일때,
t는 무조건 tmp의 끝자리 숫자이므로 그것을 res에
res = res*10 + t로 저장하게되면, 끝자리부터 담긴다.
그리고 tmp를 맨 뒷자리를 제외한 즉,t를 제외한 값인,
tmp/10 (몫)으로 바꿔주면 된다!

핵심키워드

첫번째 풀이에서 판별을 할때, for문을 rt까지 포함시켜서 돌리는것이 중요!
만약 9를 판별한다하면 root = 3으로 3의 배수가 맞는지도 판단해야하는데 2까지만 판단하단 때문에 꼭 포함시켜야한다.

0개의 댓글