랜덤 숫자 만들기

면접 대비

시간 제한1초메모리 제한256 MB

요약
네 자리 수에 중간 제곱법을 적용해 시뮬레이션하고, 처음 반복되기 전까지 등장하는 서로 다른 값의 개수를 센다.
난이도

보통10점 중 4점

유형
시뮬레이션, 해시맵, 구현, 수학
정답자
아직 제출이 없습니다

문제

존 폰 노이만(John von Neumann)은 1946년에 유사난수(pseudo-random number) 수열을 만드는 방법을 제안했다. 이 방법은 중간제곱법(middle-square method)이라고 불리며, 다음과 같이 동작한다.

먼저 초기값 a0a_0을 정한다. a0a_0은 십진법으로 나타냈을 때 자릿수가 nn을 넘지 않아야 한다. 다음으로 a0a_0을 제곱한 뒤, 그 결과의 자릿수가 2n2n이 되도록 앞에 00을 채운다. 이렇게 만든 2n2n자리 수의 가운데 nn자리를 a1a_1로 삼는다. 같은 규칙을 반복하면 모든 i>0i > 0에 대해 aia_i를 구할 수 있다. 이 문제에서는 n=4n = 4로 고정한다.

예 1: a0=5555a_0 = 5555이면 a02=30858025a_0^2 = 30858025이므로, 가운데 네 자리를 취해 a1=8580a_1 = 8580이 된다.

예 2: a0=1111a_0 = 1111이면 a02=01234321a_0^2 = 01234321(앞에 00을 채워 여덟 자리로 만든 값)이므로, a1=2343a_1 = 2343이 된다.

사실 이 방법은 좋은 난수 생성기가 아니다. 수열은 언젠가 이전에 나왔던 값을 다시 만들어 내며 순환에 빠지기 때문이다.

a0a_0이 주어졌을 때, 이 수열이 처음으로 값을 반복하기 전까지 만들어 내는 서로 다른 수의 개수를 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄에 정수 a0a_0 하나로 주어진다 (0<a0<100000 < a_0 < 10000). a0a_0이 네 자리가 아니면 앞에 00을 채워 네 자리로 표기한다. 입력의 마지막 줄에는 00 하나가 주어지며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스마다 수열에 나타나는 서로 다른 aia_i의 개수를 한 줄에 출력한다. a0a_0도 세는 값에 포함한다.

예제1

  1. 예제 1

    입력
    5555
    0815
    6239
    0
    
    예상 출력
    32
    17
    111