본문 바로가기
코딩/백준-자바

[자바] 백준 1747번: 소수&팰린드롬

by 철없는민물장어 2023. 1. 17.
728x90
반응형

https://www.acmicpc.net/problem/1747

 

1747번: 소수&팰린드롬

어떤 수와 그 수의 숫자 순서를 뒤집은 수가 일치하는 수를 팰린드롬이라 부른다. 예를 들어 79,197과 324,423 등이 팰린드롬 수이다. 어떤 수 N (1 ≤ N ≤ 1,000,000)이 주어졌을 때, N보다 크거나 같고,

www.acmicpc.net

 

우선 팰린드롬인지 판별하는 함수 isPalindrome(int i)를 만들었다

숫자를 String으로 변환한 후,

양 끝에서부터 한쌍씩 비교하여 팰린드롬인지 판별한다.

 

이후 main함수에서

N부터 maxValue까지

팰린드롬인 숫자라면

소수인지 계산한 후,

값을 출력한다.

 

.

.

개인적인 능지 문제로 첫 시도를 실패했다

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class P1747 {

	
	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());

		for (int i = N; i < Integer.MAX_VALUE; i += 2) {
			if (isPalindrome(i)) {
				boolean isP = true;

				for (int k = 3; k <= (i / 2); k++) {
					if (i % k == 0) {
						isP = false;
						break;
					}
				}

				if (isP) {
					System.out.println(i);
					return;
				}
			}
		}

	}

	static boolean isPalindrome(int num) {
		String str_num = String.valueOf(num);
		int i = 0, j = str_num.length() - 1;

		while (i < str_num.length() / 2) {
			if (str_num.charAt(i) == str_num.charAt(j)) {
				i++;
				j--;
			} else {
				return false;
			}
		}
		return true;
	}
	
 

}

 

소수판별하는데 루트씌워야되는걸 나누기2를 하고..

N이 짝수일수도 있는데 신경도 안쓰고.. 이상하게 코드를 짰다.

 

처음엔 이 코드가 소수구하는데 시간이 오래걸려서 그런가? 싶었는데

코드를 수정했더니 잘 됐다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class P1747 {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());

		for (int i = ((N < 2) ? 2 : N); i < Integer.MAX_VALUE; i++) {
			if (isPalindrome(i)) {
				boolean isP = true;

				for (int k = 2; k <= Math.sqrt(i); k++) {
					if (i % k == 0) {
						isP = false;
						break;
					}
				}

				if (isP) {
					System.out.println(i);
					return;
				}
			}
		}

	}

	static boolean isPalindrome(int num) {
		String str_num = String.valueOf(num);
		int i = 0, j = str_num.length() - 1;

		while (i < str_num.length() / 2) {
			if (str_num.charAt(i) == str_num.charAt(j)) {
				i++;
				j--;
			} else {
				return false;
			}
		}
		return true;
	}

}

 

추가로,

배열을 만들어서 1부터 특정숫자까지 미리 소수판정을 다 해놓고 사용하는 방법도 좋을 것 같다.

(하지만 최대숫자를 무엇으로 할지.. 고민이 될 듯 하다. 너무 큰 수면 계산하는데 시간이 오래걸릴터이고 너무 작으면 내가 판별하려는 숫자가 그 범위에 없을수도) 

728x90
반응형

댓글