[python]๋ฐฑ์ค€ 1019๋ฒˆ : ์ฑ… ํŽ˜์ด์ง€

๋ฌธ์ œ

์ง€๋ฏผ์ด๋Š” N์ชฝ์ธ ์ฑ…์ด ํ•œ๊ถŒ ์žˆ๋‹ค. ์ฒซ ํŽ˜์ด์ง€๋Š” 1์ชฝ์ด๊ณ , ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€๋Š” N์ชฝ์ด๋‹ค. ๊ฐ ์ˆซ์ž๊ฐ€ ๋ชจ๋‘ ๋ช‡ ๋ฒˆ์ด ๋‚˜์˜ค๋Š”์ง€ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 1,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— 0์ด ์ด ๋ช‡ ๋ฒˆ ๋‚˜์˜ค๋Š”์ง€, 1์ด ์ด ๋ช‡ ๋ฒˆ ๋‚˜์˜ค๋Š”์ง€, ..., 9๊ฐ€ ์ด ๋ช‡ ๋ฒˆ ๋‚˜์˜ค๋Š”์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋‚˜์˜ ๋‹ต

์•Œ๊ณ ๋ฆฌ์ฆ˜

์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ

์˜ˆ์‹œ๋ฅผ ๋งŽ์ด ์–ป๊ธฐ ์œ„ํ•ด ์ „์ฒด ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋จผ์ € ๊ตฌํ˜„

n_list = list()
for z in range(0,1):
    n_list.append(int(input()))

for n in n_list:
    num_result = [0,0,0,0,0,0,0,0,0,0]
    for i in range(1,n+1):
        str_i = str(i)
        for tmp in str_i:
            num_result[int(tmp)]+=1
    print(num_result)1

์ˆซ์ž ํ•˜๋‚˜์”ฉ ๋ฌธ์ž์—ด๋กœ ๋ฐ›์•„์„œ ๊ฐ ์ž๋ฆฌ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด๊ฐ’์„ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰

 

๋‘๋ฒˆ์งธ ์ฝ”๋“œ* => ๋‚˜์˜ ๋‹ต

4328์ด๋ผ๋Š” ์ˆ˜๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด์„œ ์‚ดํŽด๋ณด๋ฉด,

์ฒ˜์Œ์— first_in ํ•จ์ˆ˜์—์„œ๋Š” ์ฃผ์–ด์ง„ ์ˆ˜์˜ ๊ฐ€์žฅ ํฐ ์ž๋ฆฟ์ˆ˜๋ฅผ ๋จผ์ € ๊ฒ€์‚ฌํ•œ๋‹ค. ํ•ด๋‹น ์˜ˆ์ œ์—์„œ๋Š” 4328์ด 1000์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ 1000์˜ ์ž๋ฆฌ ๋จผ์ € ๊ฒ€์‚ฌํ•œ๋‹ค. 1-3์€ 1000๋ฒˆ ๋Œ€, 2000๋ฒˆ ๋Œ€, 3000๋ฒˆ ๋Œ€์˜ ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ ๊ฐ๊ฐ 1000๋ฒˆ ์”ฉ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋”ํ•ด์ง„๋‹ค. 4000๋ฒˆ ๋Œ€ ์ˆ˜๋Š” ๋’ค์— ๋‚˜์˜จ ์ˆ˜+1 ๋งŒํผ์˜ ์ˆ˜๋งŒํผ๋งŒ ์กด์žฌํ•˜๋ฏ€๋กœ 329๋งŒํผ์„ ๋”ํ•ด์ค€๋‹ค. ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์ถ”๊ฐ€๋˜๋Š” ์ด์œ ๋Š” 4000์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (4000-4328๊นŒ์ง€๋Š” 329๊ฐœ์˜ ์ˆ˜)

์ฒซ ํ•จ์ˆ˜๋ฅผ ์ง€๋‚˜๋ฉด ํ˜„์žฌ ๊ณ„์‚ฐ ์ค‘์ธ ์ž๋ฆฟ์ˆ˜ loc_n์„ 1 ์ค„์—ฌ์ค€๋‹ค.

๋‘๋ฒˆ์งธ๋กœ ๋“ค์–ด๊ฐ€๋Š” ํ•จ์ˆ˜๋Š” second_in์ด๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ž๋ฆฟ์ˆ˜๊ฐ€ 1์ด ๋˜๊ธฐ ์ „๊นŒ์ง€๋งŒ ๋Œ์•„๊ฐ„๋‹ค. ํ•ด๋‹น ์˜ˆ์ œ์—์„œ 100์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. 100์˜ ์ž๋ฆฌ์—์„œ 1-9๋Š” 1000์˜ ์ž๋ฆฌ๊ฐ€ 0์ผ ๋•Œ 1๋ฒˆ ๋‚˜ํƒ€๋‚œ๋‹ค.

