์ด ๋ฌธ์ ๋ ํญ๊ตฌ์์ N๊ฐ์ ํฌ๋ ์ธ์ผ๋ก M๊ฐ์ ํ๋ฌผ์ ์ฎ๊ฒจ์ผํ๋ ๋ฌธ์ ์ด๋ค.
์ด ๋ ๊ฐ ํ๋ฌผ์ ๋ฐ์ค ์์ ๋ฃ์ด์ ธ ์์ผ๋ฏ๋ก 'ํ๋ฌผ==๋ฐ์ค'๋ก ๋์ผ์ํ๊ฒ ๋ค.
๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
1. M๊ฐ์ ๋ฐ์ค์ N๊ฐ์ ํฌ๋ ์ธ์ด ์๋ค.
2. ์
๋ ฅ์ผ๋ก ๊ฐ ๋ฐ์ค์ ๋ฌด๊ฒ์ ๊ฐ ํฌ๋ ์ธ์ ๋ฌด๊ฒ ์ ํ์ด ์ฃผ์ด์ง๋ค.
3. ํฌ๋ ์ธ์ ํ๋ฒ์ ๋ฌด๊ฒ ์ ํ์ ์ด๊ณผํ์ง ์๋ ๋ฐ์ค ํ๋๋ง ์ด๋ฐํ ์ ์๋ค.
4. ๋ชจ๋ ํฌ๋ ์ธ์ ๋์์ ์์ง์ด๊ณ , ํ๋ฒ ๋ฌผ๊ฑด์ ์ฎ๊ธฐ๋๋ฐ 1๋ถ์ด ๊ฑธ๋ฆฐ๋ค.
์ถ๋ ฅํด์ผํ๋ ๊ฐ์ ๋ชจ๋ ๋ฐ์ค๋ฅผ ๋ฐฐ๋ก ์ฎ๊ธฐ๋๋ฐ ๋๋ ์๊ฐ์ ์ต์๊ฐ์ด๊ณ , ๋ชจ๋ ๋ฐ์ค๋ฅผ ๋ฐฐ๋ก ์ฎ๊ธธ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค
def canContinue(canMove):
for cm in canMove:
if cm == True:
return True
return False
def getCanCarryBoxIndex(craneWeight, boxs):
if craneWeight < boxs[len(boxs) - 1]:
return -1
for i, boxWeigth in enumerate(boxs):
if craneWeight >= boxWeigth:
return i
# ์
๋ ฅ ----------------------------------------
N = int(input()) # ํฌ๋ ์ธ์ ๊ฐ์
cranes = list(map(int, input().split())) # ๊ฐ ํฌ๋ ์ธ์ ๋ฌด๊ฒ์ ํ
M = int(input()) # ๋ฐ์ค์ ๊ฐ์
boxs = list(map(int, input().split())) # ๊ฐ ๋ฐ์ค์ ๋ฌด๊ฒ
# --------------------------------------------
cranes.sort(reverse=True)
boxs.sort(reverse=True)
canMove = [True] * N
mins = 0
while True:
mins += 1
# part 1
for i in range(N):
if len(boxs) == 0:
break
if canMove[i] == True:
idx = getCanCarryBoxIndex(cranes[i], boxs)
if idx == -1:
canMove[i] = False
else:
del boxs[idx]
# part 2
if len(boxs) == 0: # ๋ ์ด์ ์ฎ๊ธธ ๋ฐ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
break
if canContinue(canMove) == False: # ๋ชจ๋ ๋ฐ์ค๊ฐ ํฌ๋ ์ธ์ ์ ํ ๋ฌด๊ฒ๋ฅผ ์ด๊ณผํ์ฌ ๋ฐ์ค๋ฅผ ์ฎ๊ธธ ์ ์๋ ๊ฒฝ์ฐ
mins = -1
break
print(mins)
์ฃผ์ ์์ด๋์ด๋ ๋ฐ์ค๊ฐ ์ฎ๊ฒจ์ง๋ฉด ์ฎ๊ฒจ์ง ๋ฐ์ค๋ ๋ฆฌ์คํธ์์ ์ ๊ฑฐํ๋ ๊ฒ์ด๋ค.
๋ฐ์ค๋ฅผ ๋ฆฌ์คํธ์์ ์์ ์ ๊ฑฐํ๋ฉด ๋ค์๋ฒ ์ฎ๊ธธ ๋ฐ์ค๋ฅผ ํ์ํ ๋ ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ ์งง์์ง๋ฏ๋ก ํ์ ์๊ฐ์ด ์ ์ ์ค์ด๋ค ๊ฒ์ด๋ผ๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ด์ฌ์์๋ del list[i]
์ ๊ฐ์ด del ๋ช
๋ น์ด๋ฅผ ํตํด i๋ฒ์งธ์ ํด๋นํ๋ ์์ดํ
์ ๋ฆฌ์คํธ์์ ์ ๊ฑฐํ ์ ์๋ค.
(1) ์
๋ ฅ ์ดํ ์ฒซ๋ฒ์งธ๋ก ์ํํ๋ ๊ฒ์ cranes
์ boxs
๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ๊ฒ์ด๋ค. ์ด๋ ๋ฌด๊ฒ๊ฐ ํฐ ๋ฐ์ค๋ถํฐ ์ด๋์ํค๊ธฐ ์ํจ์ด๋ค.
(2) ๋ค์์ผ๋ก ํฌ๊ธฐ๊ฐ N์ธ canMove
๋ฐฐ์ด์ ๋ชจ๋ True๋ก ์ด๊ธฐํ ์ํจ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์ด์ ํ๋ฌผ์ ์ฎ๊ธธ ์ ์๋ ํฌ๋ ์ธ์ธ ๊ฒฝ์ฐ, ํด๋น ํฌ๋ ์ธ์canMove
๊ฐ์ False๋ก ์ง์ ํด ์ค๋ค. ๋ ์ด์ ํ๋ฌผ์ ์ฎ๊ธธ ์ ์๋ ํฌ๋ ์ธ์ ํ๋จ ์กฐ๊ฑด์ ๋จ์ ๋ฐ์ค๋ค์ด ๋ชจ๋ ์์ ์ ๋ฌด๊ฒ์ ํ์ ์ด๊ณผํ ๊ฒฝ์ฐ์ด๋ค.
(3) mins
๋ ์ด ์์๋๋ ์๊ฐ์ด๊ณ , ๋ฐ๋ณต๋ฌธ์ ํ ์ฌ์ดํด๋ง๋ค 1์ฉ ์ฆ๊ฐํ๋ค.
(4) ํ ์ฌ์ดํด์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ค๋ช ํ ์ ์๋ค.
๋จผ์ , part 2๋ while๋ฌธ์ escape ์กฐ๊ฑด์ด๋ค.
if len(boxs) == 0:
๋ ์ด์ ์ฎ๊ธธ ๋ฐ์ค๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฐ์ค๋ฅผ ๋ค ์ฎ๊ฒผ์ผ๋ฏ๋ก break๋ฅผ ํตํด ๋ฐ๋ณต๋ฌธ์ ํ์ถํ๊ณ ์์ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
if canContinue(canMove) == False:
์ฎ๊ธธ ๋ฐ์ค๊ฐ ๋จ์ ์์ง๋ง ๋จ์์๋ ๋ชจ๋ ๋ฐ์ค๊ฐ ํฌ๋ ์ธ์ ์ ํ ๋ฌด๊ฒ๋ฅผ ์ด๊ณผํ์ฌ ๋ฐ์ค๋ฅผ ์ฎ๊ธธ ์ ์๋ ํฌ๋ ์ธ์ด ์์ ๋, ๋ฐ๋ณต๋ฌธ์ ํ์ถํ๊ณ -1์ ์ถ๋ ฅํ๋ค.
part 1: ๊ฐ ํฌ๋ ์ธ์ ๋ํด ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋๋ฐ, ํฌ๋ ์ธ์ ์์ง์ผ ์ ์๋ค๋ฉด getCanCarryBoxIndex
ํจ์๋ฅผ ํตํด ์ฎ๊ธธ ๋ฐ์ค์ ์ธ๋ฑ์ค๋ฅผ ์์๋ธ๋ค. ์ฎ๊ธธ ์ ์๋ ๋ฐ์ค๊ฐ ์์ผ๋ฉด ํด๋น ํฌ๋ ์ธ์ canMove ๊ฐ์ False๋ก ๋ฐ๊พธ๊ณ , ์ฎ๊ธธ ์ ์๋ ๋ฐ์ค๊ฐ ์์ผ๋ฉด ํด๋น ์ธ๋ฑ์ค์ ๋ฐ์ค๋ฅผ ๋ฆฌ์คํธ์์ ์ ๊ฑฐํ๋ค.