๋ฌธ์
์ง๋ฏผ์ด๋ 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์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์๋ค.
๋๋ ์
์ฌ์ด ์ฝ๋๋ก ์์๋ฅผ ๋ง์ด ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์๊ฐ์ด ์ ๊ฒ ๊ฑธ๋ฆฐ๋ค๋ฉด ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python]๋ฐฑ์ค 1992๋ฒ : ์ฟผ๋ํธ๋ฆฌ (0) | 2020.02.29 |
---|---|
[python]๋ฐฑ์ค 1074๋ฒ : Z (0) | 2020.02.21 |
[python]๋ฐฑ์ค 4811๋ฒ : ์์ฝ (1) | 2020.02.21 |
[python]๋ฐฑ์ค 2839๋ฒ : ์คํ ๋ฐฐ๋ฌ (0) | 2020.02.01 |
[python]๋ฐฑ์ค 9095๋ฒ : 1,2,3 ๋ํ๊ธฐ (0) | 2020.02.01 |
Comment