์ด๋Š” econd_in ํ•จ์ˆ˜์— ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์ž๋ฆฟ์ˆ˜์—์„œ ๊ฐ™๋‹ค. ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜๋Š” ์ค‘๊ฐ„์— ์žˆ๋Š” ์ž๋ฆฟ์ˆ˜์ด๋ฏ€๋กœ ๋ฐ”๋กœ ์œ„์˜ ์ž๋ฆฟ์ˆ˜๊ฐ€ 0์ด๋ฉด ํ•ด๋‹น ์ž๋ฆฟ์ˆ˜์˜ ์ˆ˜๊ฐ€ 0์ด ๋‚˜์˜ฌ ์ˆ˜ ์—†๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

ex_) 0011 ์€ 3์ž๋ฆฌ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ 2์ž๋ฆฌ ์ˆ˜์ด๋‹ค.

1๋ฒˆ์”ฉ ๋‚˜ํƒ€๋‚˜๋ฉด์„œ 100์˜ ์ž๋ฆฟ์ˆ˜์ด๋ฏ€๋กœ ์•„๋ž˜์— ์ˆซ์ž๊ฐ€ 100๋ฒˆ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 100์„ ๊ณฑํ•ด์ค€๋‹ค.

0~9๋Š” 1000์˜ ์ž๋ฆฌ๊ฐ€ 1์ด์ƒ์ผ ๋•Œ ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ (1000์˜ ์ž๋ฆฌ์— ์žˆ๋Š” ์ˆ˜ - 1)๋ฒˆ ๊ผญ ๋‚˜ํƒ€๋‚œ๋‹ค. 4๋งŒ ๋‘๊ณ  ๋ณธ๋‹ค๋ฉด ํ•ด๋‹น ์˜ˆ์ œ์—์„œ 1400๋ฒˆ ๋Œ€, 2400๋ฒˆ ๋Œ€, 3400๋ฒˆ๋Œ€๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์œผ๋‹ˆ 3๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ณ , ๊ฐ ๊ฒฝ์šฐ๋งˆ๋‹ค 100์˜ ์ž๋ฆฌ์ˆ˜์ด๋ฏ€๋กœ 100์„ ๊ณฑํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

ex_)1400-1499, 2400-2499, 3400-3499

์ด๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ์ž๋ฆฟ์ˆ˜๊ฐ€ 1์ด ๋˜๋ฉด ์„ธ๋ฒˆ์งธ๋กœ last_in ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€์„œ 1์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. 1-9๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 1๋ฒˆ ๋‚˜์˜ค๊ณ  (10์˜ ์ž๋ฆฟ์ˆ˜๊ฐ€ 0์ผ ๋•Œ), 0~9๋Š” 1์˜ ์ž๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ์ž๋ฆฌ๋“ค์˜ ์ˆ˜ (432) ์—์„œ 1์„ ๋บ€ ๋งŒํผ ๋‚˜์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  0-ํ˜„์žฌ 1์˜ ์ž๋ฆฌ ์ˆ˜ ๊นŒ์ง€๋Š” 1๋ฒˆ ๋” ๋‚˜์˜จ๋‹ค.

import math

def loc_where(obj): # ์ž๋ฆฟ์ˆ˜ return
    i=0
    while obj:
        i+=1
        obj=obj[1:]
    return i

def first_in(n,arr):
    n_one = int(n[0])
    for i in range(1,n_one):
        arr[i]+=int(math.pow(10,len_n-1))
    arr[n_one]+=int(n[1:])+1
    return arr

def second_in(n,arr,loc):
    multi_num = int(math.pow(10,loc-1))
    for i in range(1,10):
        arr[i]+=multi_num
    for i in range(0,10):
        arr[i]+=(int(n[:len_n-loc])-1)*multi_num
    for i in range(0,int(n[len_n-loc])):
        arr[i]+=multi_num
    arr[int(n[len_n-loc])]+=(int(n[len_n-loc+1:])+1)
    return arr

def last_in(n,arr,loc):
    for i in range(1,10):
        arr[i]+=1
    for i in range(0,10):
        arr[i]+=(int(n[:len_n-1])-1)
    for i in range(0,int(n[len_n-1])+1):
        arr[i]+=1
    return arr

num = input()
loc_n = loc_where(num) # ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์ž๋ฆฟ์ˆ˜
len_n = len(num) # ์ฃผ์–ด์ง„ ์ˆ˜์˜ ์ž๋ฆฟ์ˆ˜
num_array = [0,0,0,0,0,0,0,0,0,0]

