본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 2331번: 반복수열 -Python

728x90

[백준알고리즘] 2331번: 반복수열 -Python

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

 

2331번: 반복수열

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.

www.acmicpc.net

처음 짠 코드와 다른 분들의 코드를 보고 수정한 코드를 다 가져왔다. 다른 분들의 코드를 보니 딱히 도움이 되지 않는 작업들을 한 것 같다.

 

우선은 참고했던 반례는 아래와 같다.

in: 153 3

out: 0

in: 58 2

out: 0

in: 9999 5

out: 3

 

처음에 짰을 때에는 순열의 다음 값을 가리키기 위해서 리스트 link에 다음 값에 대한 정보를 추가했었다. 그리고 link에 포함되었던 값이 나오게 되면 사이클이 형성된 것이기 때문에 중복된 값의 인덱스 앞까지 잘랐다.

 

import sys

a, p = map(int, sys.stdin.readline().split())
seq = [a] 
link = [0]*250000
link[a] = 1

while True:
    t = seq[-1]
    val = 0
    while t:
        val += ((t%10) ** p)
        t //= 10

    if not link[val]:
        seq.append(val)
        link[val] = 1
    else:
        seq = seq[:seq.index(val)]
        break

sys.stdout.write(str(len(seq)))

 

위의 내용을 더 간단하게 확인한 것이다. 실제로 다음에 연결되어있는 값의 정보는 필요하지 않기 때문에 굳이 리스트를 하나 더 사용할 필요가 없었다.

 

import sys

a, p = map(int, sys.stdin.readline().split())
seq = [a] 

while True:
    t = seq[-1]
    val = 0
    while t:
        val += ((t%10) ** p)
        t //= 10

    if val in seq:
        sys.stdout.write(str(seq.index(val)))
        break
    else:
        seq.append(val)

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90