PS(Problem Solving)/BOJ

[백준/BOJ] 2061번: 좋은 암호

JunsuKim 2021. 11. 9.
728x90

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

 

2061번: 좋은 암호

암호화 방식 중에는 소수를 이용하는 것들이 많다. 보통은 매우 큰 두 개의 소수를 선택하고, 두 소수를 곱한 값을 암호화에서의 키로 사용하고는 한다. 이러한 방법이 좋은 이유는 일반적으로

www.acmicpc.net

문제

암호화 방식 중에는 소수를 이용하는 것들이 많다. 보통은 매우 큰 두 개의 소수를 선택하고, 두 소수를 곱한 값을 암호화에서의 키로 사용하고는 한다. 이러한 방법이 좋은 이유는 일반적으로 매우 큰 수를 소인수분해하는 것이 어렵기 때문이다.

소수를 택할 때 큰 수를 택하면, 이 둘을 곱해서 얻어지는 키 값도 커지게 된다. 하지만 그 반대는 성립하지 않을 수도 있다. 즉, 키 값이 매우 큰 경우에도 이를 소인수분해하는 것은 쉬울 수도 있다.

따라서 암호문이 크랙 되지 않도록 하기 위해서는, 키 값이 적절히 큰 수들의 곱으로 이루어져 있는지를 확인해야 할 필요가 있다. 키 값 K와 정수 L이 주어졌을 때, K를 인수분해했을 때, 항상 L 이상의 값으로만 이루어져 있는지를 확인하고 싶다. 물론 인수분해 할 때 1로 나누는 경우는 고려하지 않는다.

예를 들어 K=143인 경우, 이는 11과 13의 곱으로 이루어져 있다. 즉, 이를 인수분해하는 방법은 11×13, 143의 두 가지 경우뿐이다. 따라서 L이 11일 경우에는 인수분해했을 때 나온 수들이 모두 L 이상이므로 좋은 경우지만, L이 12 이상일 경우에는 좋은 암호가 아니다.

K와 L이 주어졌을 때, 좋은 암호인지 판단하는 프로그램을 작성하시오.

해설

우선 k의 범위가 10100이므로 k는 BigInteger를 사용했다.

k를 인수분해 했을 때 l보다 큰 수들만 나와야만 좋은 암호라 한다.

따라서 0부터 l-1까지의 루프를 만들어 k에 나눴을 때 0으로 나눠 떨어지는 값이 있다면 좋은 암호가 될 수 없다.

소스 코드

import java.math.BigInteger

fun main(){
    val input = readLine()!!.split(" ")
    val k = BigInteger(input[0])
    val l = input[1].toInt()
    var bad = 0
    for(i in 2 until l){
        if(k.remainder(i.toBigInteger()) == BigInteger.ZERO) {
            bad = i
            break
        }
    }
    if(bad == 0) println("GOOD")
    else println("BAD $bad")
}
728x90

'PS(Problem Solving) > BOJ' 카테고리의 다른 글

[백준/BOJ] 2355번: 시그마  (0) 2021.11.15
[백준/BOJ] 2439번: 별 찍기 - 2  (0) 2021.11.10
[백준/BOJ] 16428번: A/B - 3  (0) 2021.11.09
[백준/BOJ] 2438번: 별 찍기 - 1  (0) 2021.11.08
[백준/BOJ] 1009번: 분산처리  (0) 2021.11.08

댓글