if loc_n==1: # ํ•œ ์ž๋ฆฌ ์ˆ˜์ผ๋•Œ
    for i in range(1,int(num)+1):
        num_array[i]+=1
else: # ๋‘์ž๋ฆฌ ์ˆ˜ ์ด์ƒ์ผ ๋•Œ
    num_array = first_in(num,num_array)
    loc_n-=1
    while loc_n>1:
        num_array = second_in(num,num_array,loc_n)
        loc_n-=1
    num_array = last_in(num,num_array,loc_n)

for result in num_array:
    print(result, end=' ')

first_in, second_in, last_in ์„ธ ๊ฐ€์ง€ ํ•จ์ˆ˜๋กœ ๋‚˜๋ˆ„์—ˆ์Œ

์ž๋ฆฟ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ์ˆ˜์˜ ์ž๋ฆฟ์ˆ˜(len_n)์™€ ์ง„ํ–‰ ์ค‘์ธ ์ž๋ฆฟ์ˆ˜(loc_n)๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

 
์‹œ๊ฐ„ ๋ณต์žก๋„

์œ„์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ๋Š” 6์ž๋ฆฌ ์ˆ˜๋ถ€ํ„ฐ๋„ ๊ต‰์žฅํžˆ ๋Š๋ ค์กŒ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n*logn) ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋‘๋ฒˆ์งธ ์ฝ”๋“œ๋กœ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ๋Š” ํฐ ์ˆ˜๋„ 100ms์„ ๋„˜์ง€ ์•Š์•˜๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n) ์ด๋‹ค.

์ด๋Š” for๋ฌธ์ด ์ด์ค‘์œผ๋กœ ๊ฒน์ณ์ง„ ๋ถ€๋ถ„์ด ์—†์–ด์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ํ›จ์”ฌ ๋‚ฎ์•„์ง„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

 
์žฌ๊ท€ํ•จ์ˆ˜

์ด ์ฝ”๋“œ๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋ฉด

 

์„ธ๋ฒˆ์งธ ์ฝ”๋“œ => ์‹คํ—˜ํ•ด๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

def second_in(n,arr,loc):
    multi_num = int(math.pow(10,loc-1))
    for i in range(1,10):
        arr[i]+=multi_num
    for i in range(0,10):
        arr[i]+=(int(n[:len_n-loc])-1)*multi_num
    for i in range(0,int(n[len_n-loc])):
        arr[i]+=multi_num
    arr[int(n[len_n-loc])]+=(int(n[len_n-loc+1:])+1)
    loc-=1
    if loc<=1:
        return arr
    else:
        return second_in(n,arr,loc)



num = input()
loc_n = loc_where(num) # ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์ž๋ฆฟ์ˆ˜
len_n = len(num) # ์ฃผ์–ด์ง„ ์ˆ˜์˜ ์ž๋ฆฟ์ˆ˜
num_array = [0,0,0,0,0,0,0,0,0,0]
if loc_n==1:
    for i in range(1,int(num)+1):
        num_array[i]+=1
else:
    num_array = first_in(num,num_array)
    loc_n-=1
    num_array = second_in(num,num_array,loc_n)
    num_array = last_in(num,num_array,loc_n)

for result in num_array:
    print(result, end=' ')

์ด๋ ‡๊ฒŒ ์•„๋ž˜์—์„œ์˜ ๋ฐ˜๋ณต๋ฌธ์„ ์—†์• ๊ณ  second_in๋งŒ ์žฌ๊ท€๋กœ ๋Œ๋ ค์ฃผ๋ฉด ๋œ๋‹ค. ์ž๋ฆฟ์ˆ˜๋งŒํผ second_in ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ ์Šคํƒ์„ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™์ง„ ์•Š์ง€๋งŒ, ๊ณ„์† ๋ฐฐ์—ด์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š๋‹ค.

 
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

์‹ค์ œ๋กœ https://ideone.com/1qDKfb ๋ผ๋Š” ์‚ฌ์ดํŠธ์—์„œ ๋‘๋ฒˆ์งธ ์ฝ”๋“œ์— 1000000000๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์ค€ ๊ฒฐ๊ณผ 0.02s์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ณ  9608KB์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜ ์„ธ๋ฒˆ์งธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ 0.14s์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ณ  23360KB์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

๋Š๋‚€ ์ 

์‰ฌ์šด ์ฝ”๋“œ๋กœ ์˜ˆ์‹œ๋ฅผ ๋งŽ์ด ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋„ ์‹œ๊ฐ„์ด ์ ๊ฒŒ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•