๋ฌธ์ : ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ ์ ๋ต [๋กํ์คํฐ๋ฒ] p6
๋ฌธ์
์ปค๋ค๋ ๊ณต์ฐ์ฅ์ ๋น๋ ค์ ๋ก ํ์คํฐ๋ฒ์ ๊ฐ์ตํ๋ ค๊ณ ํฉ๋๋ค. ์ด ํ์คํฐ๋ฒ์ ์ฌ๋ฌ ๋ ๋์ ์งํ๋๋ฉฐ, ํ๋ฃจ์ ํ ํ์ ๋ฐด๋๊ฐ ๊ณต์ฐ์ฅ์์ ์ฝ์ํธ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค. ์ ์ฒด ๋ฐด๋๋ฅผ ๋ช ํ ์ญ์ธํ ์ง๋ ์์ง ๊ฒฐ์ ํ์ง ์์์ง๋ง, ํ์คํฐ๋ฒ์ ๊ฐํ ์คํ์ธ L๊ฐ์ ํ์ ์ด๋ฏธ ์ญ์ธ๊ฐ ๋๋ ์ํ์ ๋๋ค. ๋ฐ๋ผ์ ํ์คํฐ๋ฒ์ ์ต์ L์ผ ์ด์ ์งํํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฒ์ ์ฌ์ฉํ ๊ณต์ฐ์ฅ์ ํ๋ฃจ ๋น๋ฆฌ๋ ๋ฐ ๋๋ ๋น์ฉ์ด ๋งค์ผ ๋งค์ผ ๋ค๋ฆ ๋๋ค. ๋๋ฌธ์ ๊ณต์ฐ ์ผ์ ์ ์ ์ ํด์ ๊ณต์ฐ์ฅ ๋์ฌ ๋น์ฉ์ ์ค์ด๋ ค๊ณ ํฉ๋๋ค. ์์ผ๋ก N์ผ๊ฐ์ ๊ณต์ฐ์ฅ ๋์ฌ ๋น์ฉ์ ์๊ณ ์๋ค๊ณ ํฉ์๋ค. ์ด ์ค L์ผ ์ด์์ ์ฐ์ํด์ ๋์ฌํ๋, ๊ณต์ฐ์ฅ์ ํ๋ฃจ ๋น๋ฆฌ๋ ๋ฐ ๋๋ ํ๊ท ๋น์ฉ์ ์ต์ํํ๋ ค๋ฉด ์ด๋ป๊ฒ ๊ณต์ฐ์ฅ์ ๋น๋ ค์ผ ํ ๊น์?
์๋ฅผ ๋ค์ด ์์ผ๋ก 6์ผ๊ฐ ๊ณต์ฐ์ฅ์ ๋น๋ฆฌ๋ ๋ฐ ๋๋ ๋น์ฉ์ด ๊ฐ {3, 1, 2, 3, 1, 2}๋ผ๊ณ ํฉ์๋ค. ์ด๋ฏธ ์ธ ํ์ ์ญ์ธํ๋ค๊ณ ํ๋ฉด, 3์ผ ๋์ 4์ผ ๋์ ๊ณต์ฐ์ ์งํํด์ ํ๊ท ๋น์ฉ์ ๋ ์ ๋ ดํ๊ฒ ํ ์ ์์ต๋๋ค. 3์ผ ๋์์ ํ๊ท ๋์ฌ ๋น์ฉ์ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ 2์ผ์งธ๋ถํฐ 4์ผ์งธ๊น์ง ๊ณต์ฐ์ฅ์ ๋์ฌํ๋ ๊ฒ์ธ๋ฐ, ์ด ๋ ํ๋ฃจ ํ๊ท (1+2+3)/3 = 2์ ๋น์ฉ์ด ๋ญ๋๋ค. ๋ฐ๋ฉด 2์ผ์งธ๋ถํฐ 5์ผ์งธ๊น์ง ๊ณต์ฐ์ฅ์ ๋์ฌํ๋ฉด ํ๊ท ๋น์ฉ์ด (1+2+3+1)/4 = 7/4๋ฐ์ ๋์ง ์์ต๋๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ์ C (C ≤ 100)๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์๋ ๊ณต์ฐ์ฅ์ ๋์ฌํ ์ ์๋ ๋ ๋ค์ ์ N (1 ≤ N ≤ 1000)๊ณผ ์ด๋ฏธ ์ญ์ธํ ๊ณต์ฐ ํ์ ์ L (1 ≤ L ≤ 1000, L ≤ N)์ด ์ฃผ์ด์ง๋๋ค. ๊ทธ ๋ค์ ์ค์๋ N๊ฐ์ ์ซ์๋ก ๊ณต์ฐ์ฅ ๋์ฌ ๋น์ฉ์ด ๋ ์ง๋ณ๋ก ์ฃผ์ด์ง๋๋ค. ๋ชจ๋ ๋น์ฉ์ 100 ์ดํ์ ์์ฐ์์ ๋๋ค.
์ถ๋ ฅ
์ ๋ ฅ์ ์ฃผ์ด์ง๋ ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ํ ์ค์ ์ต์์ ํ๊ท ๋์ฌ ๋น์ฉ์ ์ถ๋ ฅํฉ๋๋ค. 10-7 ์ดํ์ ์ ๋/์๋ ์ค์ฐจ๊ฐ ์๋ ๋ต์ ์ ๋ต ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋์ ๋ต
1๋ฒ์งธ ๋ต
์ฒ์์๋ ๋จ์ํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํด๋ณด๋ ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ฌ์ฉํด๋ณผ๊น ์๊ฐํด๋ดค๋ค. (๋จ์, ๋ฌด์ํ๊ฒ ํ ์ ์์๊น?) ํ์ง๋ง, test case ์๋ 100๊ฐ์ผ ๋ฟ๋๋ฌ ๋์ฌํ ์ ์๋ ๋ ์ ์๊ฐ ์ต๋ 1000์ผ์ด๊ธฐ ๋๋ฌธ์ ํ๋ค๊ฒ ๋ค๊ณ ์์ํ๋ค. ์๋์ ์ฝ๋๋ ์์ ๊ทธ๋ฆผ์ฒ๋ผ sliding window ๋ฐฉ์์ผ๋ก ์ฎ๊ฒจ๊ฐ๋ฉฐ ๋ชจ๋ ํ๊ท ์ ๊ณ์ฐํ๋ ์ฝ๋์ด๋ค.
for i in range(1,len(Day)): => Day-team์ผ๋ก ๊ณ ์ณ์ผํจ...
for j in range(0,len(Day)-i+1):
for k in range(j,j+i):
result += expense[k]
result /= i
if ex_min > result:
ex_min = result
์ด ์ฝ๋์ ๋ณต์ก๋๋ O(N^3) ์ด๋ฏ๋ก ์ข์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์, ๋ ๋น ๋ฅด๊ฒ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ์ ์์๊น ์๊ฐํด๋ณด๋ค๊ฐ
ํ๊ท ์ ๊ณ์ฐํ๊ณ ๋์๋ฅผ ๋น๊ตํ๋ ๊ฒ๊ณผ ํฉ์ ๊ณ์ฐํ๊ณ ๋์๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด ๋ ์ ์๊ฐ ๊ฐ์ ๋๋ ์ฐจ์ด๊ฐ ์๋ค
๋ ๊ฒ์ ๊นจ๋ซ๊ณ , ๊ฐ์ ๋ ์ ์๋ฅผ ๋น๊ตํ ๋๋ ํฉ๋ง ๊ณ์ฐํด์ ๋น๊ตํ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ๋๋์
์ฐ์ฐ์ด ๋ช ๋ฒ ๋น ์ก์ ๋ฟ ๋ฐ๋ณต๋ฌธ์ ํ์์ฐจ์ด์๋ ๊ธฐ์ฌํ์ง ๋ชปํ๋ฏ๋ก ๋ณต์ก๋๋ ๊ฐ์๋ค.
2๋ฒ์งธ ๋ต
๊ณ์ ์๊ฐํด๋ณด๋ ์ค, ๊ณ์ฐํด์ผํ๋ ๋ ๋ค์ ์๋ฅผ ์ค์ฌ๋ณด๋ฉด ์ด๋จ๊น ์ถ์๋ค. day๊ฐ 7์ด๊ณ team์ด 5์ผ ๋, ์ต์ 5ํ์ด ํ์คํฐ๋ฒ์ ์ฐธ์ฌํ๋ฏ๋ก 5๊ฐ์ ๋น์ฉ์ ๋ฌถ์ ๊ฒฝ์ฐ๋ถํฐ ๊ณ์ฐ์ ํด์ผํ๋ค. ์ด ๋, 5์ผ ํ์คํฐ๋ฒ์ ์งํํ ๋ ๊ฐ์ฅ ํ๊ท ์ด ์ ์ ์ฐ์๋ ๋ ์ ๊ตฌํ๋ ค๋ฉด ๋ํด์ ํ๊ท ๋ด๊ธฐ๋ณด๋ค ๋ ์ ์ ์์ธ ๋จ์ 2์ผ์ ํฉ์ด ํฐ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ฅด๋ฉด ๋๋ค. ์์ ๊ทธ๋ฆผ์์๋ ์ค๊ฐ์ ๊ฒฝ์ฐ(2๋ฒ์งธ ๊ฒฝ์ฐ)๊ฐ 4๋ก ๊ฐ์ฅ ํฌ๋ฏ๋ก ๋น์ฉ์ ์ดํฉ์ด ๊ฐ๋ค๋ ์ ์ ํ์ ๋จ์ ๋ ๋ค์ ํฉ์ด ์ค๊ฐ์ ๊ฒฝ์ฐ๊ฐ ๊ฐ์ฅ ์๋ค๋ ๊ฑธ ์ ์ ์๋ค.
์ฝ๊ฒ ๋งํด์, ๋ง์ ์์ ๊ณ์ฐ์ด ํ์ํ ์ต์ํ ๋ฌธ์ ๋ฅผ ์ ์ ์์ ๊ณ์ฐ์ผ๋ก ๊ฐ๋ฅํ ์ต๋ํ ๋ฌธ์ ๋ก ๋ง๋ค์๋ ๊ฒ์ด๋ค. ์ด๋ team์ด 1์ผ ๋ ๋์ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋น์ทํ ์ฑ๋ฅ์ ๋ด๊ณ , team์ด ์ปค์ง ์๋ก ํจ์จ์ด ์ปค์ง๋ค. ํ์ง๋ง ๊ถ๊ทน์ ์ผ๋ก for๋ฌธ์ ์๋ฅผ ์ค์ด์ง ๋ชปํ์ผ๋ฏ๋ก ์ญ์ ์๊ฐ๋ณต์ก๋๋ ๊ฐ์๋ค.
# ๋กํ์คํฐ๋ฒ
# 2020-02-04
testcase = int(input())
ex_min = [] # testcase ๊ฐ๊ฐ์ ์ต์๊ฐ๋ค์ ๋ด์๋๋ ํ๋ ฌ
for case in range(0,testcase): # testcase
dayteam = input() # ๋ฌธ์์ด๋ก ๋ฐ๊ธฐ
expense= input()
Expense = [] # ํด๋น ๋ ์ง์ ๊ธ์ก
Day = int() # ๋ ๋ค์ ์
Team = int() # ์ด๋ฏธ ์ญ์ธํ ํ์ ์
ex_sum = int() # ์กด์ฌํ๋ ๋ ์ง์ ๊ธ์ก ์ดํฉ
obj_index = int() # ๊ณต๋ฐฑ index ์ฝ๊ธฐ
obj_index_bf = int(0) # ์ด์ index ์ฝ๊ธฐ
# ๊ณต๋ฐฑ ๊ธฐ์ค์ผ๋ก '๋ ์', '์ญ์ธ๋ ํ ์' ๋์ด์ฝ๊ธฐ
for index in range(0,len(dayteam)):
if dayteam[index]==" ":
obj_index = index
Day = int(dayteam[:obj_index])
Team = int(dayteam[obj_index:])
# ๊ณต๋ฐฑ ๊ธฐ์ค์ผ๋ก '๊ธ์ก' ๋์ด์ฝ๊ธฐ
for index in range(0,len(expense)):
if expense[index]==" ":
obj_index = index
Expense.append(int(expense[obj_index_bf:obj_index]))
obj_index_bf = obj_index
elif index == len(expense)-1:
Expense.append(int(expense[obj_index_bf:]))
# ๊ธ์ก์ ํฉ ๊ณ์ฐ
for index in range(0,len(Expense)):
ex_sum+=Expense[index]
ex_min.append(ex_sum/Day)
for i in range(1,Day-Team+1): # ๋จ๋ ๋ฐฐ์ด์ ์ด์ฉํด์
tmp = 0
for j in range(0,i): # ํฉ์ด ๊ฐ์ฅ ํฐ ๋ฐฐ์ด ์ฐพ๊ธฐ => ๋๋จธ์ง์ ํฉ์ ๊ฐ์ฅ ์์ ๋ฐฐ์ด
result = 0
for k in range(0,j):
result += Expense[k]
for k in range(Day-i+j,Day):
result += Expense[k]
if result>=tmp:
tmp = result
mean = (ex_sum-tmp)/(Day-i) # ๋ฏธ๋ฆฌ ๊ณ์ฐํด๋ ์ด ํฉ - ๋จ๋ ๋ฐฐ์ด์ ํฉ
if ex_min[case] >= mean:
ex_min[case] = mean
else:
continue
for case in range(0,testcase):
print(ex_min[case])
๋ค๋ฅธ ๋ต
๊ฒฐ๊ตญ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฐพ์๋ณด๊ณ ๊ฒฐ๋ก ์ ๋ด์๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ณต๋๋ ๊ณ์ฐ์ ์ค์ด๊ณ ์ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ์์๋ฅผ ํ๋์ฉ ๋ํด๊ฐ๋ฉฐ ๊ณ์ฐํ๋ ๋ฐฉ์์ด๋ค. ๋ ์ ์๋ฅผ ์ผ์น์์ผ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋๋ ํ, ๊ฒฝ์ฐ์ ์์์ ์ต์๊ฐ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ ๋๋ ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ณด๊ณ ๊นจ๋ฌ์๋ค. ์ํ์ ์ผ๋ก ์๊ฐํ๋ค๊ฐ ํ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๊ต์ฅํ ๋ง์๋ฐ ์ด๋ฒ์๋ ๊ทธ๋ฐ ๊ฒฝ์ฐ์ธ๊ฑฐ ๊ฐ๋ค.
# ๋กํ์คํฐ๋ฒ
# 2020-02-04
testcase = int(input())
ex_min = [] # testcase ๊ฐ๊ฐ์ ์ต์๊ฐ๋ค์ ๋ด์๋๋ ํ๋ ฌ
for case in range(0,testcase): # testcase
dayteam = input() # ๋ฌธ์์ด๋ก ๋ฐ๊ธฐ
expense= input()
Expense = [] # ํด๋น ๋ ์ง์ ๊ธ์ก
Day = int() # ๋ ๋ค์ ์
Team = int() # ์ด๋ฏธ ์ญ์ธํ ํ์ ์
ex_sum = int() # ์กด์ฌํ๋ ๋ ์ง์ ๊ธ์ก ์ดํฉ
obj_index = int() # ๊ณต๋ฐฑ index ์ฝ๊ธฐ
obj_index_bf = int(0) # ์ด์ index ์ฝ๊ธฐ
# ๊ณต๋ฐฑ ๊ธฐ์ค์ผ๋ก '๋ ์', '์ญ์ธ๋ ํ ์' ๋์ด์ฝ๊ธฐ
for index in range(0,len(dayteam)):
if dayteam[index]==" ":
obj_index = index
Day = int(dayteam[:obj_index])
Team = int(dayteam[obj_index:])
# ๊ณต๋ฐฑ ๊ธฐ์ค์ผ๋ก '๊ธ์ก' ๋์ด์ฝ๊ธฐ
for index in range(0,len(expense)):
if expense[index]==" ":
obj_index = index
Expense.append(int(expense[obj_index_bf:obj_index]))
obj_index_bf = obj_index
elif index == len(expense)-1:
Expense.append(int(expense[obj_index_bf:]))
ex_min.append(int(987654321))
'''์ฃผ์์ฝ๋'''
for i in range(0,Day-Team+1): # ์์ index
tmp_sum=0
tmp_mean=0
for j in range(0,Team): # ์ต์ ๋ ์
tmp_sum+=Expense[i+j]
tmp_mean = tmp_sum/Team
if tmp_mean<=ex_min[case]:
ex_min[case]=tmp_mean
for j in range(Team,Day-i) : # ๊ณ์ฐํ ๋ ์
tmp_sum+=Expense[i+j]
if tmp_mean>tmp_sum/(j+1):
tmp_mean=tmp_sum/(j+1)
if tmp_mean<=ex_min[case]:
ex_min[case]=tmp_mean
'''์ฃผ์์ฝ๋'''
for case in range(0,testcase):
print(ex_min[case])
์ฃผ์์ฝ๋ ๋ถ๋ถ๋ง ๋ณด๋ฉด, i๋ ์์๋ค์ ํฉ ๊ณ์ฐ์ด ์์๋๋ index์ด๋ค. ์ฒซ๋ฒ์งธ j for๋ฌธ์ ์ฃผ์ด์ง Team์ ์ํด ๊ฒฐ์ ๋๋ฉฐ, index i๋ถํฐ ๊ฐ๋ฅํ ํ ๊ฐ์ฅ ์ ์ ๋ ๋์ ํ์คํฐ๋ฒ์ ์ฃผ์ตํ๋ค๊ณ ํ ๋ ๋ฐ์ํ๋ ๋น์ฉ์ ํ๊ท ์ ๊ณ์ฐํ๋ ์ฝ๋์ด๋ค. ๋ค์ j for๋ฌธ์ ์ฃผ์ด์ง ์ต์์ ๋ ์ด์ ํ์คํฐ๋ฒ์ ์ฃผ์ตํ๋ค๊ณ ํ ๋์ ๊ฒฝ์ฐ๋ฅผ ๋ํ๋ธ๋ค.
์ด์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ง๊ณ ์ฝ๋๋ฅผ ์ง๋ณด๋ index๊ฐ ํท๊ฐ๋ ค์ ๊ฐ๋จํ๊ณ ์ ์ ์์ ์ฝ๋๋ฅผ ์ง๋๋ฐ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ฆฌ๊ธดํ๋ค. ์ค์ํ ๊ฑด ์๊ฐ ๋ณต์ก๋๊ฐ ์ค์๋ค๋ ๊ฒ์ด๋ค. for๋ฌธ์ด ํ๋ ์ฌ๋ผ์ง์ผ๋ก ์ธํด์ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฐ์ํ์๊ณ , ์์ง๊น์ง๋ ๋ ๋์ ์๊ณ ๋ฆฌ์ฆ์ ์ฐพ์ง ๋ชปํ์๋ค.
๊ฒฐ๋ก
์ํ์ ์ผ๋ก ์๊ฐํ๊ธฐ ์ ์, ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ ์๊ฐ์ ํ์.
Comment