본문 바로가기

알고리즘(백준 등) 공부/백준(자바)

백준 1291번: 이면수와 임현수

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;
    }
}