https://www.acmicpc.net/problem/1291
조건 설명이 굉장히 긴 문제다. 어떠한 수가 주어질 때, 그 수가 이면수인지, 임현수 인지, 둘 다 아닌지, 둘 다 인지 출력하는 문제이다. 이면수는 절대수 이면서, 각 자리수의 합이 홀수인 수이다. 임현수는 chicken number 혹은 starcraft number 이거나 소인수분해 시, 소인수의 종류의 갯수가 짝수인 수이다.
지문을 잘 보면 절대수는 5보다 큰 정수를 의미한다. 따라서 이면수를 구하는 코드는 다음과 같다.
private static boolean isImyeonsu(int number) {
if (number < 4 || number == 5) {
return false;
}
int sum = 0, num = number;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum % 2 != 0;
}
chicken number 는 4를, starcraft number 는 2를 의미한다.소인수의 종류의 갯수는 2부터 수의 제곱까지 나눌 수 있는 수로 안 나누어질 때 까지 그 수로 나눈 후, 갯수를 증가시켜서 소수의 갯수를 찾았다.
private static boolean isImhyunsu(int number) {
if (number == 2 || number == 4) {
return true;
}
if (number < 2) {
return false;
}
if (isPrime(number)) {
return false;
}
int count = 0;
int temp = number;
for (int i = 2; (long) i * i <= temp; i++) {
if (temp % i == 0) {
count++;
while (temp % i == 0) {
temp /= i;
}
}
}
if (temp > 1) {
count++;
}
return count % 2 == 0 && count > 0;
}
결과 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class 이면수와임현수1291 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
br.close();
if (isImyeonsu(n) && !isImhyunsu(n)) {
System.out.print("1");
} else if (!isImyeonsu(n) && isImhyunsu(n)) {
System.out.print("2");
} else if (!isImyeonsu(n) && !isImhyunsu(n)) {
System.out.print("3");
} else {
System.out.print("4");
}
}
private static boolean isImyeonsu(int number) {
if (number < 4 || number == 5) {
return false;
}
int sum = 0, num = number;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum % 2 != 0;
}
private static boolean isImhyunsu(int number) {
if (number == 2 || number == 4) {
return true;
}
if (number < 2) {
return false;
}
if (isPrime(number)) {
return false;
}
int count = 0;
int temp = number;
for (int i = 2; (long) i * i <= temp; i++) {
if (temp % i == 0) {
count++;
while (temp % i == 0) {
temp /= i;
}
}
}
if (temp > 1) {
count++;
}
return count % 2 == 0 && count > 0;
}
private static boolean isPrime(int number) {
if (number < 2) {
return false;
}
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
}
'알고리즘(백준 등) 공부 > 백준(자바)' 카테고리의 다른 글
| 백준 1301번: 비즈 공예 (0) | 2026.03.04 |
|---|---|
| 백준 1300번: K번째 수 (0) | 2026.03.03 |
| 백준 1286번: 부분 직사각형 (0) | 2026.02.28 |
| 백준 1285번: 동전 뒤집기 (0) | 2026.02.27 |
| 백준 1283번: 단축기 지정 (0) | 2026.02.26 |