
개인적으로 이번 문제는 시간초과에 대한 스트레스를 최대로 느낀 문제였던 것 같다.. 처음 시도해본 코드는
X = int(input())
Z = [X]
Y = 0
cnt = 0
while Z[-1] >= 10 :
Y = 0
for i in range(len(str(X))) :
Y += int(str(X)[i])
X = Y
Z.append(Y)
cnt += 1
print(cnt)
if Z[-1] == 3 or Z[-1] == 6 or Z[-1] == 9 :
print('YES')
else :
print('NO')
이렇게 각 자리수의 합을 Z 리스트에 추가해 Z의 최근 값이 3,6,9중 하나인지 확인하는 코드를 작성했다.
하지만 뭐..시간초과가 났다. 솔직히 이건 내가 코드를 이상하게 작성했으니 이해가 된다
append 함수를 사용했으니 시간이 오래 걸리는건 알고 있었긴 해도 2%에서 시간초과가 난건 살짝 이해가 안 됐다.
그렇기에 두번째 코드에서는 리스트가 아닌 변수만 쓰기로 하고
import sys
input = sys.stdin.readline
X = int(input())
Y = 0
cnt = 0
while X >= 10 :
Y = 0
for i in range(len(str(X))) :
Y += int(str(X)[i])
X = Y
cnt += 1
print(cnt)
if X == 3 or X == 6 or X == 9 :
print('YES')
else :
print('NO')
이렇게 시도해봤다. sys.stdin.readline도 사용했고 전 코드에서 Z 리스트에 들어가는 값이 X(X = Y 이므로)이랑 같았기에 리스트를 사용 하지 않아도 어렵지 않게 고칠 수 있었다.

솔직히 여기서 시간초과가 날 줄은 몰랐다... 그것도 리스트를 사용한 코드랑 똑같은 2%대에서.. 생각해보니 int형을 str로, str을 int형으로 변환하는 것이 너무 많아서 시간이 오래 걸릴 것 같아서 이번엔
import sys
input = sys.stdin.readline
X = int(input())
X = str(X)
Y = 0
cnt = 0
while int(X) >= 10 :
Y = 0
for i in range(len(X)) :
Y += int(X[i])
X = str(Y)
cnt += 1
print(cnt)
X = int(X)
if X == 3 or X == 6 or X == 9 :
print('YES')
else :
print('NO')
처음에 str로 받고 (그냥 input()만 쓰고 싶었는데 그럼 \n도 같이 입력돼서 에러를 발생시킴) 필요할 때만 int로 바꿔서 형 변환을 최소한으로 사용했다. 
문제가 많이 어렵지는 않지만 평소에 코드 작성하는 스타일이 이상했기에 유독 오래 걸린 듯 했고 앞으로 코드 스타일을 바꿔야 할 것 같다..
import sys
input = sys.stdin.readline
X = int(input())
X = str(X)
Y = 0
cnt = 0
while int(X) >= 10 :
Y = 0
for i in range(len(X)) :
Y += int(X[i])
X = str(Y)
cnt += 1
print(cnt)
X = int(X)
if X == 3 or X == 6 or X == 9 :
print('YES')
else :
print('NO')