감소하는 수

honeyricecake·2022년 7월 16일
0

파이썬

목록 보기
26/26

내 코드

decN = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
num = [0,10]

decN.append([])
num.append(num[1])
for i in range(1, 10):
	for x in decN[0]:
		if i <= x:
			break
		decN[1].append(x + 10 * i)
		num[2] += 1

decN.append([])
num.append(num[2])
for i in range(1, 10):
	for x in decN[1]:
		if i <= x//10:
			break
		decN[2].append(x + 100 * i)
		num[3] += 1

decN.append([])
num.append(num[3])
for i in range(1, 10):
	for x in decN[2]:
		if i <= x//100:
			break
		decN[3].append(x + 1000 * i)
		num[4] += 1

decN.append([])
num.append(num[4])
for i in range(1, 10):
	for x in decN[3]:
		if i <= x//1000:
			break
		decN[4].append(x + 10000 * i)
		num[5] += 1

decN.append([])
num.append(num[5])
for i in range(1, 10):
	for x in decN[4]:
		if i <= x//10000:
			break
		decN[5].append(x + 100000 * i)
		num[6] += 1

decN.append([])
num.append(num[6])
for i in range(1, 10):
	for x in decN[5]:
		if i <= x//100000:
			break
		decN[6].append(x + 1000000 * i)
		num[7] += 1

decN.append([])
num.append(num[7])
for i in range(1, 10):
	for x in decN[6]:
		if i <= x//1000000:
			break
		decN[7].append(x + 10000000 * i)
		num[8] += 1

decN.append([])
num.append(num[8])
for i in range(1, 10):
	for x in decN[7]:
		if i <= x//10000000:
			break
		decN[8].append(x + 100000000 * i)
		num[9] += 1

decN.append([])
num.append(num[9])
for i in range(1, 10):
	for x in decN[8]:
		if i <= x//100000000:
			break
		decN[9].append(x + 1000000000 * i)
		num[10] += 1

N = int(input())

flag = False
for i in range(1, 11):
	if N < num[i]:
		flag = True
		print(decN[i - 1][N - num[i - 1]])
		break

if not flag:
	print(-1)

엄청난 노가다를 했다.
시간을 재고 푸느라 급하게 했는데 반복문을 써도 될 뻔했다.

다른 사람 코드

# from timeit import  Timer 로 시간측정
import itertools
n=int(input())
T=True
for i in range(1,11):
    L=list(itertools.combinations("9876543210",i))[::-1]
    if n<len(L):
        print(''.join(L[n]))
        T=False
        break
    else:
        n-=len(L)
if T:
    print(-1)

9876543210 으로 만드는 조합 (단, 선후관계는 바뀌지 않음) 을 이용한 것이다.

반복문에 대하여 i 개짜리 조합을 만들어 i개짜리 조합은 987..부터 시작하므로 이를 역순으로 만들고
ex. 2개짜리 조합은
98 97 96 95 94..... 21 20 10 이고 이를 역순으로 하면 순서가 맞다.

이후 n < L[n]이면 L[n]에서 공백을 없애서 출력한다.

import itertools

str = "abcd"
arr = list(itertools.combinations(str, 2))

print(arr)

print(''.join(arr[0]))

위와 같이 출력되는 것을 볼 수 있다.

0개의 댓글