Skip to content

wjddn279/Algorithms

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

94 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Algorithm ๋ฌธ์ œ ํ’€ ๋•Œ, ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ

  • ๋ฐฐ์—ด์„ ์•ž์œผ๋กœ ๋ถ™์ด๋Š” ๊ฑด ๋ง์ด ์•ˆ๋จ
# ๋‚˜๋ฌด ์ œํ…Œํฌ 16235๋ฒˆ
# ๋ฌด์–ธ๊ฐ€ ์ƒˆ๋กœ ๋“ค์–ด์˜ค๋Š” ์ˆ˜๊ฐ€ 1์ด๊ณ , ๊ณ„์† ๋Š˜์–ด๋‚œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
# ๊ทธ๋ ‡๋‹ค๋ฉด ๋”ฐ๋กœ ์ •๋ ฌ์„ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋’ค๋‚˜ ์•ž์— ๋„ฃ์–ด ์ฃผ๋ฉด ํฌ๊ธฐ์˜ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ
# ๊ทธ๋Ÿด๋•Œ ์ƒˆ๋กœ์šด ์ˆ˜๋ฅผ ์•ž์œผ๋กœ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋’ค๋กœ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ,

list = [3,4,5] 
list = [0 for _ in range(leng)] + [3,4,5]

list = [5,4,3]
list = list + [0 for _ in range(leng)]

# ์ด ๋‘๊ฐœ์˜ ์†๋„ ์ฐจ์ด๋Š” ์–ด๋งˆ์–ด๋งˆ ํ•˜๋ฏ€๋กœ ๋ฌด์กฐ๊ฑด ํ›„์ž์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ž.
# why? ์ „์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ „์ฒด๋ฅผ ๋ฐ”๊ฟ”์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • N X N ํ–‰๋ ฌ์„ ํƒ์ƒ‰ํ•  ๋•Œ, visited ๋Š” N ์ด ์ž‘์„ ๋•Œ๋Š” 1์ฐจ์› ๋ฐฐ์—ด์œผ๋กœ ํ•˜๊ณ , N ์ด ํด ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด 2์ฐจ์› ๋ฐฐ์—ด ๋ฐฉ๋ฌธ์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค.
# 1์ฐจ์› visited, N > 100 ์ผ๋•Œ ์‚ฌ์šฉ์„ ํ•˜์ง€๋ง์ž
visited = []
# ๋ฐฉ๋ฌธํ–ˆ์„ ์‹œ
visited.append((nx,ny))
# ๋ฐฉ๋ฌธ ๊ฒ€์‚ฌ 
if (nx,ny) not in visited:

    
# 2์ฐจ์› visited
visited = [[0 for _ in range(M)] for _ in range(N)]
# ๊ผญ 2์ฐจ์› ์ผ ํ•„์š” ์—†์Œ ๊ฐ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 3์ฐจ์›,4์ฐจ์›๋„ ๊ฐ€๋Šฅ
# ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ visited๊ฐ€ ๋ณ€๊ฒฝ์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (ex ๋น„ํŠธ๋งˆ์Šคํ‚น ๋ฌธ์ œ)
  • Deepcopy๋Š” ์‚ฌ์šฉ ์ž์ œํ•˜์ž.
from copy import deepcopy

# ๋”ฅ์นดํ”ผ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์ •๋ง ์™ ๋งŒํ•˜๋ฉด ์‚ฌ์šฉ ์•ˆ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
# ํ•˜์ง€๋งŒ ์–ธ์ œ์จ์•ผํ•˜๋А๋ƒ? -> ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ฐ”๋€”๋•Œ๋Š” ์‚ฌ์šฉํ•ด์•ผํ•จ
# ์ฆ‰ bfs์‹œ ๊ทธ๋ž˜ํ”„๊ฐ€ ์™„์ „ํžˆ ๋ฐ”๋€Œ์–ด ๋ฒ„๋ ค ๊ฐ queue๋งˆ๋‹ค ๊ทธ๋ž˜ํ”„๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฐ€์•ผํ• ๋•Œ
# ex) ๋ฐฑ์ค€ ์ฒญ์†Œ๋…„ ์ƒ์–ด 

# ๊ทธ๋ž˜ํ”„๊ฐ€ ์™„์ „ํžˆ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์šฉํ•˜์ง€๋ง๊ณ  visited๋ฅผ ์‚ฌ์šฉํ•˜์ž.
# ๊ฐ ๊ฒฝ์šฐ๋งˆ๋‹ค ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๋•Œ๋งˆ๋‹ค visited๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฒดํฌํ•˜๋ฉด ๋จ
# ex) ๋ฐฑ์ค€ ์—ฐ๊ตฌ์†Œ3
  • 0718 ๋ฐฑ์ค€ ๊ตฌ์Šฌ ํƒˆ์ถœ 2
# ๋ฐฑ์ค€ ๊ตฌ์Šฌ ํƒˆ์ถœ 2
# ์ตœ๋Œ€ํ•œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค์ •ํ•˜๊ณ  ๊ฐ€์ž.
# ์–ด๋ ต๊ณ  ๊ณ ๋ คํ•ด์•ผํ•  ์กฐ๊ฑด์ด ๋งŽ์•„ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ๋‹ˆ๊นŒ ๋‹ค์‹œ ํ’€์–ด๋ณด๋ฉด ์ข‹์Œ

# 10๋ฒˆ ์ดํ•˜๋กœ ์›€์ง์—ฌ์„œ ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ผ ์ˆ˜ ์—†์œผ๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค
r_x,r_y,b_x,b_y,cnt = queue.popleft()
if cnt > 10:
    return -1
# ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ‹€๋ฆผ why? ์ €๋ ‡๊ฒŒ ํ•˜๋ฉด cnt๊ฐ€ 10์ธ ๊ฒฝ์šฐ, ์ฆ‰ ๊ทธ r_x,r_y์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด 10๋ฒˆ ์›€์ง์ธ ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋ฏธ ์‹คํŒจ
# ๋งŒ์ผ ์ € ์ƒํƒœ์—์„œ ๋‹ต์„ ์ฐพ์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ 11๋กœ ๋‚˜์˜ด 

r_x,r_y,b_x,b_y,cnt = queue.popleft()
if cnt > 9:
    return -1
# ์ด๋ ‡๊ฒŒ ํ•ด์ค˜์•ผ ์ตœ๋Œ€ ๊ฒฐ๊ณผ ๊ฐ’์ด 10์ด ๋‚˜์˜ด
# ์‹œ๋„ํ–ˆ์„ ๋‹น์‹œ ํ‹€๋ ธ๋˜ ํฌ์ธํŠธ๋“ค:
# 1. ๊ธธ์ด๊ฐ€ ์ˆซ์ž๊ฐ€ 1์ธ ๊ฒฐ๊ณผ๋ฅผ ์ฒดํฌํ•˜์ง€๋ชปํ•˜๊ณ  2๋กœ ์ถœ๋ ฅํ•˜๊ฒŒ ํ–ˆ์Œ.
# 2. 1์ธ ๊ฒฐ๊ณผ๋Š” ์ฒดํฌํ•˜๋‚˜ ๋งˆ์ง€๋ง‰ ์ˆซ์ž๋‚˜ ์ฒซ๋ฒˆ์งธ ์ˆซ์ž๊ฐ€ ๊ฒฐ๊ณผ๊ฐ€ 1์ธ ์ตœ์†Œ๊ฐ’์„ ๋•Œ๋ฅผ ๊ณจ๋ผ๋‚ด์ง€ ๋ชปํ•จ.
# 3. corner case์—์„œ ์ข€ ๋” ๋””ํ…Œ์ผํ•œ ๊ตฌํ˜„์ด ํ•„์š”ํ•จ.

start, end = 0, 0
sub_sum = matrix[0]
result = N+1
while True:
    if start == end:
        # result ๊ฐ€ 1์ด ๋˜์–ด๋ฒ„๋ฆฌ๋ฉด ๋’ค์—๊ฒƒ ๋ณผ ํ•„์š” ์—†์Œ
        if sub_sum >= S:
            result = 1
            break
        # ๋‘˜ ๋‹ค ๋์— ๋„๋‹ฌํ•˜๋ฉด break
        if end == N - 1 and start == N - 1:
            break
        # ์•„๋‹ˆ๋ผ๋ฉด end๋ฅผ ํ•œ์นธ ์•ž์œผ๋กœ ๋ณด๋‚ด์•ผ ํ•จ
        else:
            end += 1
            sub_sum += matrix[end]
    # ๋ถ€๋ถ„ํ•ฉ์ด ๊ธฐ์ค€๋ณด๋‹ค ํฌ๋ฉด start๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ๋•ก๊ฒจ์ฃผ๊ณ  ๋ถ€๋ถ„ํ•ฉ์—์„œ ์ „์— ๊ฐ’ ๋นผ์คŒ
    elif S <= sub_sum:
        result = min(result,end-start+1)
        sub_sum -= matrix[start]
        start += 1
    # ๋ถ€๋ถ„ํ•ฉ์ด ๊ธฐ์ค€๋ณด๋‹ค ์ž‘๋‹ค๋ฉด end๋ฅผ ์•ž์œผ๋กœ ํ•œ์นธ ๋•ก๊ฒจ์ฃผ๊ณ  ๋ถ€๋ถ„ํ•ฉ์—์„œ ๋‚˜์ค‘ ๊ฐ’ ๋”ํ•ด์คŒ
    else:
        if end < N-1:
            end += 1
            sub_sum += matrix[end]
        # ๋งŒ์ผ end๊ฐ€ N-1์— ๋„์ฐฉํ–ˆ์ง€๋งŒ start๋Š” ๋„๋‹ฌ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ๊ณ  ๊ธฐ์ค€ ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค?
        # start๋ฅผ ๋๊นŒ์ง€ ๋•ก๊ฒจ์ค„ ํ•„์š”๋„ ์—†์ด ๋๋‚ด๋„ ๋จ, ์–ด์ฐจํ”ผ ๋ถ€๋ถ„ํ•ฉ์€ ์ž‘์•„์ง€๊ธฐ๋งŒ ํ•˜๊ธฐ๋•Œ๋ฌธ
        else:
            break
  • 0719 ๋ฐฑ์ค€ ๋ฏธ๋กœํƒˆ์ถœํ•˜๊ธฐ
# point ์–ด์ฐจํ”ผ ๋ฐฉํ–ฅ์ด ์ •ํ•ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘์  ์ฐพ๋Š” ํฌ์ธํŠธ๋ฅผ ํ•œ๋ฒˆ๋งŒ ๋Œ์•„ ์ค˜๋„ ์ƒ๊ด€ ์—†์Œ
# why? ๊ทธ๋•Œ ๊ฐ€๋ฉด ๋Œ์•„์„œ ์ •ํ•ด์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
# ์–ด์ง€๊ฐ„ํ•œ bfs ๋ฌธ์ œ๋Š” visited๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•œ๋ฒˆ๋งŒ ๋Œ๊ฑฐ๋‚˜ ๋ฐฉ๋ฌธํ–ˆ๋˜ ์ง€์ ์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋„๋ก ํ•˜๋ฉด 100% ์‹œ๊ฐ„์ดˆ๊ณผ ๋‚จ.
# ์–ด๋– ํ•œ ํ˜•ํƒœ๋กœ๋˜์ง€ visited๋ฅผ ๋งŒ๋“ค์–ด ์ค˜์•ผํ•จ.
def search():
    for i in range(N):
        for j in range(M):
            if visited[i][j] == 0:
                return (i,j)
    return (-1,-1)   
result = 0
while True:
    x,y = search()
    if (x,y) == (-1,-1):
        print(result)
        break
    else:
        result += bfs(x,y)    

# ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ
# 1. ๋Œ๋‹ค๊ฐ€ visited ์ฒดํฌ๋œ ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ (๋ชป๊ฐ€๋‹ˆ๊นŒ ๋บ‘๋บ‘ ๋„๋Š” ๊ฒฝ์šฐ)
# 2. ์ด๋ฏธ ๋ชป๊ฐ„๋‹ค๊ณ  ํŒ๋ช…๋‚œ ๊ธธ์„ ๊ฐ€๋ผ๊ณ  ํ•  ๋•Œ

# ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•˜๋Š” ๊ฒฝ์šฐ
# 1. ์ง„์งœ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ (iswall = False)
# 2, ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋ช…๋‚œ ๊ธธ์„ ๊ฐ€๋ผ๊ณ  ํ• ๋•Œ

    elif visited[x][y] == 1:
        # ์ฒ˜์Œ์ด๋ฉด
        if flag:
            for i,j in step:
                visited[i][j] = -1
            return 0
        else:
            return cnt

 # ์ฒ˜์Œ์ผ๋•Œ๋งŒ ์ƒ๊ฐํ•ด์คฌ๋Š”๋ฐ ๊ทธ๊ฑด ์•„๋‹ˆ๊ณ  ์ „์ฒด์˜ ๊ฒฝ์šฐ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์ค˜์•ผํ•จ
# ์ฆ‰ 1์ธ ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋‚˜๋”๋ผ๋„ ๋‚ด๊ฐ€ ๊ฑธ์–ด์˜จ ๊ธธ์— ํฌํ•จ๋˜๋ฉด ํƒˆ์ถœ ๋ชปํ•˜๋Š” ๊ฑฐ์ž„
# ๊ทธ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ๋‹ค์Œ์— ํ’€๋•Œ๋Š” ์ƒ๊ฐํ•ด๋ณด์ž.
# ์ง€๊ธˆ์€ step์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Œ
  • 7/23 ๋ฐฑ์ค€ ๊ฐœ๋ฆฌ๋ฉ˜๋”๋ง 2
# ์‹œ๊ฐ„๋ณต์žก๋„??
# N < 50 ์ด๋ผ๋ฉด ์–ด์ง€๊ฐ„ํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ƒ๊ฐ ์•ˆํ•ด๋„ ๋˜๋Š” ๊ฒฝ์šฐ
# ์ด ๋ฌธ์ œ์—์„œ N<20์ด๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„ ๊ตฌํ•ด๋ณด์ž
# ๊ธฐ์ค€์ ์„ ๋ชจ๋“  ์ ์œผ๋กœ ํ•œ๋ฒˆ์”ฉ ํ•ด์ค˜์•ผ ํ•จ. -> 2์ค‘ for ๋ฌธ N * N
# ๊ทธ ์•ˆ์—์„œ d1,d2๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•จ. 
# ์ฒ˜์Œ ์ ‘๊ทผ d1,d2 ์™„์ „ํƒ์ƒ‰ -> ์‹œ๊ฐ„๋ณต์žก๋„ N * N
    for d1 in range(1,N):
        for d2 in range(1,N):
# ๊ทธ๋Ÿฌ๋‚˜ ์–ด์ฐจํ”ผ d1 + d2 < N ์ด๋ฏ€๋กœ ์•„๋ž˜๊ฐ€ ์ข€ ๋” ์ตœ์ ํ™”
    for d1 in range(1,N):
        for d2 in range(1,N-d1+1):

# 5๊ฐ€ ๋˜๋Š” ์œ„์น˜๋ฅผ ๋จผ์ € ์ •ํ•ด ์ค€ ๋’ค, ๋‚˜๋จธ์ง€ ๊ฒƒ์„ ์ฑ„์šฐ๋Š” ์‹์œผ๋กœ ํ–ˆ์Œ
# 5๊ฐ€ ๋˜๋Š” ์œ„์น˜๋Š” ๋Œ€์นญ์ด ์•„๋‹ˆ๋ฏ€๋กœ case๋ฅผ ๋‚˜๋ˆ ์„œ ํ•˜๋“œ์ฝ”๋”ฉ ํ•ด์ค˜์•ผ ํ•จ.
# ํŽœ์„ ์จ์„œ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜๋Š”๊ฒŒ ์ข‹์•„๋ณด์ž„
temp = r-x
if temp > d1:
    left = y -d1 + temp - d1
else:
    left = y - temp
if temp > d2:
    right =  y + d2 - (temp -d2)
else:
    right = y +temp

# ๊ฐ ์‹œ์ž‘์ , d1,d2 ์•ˆ์—์„œ r,c๋ฅผ ๊ฐ๊ฐ ๊ณ„์‚ฐํ•ด์ค˜์•ผ ํ•จ ์‹œ๊ฐ„ ๋ณต์žก๋„ * N * N
# ๋”ฐ๋ผ์„œ ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n) = N ^ 6 = 20 ^ 6 = 6400๋งŒ ์•ฝ 0.64์ดˆ ์ด๋ฏ€๋กœ OK
# ๋ฌด์‹ํ•œ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ข€ ๋” ๋””ํ…Œ์ผ ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•˜๊ณ  ์„ค๊ณ„ํ•˜์ž
  • 0728 ๋ฐฑ์ค€ ๋“œ๋ž˜๊ณค์ปค๋ธŒ
# ๊ธฐ์ค€์  ๋งŒ๋“œ๋Š”๊ฑฐ ์ข€ ์ž˜ํ•œ๋“ฏ?
# critical point -> ์ง€๊ธˆ ์‹œ์ž‘์ ์ด ๋ณ€๊ฒฝ๋ผ์„œ ๊ฐ„ ๊ณณ์ด ์ œ์ผ ๋จผ๊ณณ์ด๊ณ , ๊ธฐ์ค€์ ์ด ๋œ๋‹ค.
x_cri,y_cri = step[-1]
length = len(step)-1
for st in range(length,-1,-1):
    # 90๋„ ํšŒ์ „์˜ ์˜๋ฏธ -> ์›์ ์ด ์‹œ์ž‘์ ์œผ๋กœ ๋ฐ”๋€๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž.
	# x,y๋Š” 90๋„ ํšŒ์ „ ์‹œํ‚ฌ ์ขŒํ‘œ x_cri,y_cri๋Š” ๊ธฐ์ค€์ 
	# x_var, y_var์€ ๊ฐ ์ขŒํ‘œ๊ฐ€ ์›์ ์— ์žˆ์„๋•Œ๋กœ ์น˜ํ™˜ํ•œ ์ขŒํ‘œ
	# ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „ -> x์— ์ขŒํ‘œ์— y๋ณ€ํ™”๋Ÿ‰ ๋”ํ•˜๊ณ  y์ขŒํ‘œ์— x์ขŒํ‘œ ๋บ€๋‹ค.(์ผ์ •)
    x,y = step[st]
    x_var,y_var = x - x_cri, y - y_cri
    nx,ny = x_cri+y_var , y_cri-x_var
    if iswall(nx,ny):
        matrix[nx][ny] = 1
        step.append([nx,ny])
  • 0731 ๋ฐฑ์ค€ ์ƒˆ๋กœ์šด ๊ฒŒ์ž„2
# ๋นก๊ตฌํ˜„ ๋ฌธ์ œ
# ์˜ค๋žœ๋งŒ์— ํ’€์–ด์„œ ๊ทธ๋Ÿฐ๊ฐ€ ์ฒด๊ณ„์ ์œผ๋กœ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•จ
# ํ•จ์ˆ˜ํ™” ํ•ด์„œ ํ‘ธ๋Š”๊ฒŒ ์ข‹์€ ๊ฒƒ ๊ฐ™์Œ + ๋ฌธ์ œ ์„ค๊ณ„๋ฅผ ์ฐฉ์‹คํžˆ ํ•ด์•ผํ•จ

# ํ•จ์ˆ˜ํ™” ์—์„œ๋Š” ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ ์„œ ํ’€์ž
# ์ฒ˜์Œ์— ์ง  ์ฝ”๋“œ๋Š” ์—‰๋ง์ด ์—ˆ๋‹ค -> ๋ณต์žกํ•˜๋”๋ผ๋„ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™” ํ•˜์—ฌ ํ’€์–ด์•ผํ•จ

# ์ƒ๊ฐ -> ํ•˜์–€์ƒ‰์ด๋‚˜ ๋นจ๊ฐ„์ƒ‰์€ ๊ฑฐ์˜ ๋˜‘๊ฐ™์œผ๋‚˜ ์ฐจ์ด๋Š” ๋งˆ์ง€๋ง‰์— ๋’ค์ง‘์–ด ์ฃผ๋Š” ๊ฒƒ 
# moving ์„ ํ•จ์ˆ˜ํ™” ํ•˜์—ฌ ์ค‘๋ณต ์ตœ์†Œํ™”

def moving(nx,ny,x,y,idx):
    # state์—์„œ ์›€์ง์ด๋Š”๋ฐ, ์›€์ง์ด๋Š” ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ?
    # ํ•˜๋‚˜ํ•˜๋‚˜ ์›€์ง์ด์ง€๋ง๊ณ  ๋‹จ์ฒด๋กœ ์›€์ง์ด๋ฉด ๋จ. 
    # ์–ด์ฐจํ”ผ ๋ณธ์ธ๋ณด๋‹ค ์œ„์— ์žˆ๋Š” ์• ๋“ค์€ ์„ธํŠธ๋กœ ์›€์ง์ž„
    stack = []
    for i in range(len(state[x][y])-1,-1,-1):
        temp = state[x][y].pop()
        stack.append(temp)
        data[temp][0],data[temp][1] = nx,ny
        if temp == idx:
            break
    return stack

def go_white(nx,ny,x,y,idx):
    state[nx][ny] += moving(nx,ny,x,y,idx)[::-1]

def go_red(nx,ny,x,y,idx):
    state[nx][ny] += moving(nx,ny,x,y,idx)
 
# ํŒŒ๋ž€์ƒ‰์ด๋‚˜ ๋ฒฝ์ด๋‚˜ ๊ฒฝ์šฐ๊ฐ€ ๋˜‘๊ฐ™์œผ๋ฏ€๋กœ ์ค‘๋ณต ์ฝ”๋“œ ์ตœ์†Œํ™”
# ์ด ๊ฒฝ์šฐ ๋ฐฉํ–ฅ ๋ฐ”๊ฟ”์ฃผ๊ณ  ํ•œ๋ฒˆ ๋”ํ•ด์•ผํ•จ -> ๋นจ๊ฐ„์ƒ‰ ํ•˜์–€์ƒ‰์„ ํ•จ์ˆ˜ํ™” ํ•˜๋ฏ€๋กœ์จ ์ค‘๋ณต ์ตœ์†Œํ™”.
# ํŠ•๊ฒผ์„ ๋•Œ ๋˜ ํŠ•๊ธด๋‹ค? -> ๋ฐฉํ–ฅ๋งŒ ๋ฐ”๊ฟ”์คŒ , ๋นจ๊ฐ„์ƒ‰orํ•˜์–€์ƒ‰์ด๋‹ค? -> ๋˜‘๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐฉํ–ฅ๋ฐ”๊ฟˆ
if iswall(nx,ny) == False or matrix[nx][ny] == 2:
    if d == 1: d = 2
    elif d == 2: d = 1
    elif d == 3 : d = 4
    elif d == 4 : d = 3
    nx,ny = x+dx[d],y+dy[d]
    if iswall(nx, ny) == False or matrix[nx][ny] == 2:
        data[iteration][2] = d
        nx,ny = x,y
        elif matrix[nx][ny] == 0:
            go_white(nx,ny,x,y,iteration)
            data[iteration][2] = d
        elif matrix[nx][ny] == 1:
            go_red(nx,ny,x,y,iteration)
            data[iteration][2] = d
  • 0804 ๋ฐฑ์ค€ ํŒŒํ‹ฐ
# ๋งจ ์ฒ˜์Œ ๋‚˜์˜ ์ƒ๊ฐ => ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ (start,end)๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ „๋ถ€ ๊ตฌํ•ด์ค€๋‹ค.
# distance ๊ตฌํ•ด ๋†“์€ ๊ฒƒ๋“ค์„ ๋ฒ„๋ ค์•ผ ํ•˜๋ฏ€๋กœ so bad
def search(start_point, end_point):
	# ... #
    while heap:
        dis, location = heapq.heappop(heap)
        if location == end_point:
            break
        for arrive, cost in graph[location]:
            candidate = dis + cost
            if candidate < distance[arrive]:
                distance[arrive] = candidate
                heapq.heappush(heap, (distance[arrive], arrive))

    return distance[end_point]

# ๋” ์ข‹์€ idea => ์‹œ์ž‘์ ์„ end_point๋กœ ํ•˜๋ฉด ๋ฐฐ์—ด distance[i]์˜ ์˜๋ฏธ๋Š”?
# ๋„์ฐฉ์ ์—์„œ i ๋กœ ๊ฐˆ๋•Œ ๊ฑธ๋ฆฌ๋Š” ๊ฑฐ๋ฆฌ.. ์ฆ‰ ์˜ฌ ๋•Œ์˜ ๊ฑฐ๋ฆฌ
# graph๋ฅผ ๋’ค์ง‘์–ด์„œ ์ €์žฅํ•˜๋ฉด? distance[i]๋Š” i์—์„œ end_point๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ.
def search(start_point, graph):
    # ...
    while heap:
        dis, location = heapq.heappop(heap)
        if distance[location] < dis:
            continue
        for arrive, cost in graph[location]:
            candidate = dis + cost
            if candidate < distance[arrive]:
                distance[arrive] = candidate
                heapq.heappush(heap, (distance[arrive], arrive))
    return distance

# path๋Š” start์—์„œ end๋กœ ๊ฐˆ๋•Œ์˜ ๋น„์šฉ, reverse๋Š” end์—์„œ start ๋กœ ๊ฐˆ๋•Œ์˜ ๋น„์šฉ
for _ in range(M):
    start, end, cost = map(int,input().split())
    path[start].append((end,cost))
    reverse[end].append((start,cost))
    
dis = search(end_point,path)
rev_dis = search(end_point,reverse)
  • 0805 ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 2
# ์ฒ˜์Œ ์ ‘๊ทผ
# ์ž˜๋ชป๋œ ์  1. bfs๋Š” cnt๊ฐ€ ์ปค์ง€๋Š” ์ˆœ์„œ๋กœ queue์— ๋‹ด๊ธด๋‹ค. => visited[nx][ny][k] < cnt ๋Š” ๋‹น์—ฐํ•˜๋‹ค.
# ์ž˜๋ชป๋œ ์  2. visited์— ๊ฑฐ๋ฆฌ ์ฒดํฌ๋ฅผ ๋™์‹œ์— ํ•˜๋ฉด queue์— cnt๋ฅผ ๋‹ด์„ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค.
visited = [[[-1 for _ in range(K+1)] for _ in range(M)] for _ in range(N)]
def bfs(x_start,y_start,x_end,y_end):
    queue = deque()
    # x์œ„์น˜, y์œ„์น˜, ๊ฑฐ๋ฆฌ, ๋ฒฝ๋šซ์€ ํšŸ์ˆ˜
    queue.append((x_start,y_start,1,0))
    visited[x_start][y_start][0] = 1
    while queue:
        x,y,cnt,k = queue.popleft()
        for i in range(4):
            nx,ny = x+dx[i],y+dy[i]
            if iswall(nx,ny):
                # bfs๋Š” ์–ด์ฐจํ”ผ cnt ์ˆœ์„œ์ด๋ฏ€๋กœ ํ•ญ์ƒ visited[nx][ny][k] < cnt ์ด๋‹ค.
                if visited[nx][ny][k] == -1 or visited[nx][ny][k] > cnt:
                    if nx == x_end and ny == y_end:
                        return cnt+1
                    if matrix[nx][ny] == 1 and k < K:
                        queue.append((nx,ny,cnt+1,k+1))
                        visited[nx][ny][k+1] = cnt+1
                    elif matrix[nx][ny] == 0:
                        queue.append((nx,ny,cnt+1,k))
                        visited[nx][ny][k] = cnt+1
# ์ˆ˜์ •๋œ ์ฝ”๋“œ => ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๋Š” ์•ˆ๋‚˜์ง€๋งŒ ์•„์Šฌ์•„์Šฌํ•จ. visited ๊ตฌ์กฐ๊ฐ€ ๋น„ ํšจ์œจ์ ์ด๋‹ค.                    
def bfs(x_start,y_start,x_end,y_end):
    if x_end == 0 and y_end == 0:
        return 1
    queue = deque()
    # x์œ„์น˜, y์œ„์น˜, ๋ฒฝ๋šซ์€ ํšŸ์ˆ˜
    queue.append((x_start,y_start,0))
    visited[x_start][y_start][0] = 1
    while queue:
        x,y,k = queue.popleft()
        for i in range(4):
            nx,ny = x+dx[i],y+dy[i]
            if iswall(nx,ny):
                if visited[nx][ny][k] == -1:
                    if nx == x_end and ny == y_end:
                        return visited[x][y][k]+1
                    if matrix[nx][ny] == 1 and k < K:
                        queue.append((nx,ny,k+1))
                        # visited์— ๋ฐ”๋กœ ๊ฑฐ๋ฆฌ ์ฒดํฌ
                        visited[nx][ny][k+1] = visited[x][y][k]+1
                    elif matrix[nx][ny] == 0:
                        queue.append((nx,ny,k))
                        visited[nx][ny][k] = visited[x][y][k]+1
                        
# ๋น„ํŠธ ๋งˆ์Šคํ‚น์„ ํ™œ์šฉํ•˜๋ฉด N X M X K ๋งŒํผ์˜ visited ๋ฉ”๋ชจ๋ฆฌ๋ฅผ N X M ๋งŒํผ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
# ๋น„ํŠธ ๋งˆ์Šคํ‚น ํ™œ์šฉ? => ๊ฐ ์ƒํƒœ๋ณ„ visited ์ฒดํฌ๋งŒ ํ•  ๋•Œ, ์ฆ‰ ์ƒํƒœ๋ณ„ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ๋•Œ.
# K ๋งŒํผ ๋ฒฝ ๋šซ์€ ๊ฒƒ visited ๊ฒ€์‚ฌ
if visited[nx][ny] & (1<<k):
# K ๋งŒํผ ๋ฒฝ ๋šซ์€ ๊ฒƒ visited ์ž…๋ ฅ
visited[nx][ny] = visited[nx][ny] | (1<<k)
  • 0805 ๊ตฐ๋Œ€ ํƒˆ์ถœ (good)
# ๊ตฌํ˜„ ์•„์ด๋””์–ด : visited๋กœ ํ†ต๊ณผ ํ–ˆ์„ ๋•Œ์˜ ์ตœ์†Œ๊ฐ’๊ณผ ํ†ต๊ณผ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ์ตœ์†Œ๊ฐ’ ๊ตฌํ•˜๊ธฐ
# ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 2์™€ ๋‹ค๋ฅธ์ ์€? => ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 2๋Š” ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ด ๊ฑฐ๋ฆฌ
# ์–ด์ฐจํ”ผ ๊ฑฐ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ๋งŒ๋‚˜๋Š” ๊ฐ’์ด ๊ณง ์ตœ์†Œ๊ฐ’
# ํ•˜์ง€๋งŒ ๊ตฐ๋Œ€ ํƒˆ์ถœ์€ ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ value ์ด๋ฏ€๋กœ ์ฒดํฌ๋งŒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ตœ์†Œ๊ฐ’ ์ €์žฅํ•˜๊ณ 
# ๊ทธ๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋งŒ ์ฒดํฌํ•ด์•ผํ•จ

# ํ‹€๋ฆฐ ์  : 
visited = [[[987654321,987654321] for _ in range(M)] for _ in range(N)]
# ๊ฐ ๊ฐ’ k ๊ฐ€ 0 <= k <= 10^9 ์ด์—ˆ๋Š”๋ฐ, 987654321 ๋ณด๋‹ค 10^9 ์ด ์ปค์„œ ์ •๋‹ต์ด ์•ˆ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Œ. ๊ฐ’์„ ์ฒดํฌ ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ float('INF')๋กœ ํ•ด๋„ ์ข‹์Œ
visited = [[[9876543210,9876543210] for _ in range(M)] for _ in range(N)]

# ํ•ต์‹ฌ ๋กœ์ง
while queue:
    # x ์œ„์น˜, y ์œ„์น˜, ์ง€๋‚˜์˜จ ๊ฒฝ๋กœ ์ค‘ ์ตœ๋Œ€๊ฐ’, ํ†ต๊ณผ ์—ฌ๋ถ€
    x,y,val,k = queue.popleft()
    for i in range(4):
        nx,ny = x+dx[i],y+dy[i]
        if iswall(nx,ny):
            # ์ด๋•Œ๊นŒ์ง€์˜ ์ตœ๋Œ€๊ฐ’๊ณผ ์ƒˆ๋กœ ๊ฐ„ ๊ณณ์˜ ๊ฐ’ ๋น„๊ตํ•ด์„œ ์ตœ๋Œ€๊ฐ’ ๊ฐฑ์‹ 
            temp = max(val,matrix[nx][ny])
            # ๊ทธ ์ตœ๋Œ€๊ฐ’์ด ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋ฉด cut
            if visited[nx][ny][k] > temp:
                queue.append((nx,ny,temp,k))
                visited[nx][ny][k] = temp
            # ํ†ต๊ณผ ํ•ด๋ณด์ง€ ๋ชปํ–ˆ์œผ๋ฉด ์™”๋˜ ๋ฐฉํ–ฅ์œผ๋กœ ํ†ต๊ณผํ•ด๋ณด๊ณ  ๊ณผ๊ฑฐ์˜ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด cut
            # ์ฒ˜์Œ์—๋Š” visited[nx][ny][k] > temp ์—ฌ์•ผ๋งŒ ์ด ๋ถ„๊ธฐ๋ฅผ ๊ฒ€์‚ฌํ–ˆ๋Š”๋ฐ,
            # ๊ทธ๋Ÿฌ๋ฉด ํ‹€๋ฆผ why? visited[nx][ny][k] > temp๋ฅผ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์•„๋„ ๊ฑด๋„ˆ๋›ฐ์–ด์„œ ์ตœ์†Œ๊ฐ’์ด ๋ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
            if k == 0:
                nnx,nny = nx+dx[i],ny+dy[i]
                if iswall(nnx,nny):
                    temp = max(val,matrix[nnx][nny])
                    if visited[nnx][nny][1] > temp:                            				                                         queue.append((nnx,nny,temp,1))
                        visited[nnx][nny][1] = temp
  • 0807 ๋ถˆ!
# ํ‹€๋ฆฐ ์š”์†Œ

# 1. ๋‹น์—ฐํžˆ ๋ถˆ์€ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋ถˆ์ด ์—ฌ๋Ÿฌ๊ฐœ ์ผ ์ˆ˜ ์žˆ๊ณ  ํ•˜๋‚˜์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
# 2. ๊ฐ€์žฅ์ž๋ฆฌ๋ผ๊ณ  ํ•ด์„œ ๋‹น์—ฐํžˆ x,y ๊ฐ€ N-1, M-1 ์ผ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ 0์ผ ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๋‹ค.
# 3. ๋ถˆ์„ ์˜ฎ๊ธฐ๊ณ  ๋‚˜๋ฉด ์›๋ž˜ ์žˆ๋˜ ๋ถˆ์€ QUEUE์—์„œ ๋‚˜๊ฐ€์•ผํ•˜๋Š”๋ฐ ๊ทธ๋ƒฅ FOR๋ฌธ ๋Œ๋ ค์„œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ	๊ณผ๊ฐ€ ๋‚ฌ์—ˆ๋‹ค.
# 4. ๋ถˆ ๋จผ์ € ์˜ฎ๊ธฐ๊ณ  ์‚ฌ๋žŒ ์˜ฎ๊ธฐ๋Š”๋ฐ, cnt๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ถˆ์„ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿผ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ cnt = 0 ์ผ ๋•Œ๋ถ€ํ„ฐ ๋ถˆ์„ ์˜ฎ๊ฒจ์•ผ ํ•จ.
  • 0808 ๋‚š์‹œ์™•
# ์ฒ˜์Œ ๊ตฌํ˜„ ํ–ˆ์„ ๋•Œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ ์ด์œ ?
# ์ถ”์ธก => ํ–‰๋ ฌ์„ ๊ณ„์† ๋ณต์‚ฌํ•ด์„œ ๊ทธ๋Ÿด๊ฒƒ์ด๋‹ค.
    new = [[[0,0,0] for _ in range(C)] for _ in range(R)]
    for i in range(R):
        for j in range(C):
            if matrix[i][j][2] != 0:
                s,d,z = matrix[i][j]
                sharkmoving(i,j,s,d,z)
    matrix = new
    
# ํ–‰๋ ฌ ๋ณต์‚ฌ ์—†์ด ํ•˜๋Š” ์•„์ด๋””์–ด ๊ตฌ์ƒ => ๊ธฐ์กด matrix ํ–‰๋ ฌ์„ ๋ณ€ํ˜•
# ํ–‰๋ ฌ ๋ณต์‚ฌํ•˜๋Š” ์ด์œ ๋Š” ์›€์ง์ธ ๋ฌผ๊ณ ๊ธฐ์™€ ์›€์ง์—ฌ์•ผ ํ•  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•จ.
# matrix๋ฅผ 2๊ฐœ๋กœ ์ชผ๊ฐœ์„œ col์ด ์ง์ˆ˜ ์ผ๋•Œ๋Š” ์ง์ˆ˜ ์ถœ๋ฐœ ํ™€์ˆ˜ ๋„์ฐฉ, ๊ทธ ๋ฐ˜๋Œ€๋Š” ๋ฐ˜๋Œ€๋กœ ํ•จ
# ํ•˜์ง€๋งŒ ๋ณ„ ์‹œ๊ฐ„ ์ฐจ์ด ์—†์Œ
matrix = [[[[0,0,0],[0,0,0]] for _ in range(C)] for _ in range(R)]
for col in range(C):
    result = fishing(col,result,col)
    for i in range(R):
        for j in range(C):
            if matrix[i][j][col%2][2] != 0:
                s,d,z = matrix[i][j][col%2]
                sharkmoving(i,j,s,d,z,col)
# ์›์ธ: ๋ฒฝ์— ๋งž๋Š” ๊ฒƒ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด s๋งŒํผ for๋ฌธ ๋Œ๋ ค ์ผ์ผํžˆ ์ฒดํฌ ํ•ด์คŒ -> ์‹œ๊ฐ„ ๊ฑธ๋ฆผ
# for๋ฌธ์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์•ผํ•จ
def sharkmoving(x,y,s,d,z,col):
    matrix[x][y][col%2] = [0,0,0]
    for i in range(s):
        nx,ny = x + dx[d], y+dy[d]
        if not iswall(nx,ny):
            if d== 1: d=2
            elif d==2: d=1
            elif d==3: d=4
            elif d==4: d=3
            nx,ny = x + dx[d],y + dy[d]
        x,y = nx,ny
    if matrix[x][y][(col+1)%2][2] < z:
        matrix[x][y][(col+1)%2][0],matrix[x][y][(col+1)%2][1],matrix[x]

# s๋งŒํผ ๋Œ์ง€ ๋ง๊ณ  ์ˆ˜์‹์ ์œผ๋กœ ๊ณ„์‚ฐํ•ด์•ผ ํ•จ
def sharkmoving(x,y,s,d,z):
    matrix[x][y] = [0,0,0]
    s_start = s
    while True:
        nx,ny = x + s * dx[d], y+ s * dy[d]
        if nx < 0:
            s = s-x
            x, d = 0,2
        elif nx >= R:
            s = s-(R-1-x)
            x, d = R-1,1
        elif ny < 0:
            s = s -y
            y, d = 0,3
        elif ny >= C:
            s = s-(C-1-y)
            y, d = C-1,4
        else:
            break
    if new[nx][ny][2] < z:
        # s_start์˜ ์˜๋ฏธ? => ๋ฐฉํ–ฅ์€ ๋ฒฝ์— ๋ถ€๋”ชํžˆ๋ฉด ๋ฐ”๋€Œ์ง€๋งŒ s๋Š” ์ฒ˜์Œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€์•ผํ•จ
        new[nx][ny][0],new[nx][ny][1],new[nx][ny][2] = s_start,d,z
  • 0809 ๋ฐฑ์ค€ ์ปต๋ผ๋ฉด
# greedy ์•Œ๊ณ ๋ฆฌ์ฆ˜ -> ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ๊ณผ ์—†๋Š” ๊ฒƒ์„ ๊ตฌ๋ถ„ํ•˜์ž.
# ๋Œ€๋ถ€๋ถ„์€ ์‹œ์ž‘ ๋ถ€ํ„ฐ ๋ ๊นŒ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋์—์„œ ์‹œ์ž‘์ ์„ ์ฐพ์•„๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•œ๋‹ค.
# ์‹œ์ž‘์ ๋ถ€ํ„ฐ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ณ„์‚ฐํ•˜๋ฉด 100% ์‹œ๊ฐ„์ดˆ๊ณผ. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ˆ˜์‹์ ์œผ๋กœ ๊ณ„์‚ฐํ•ด์•ผํ•จ.

# ์ด ๋ฌธ์ œ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ? -> ์ตœ๋Œ€ ์ปต๋ผ๋ฉด ์ˆ˜ ๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.
# ํ•„์š”์—†๋Š” ๊ฒƒ? -> ๋ช‡ ๋ฒˆ์งธ ์ˆœ์„œ์— ๋ญ๋ฅผ ํ’€์—ˆ๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค!

# ์„ค๊ณ„ -> ๊ฐ ๋ฐ๋“œ๋ผ์ธ ๊นŒ์ง€์˜ ํ•ด์•ผ ํ•˜๋Š” ์ผ์„ ๋ชจ์€๋‹ค.
data = [[] for _ in range(N+1)]
for i in range(N):
    a,b = map(int,input().split())
    data[a].append(b)
# ๊ทธ ๋‹ค์Œ ๊ฐ ๋ฐ๋“œ๋ผ์ธ ๋ณ„๋กœ ์ปต๋ผ๋ฉด ๊ฐฏ์ˆ˜์— ๋”ฐ๋ผ ์ •๋ ฌํ•œ๋‹ค.
for i in range(N):
    if len(data[i]):
        data[i].sort(reverse=True)
# ๊ฐ ๋ฐ๋“œ๋ผ์ธ ๋ณ„๋กœ ๊ฐ€์žฅ ํฐ ๊ฒƒ์„ ์ €์žฅํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ์ˆซ์ž๋ถ€ํ„ฐ ์ง€๊ธˆ ๊ฐ’์˜ ์ตœ์†Œ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
# ๋งŒ์ผ ๋ฐ๋“œ๋ผ์ธ ๊นŒ์ง€ ํ•ด์•ผ ํ•˜๋Š” ์ผ์ด ์—†๋‹ค๋ฉด ๋’ค์— ๋‚˜์˜ฌ ๋ฐ๋“œ๋ผ์ธ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋„ฃ๊ธฐ ์œ„ํ•ด 0์„ ๋„ฃ๋Š”๋‹ค.
heap = []
heapq.heapify(heap)
for i in range(1,N+1):
    if len(data[i]) != 0:
        # ์ œ์ผ ํฐ ๊ฑฐ ์ถ”๊ฐ€ํ•˜๊ณ 
        heapq.heappush(heap,data[i][0])
        # ๊ทธ๋‹ค์Œ๊บผ ๋ถ€ํ„ฐ ๋„๋Š”๋ฐ, ์ง€๊ธˆ ์žˆ๋Š” ๊ฒƒ ์ค‘์— ๊ฐ€์žฅ ์ž‘์€ ๊ฑฐ ๋ณด๋‹ค ๋‹ค์Œ๊ป˜
        for j in range(1,len(data[i])):
            temp = heapq.heappop(heap)
            # ํฌ๋‹ค? ๊ทธ๋Ÿผ ๋‹ค์‹œ ๋„ฃ๊ณ  ๋
            if temp > data[i][j]:
                heapq.heappush(heap,temp)
                break
            # ์•„๋‹ˆ๋‹ค? ๊ทธ๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋‹ค์‹œ
            else:
                heapq.heappush(heap,data[i][j])
    else:
        heapq.heappush(heap,0)
        
# ๊ฐ€์žฅ greedy ๊ฐ™์ด ํ‘ผ ์ฝ”๋“œ

pq = []
result = 0
# greedy ๋‹ต๊ฒŒ ๋ฐ๋“œ๋ผ์ธ์˜ ์—ญ์ˆœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.
# ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋ฐ๋“œ๋ผ์ธ ์—ญ์ˆœ๋ถ€ํ„ฐ ๋Œ๋ฉด์„œ ๋ชจ๋“  ํ›„๋ณด๋ฅผ ์ง‘์–ด ๋„ฃ๋Š”๋‹ค 
# -> ์—ญ์ˆœ๋ถ€ํ„ฐ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชปํ•˜๋Š” ๊ฑด ๋“ค์–ด๊ฐ€ ์žˆ์ง€ ์•Š๋‹ค.
# -> ์ด ๋ฐ๋“œ๋ผ์ธ๋•Œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ผ์˜ ์š”์†Œ ์ด๋‹ค. ๊ทธ์ค‘ ์ตœ๋Œ€๊ฐ’ ๋ฝ‘์•„์„œ result์— ๋”ํ•จ
for i in range(max_dead, 0, -1):
    
    for j in dead_list[i]:
        heapq.heappush(pq, -j)
    if pq:
        result -= heapq.heappop(pq)
  • 0809 ๋ฐฑ์ค€ ๊ณ„์‚ฐ๊ธฐ (๋‹ค์‹œ ํ’€์–ด๋ณด์ž)
# ์—ญ์‹œ greedy ๋ฌธ์ œ
# 1. ๊ตฌํ•  ๊ฒƒ์„ ์ •ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•œ๋‹ค. 
# -> ์—ฐ์‚ฐ ์ˆœ์„œ.
# 2. ์—ญ์ˆœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.
# -> 0๋ถ€ํ„ฐ ํ•˜๋ฉด ํ—ท๊ฐˆ๋ฆฐ๋‹ค. N ๋ถ€ํ„ฐ ์ˆซ์ž๋ฅผ ์ค„์—ฌ๋‚˜๊ฐ€์•ผ ํ•œ๋‹ค.
# 3. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ˆ˜์‹์ ์œผ๋กœ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค.(for๋ฌธ์œผ๋กœ ํƒ์ƒ‰ํ˜•์‹ํ•˜๋ฉด ํ„ฐ์ง)
# -> ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ง์ ‘ ๋Œ๋ฆฌ๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ ๋‚œ๋‹ค. ํ•„์š”ํ•œ ์—ฐ์‚ฐ๋งŒ ํ•ด์„œ ๊ฐ€์ง“์ˆ˜๋ฅผ ์ค„์—ฌ์•ผํ•œ๋‹ค.

N = int(input())
result = []
# 100000 ๊ผด๋กœ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•จ.
while True:
    # N & 1 = 1 : ๋์ž๋ฆฌ๊ฐ€ 1์ด๋‹ค -> ํ™€์ˆ˜๋‹ค ๋ชป๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— *2
    if N & 1:
        result += ['[/]']
        N = N * 2
    # N & 2 = 1: ๋’ค์—์„œ ๋‘๋ฒˆ์งธ ์ž๋ฆฌ๊ฐ€ 1์ด๋‹ค -> ์—†์•  ์ค€๋‹ค.
    elif N & 2:
        result += ['[+]']
        N = N -2
    # N = N //2 ๋ฅผ ์ด์ง„์ˆ˜ ์ธก๋ฉด์—์„œ ๋ณด๋ฉด ๋งจ ๋’ท์ž๋ฆฌ๋ฅผ ์—†์• ์ค€๋‹ค.
    # ํ•˜์ง€๋งŒ N์ด ์ง์ˆ˜ ์ผ๋•Œ๋งŒ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋‹ค.
    else:
        result = result + ['[*]']
        N = N //2
    if N == 0:
        break

print(len(result))
print(*result[::-1])
  • 0812 ๋ฐฑ์ค€ ํ‚ค vs ๋‹ฌ์ด ์ฐจ์˜ค๋ฅธ๋‹ค ๊ฐ€์ž
#  ๋‘ ๋ฌธ์ œ์˜ ์ฐจ์ด์ ์ด ๋ญ˜๊นŒ?
# ํ‚ค -> ์ฃผ์šด ๋ฌธ์„œ์˜ ๊ฐฏ์ˆ˜    ๋‹ฌ์ด ์ฐจ์˜ค๋ฅธ๋‹ค ๊ฐ€์ž -> ์ตœ๋‹จ๊ฑฐ๋ฆฌ
# ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” ๋น„ํŠธ๋งˆ์Šคํ‚น์ด ํ•„์š”ํ•˜๊ณ , ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ๊ผญ ์“ธํ•„์š”์—†๋‹ค.(๊ฐˆ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋งŒ ์•Œ์ž)
# ๊ฒฝ๋กœ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค -> ๋น„ํŠธ๋งˆ์Šคํ‚น์œผ๋กœ ์—ด์‡  ์ฃผ์šธ๋•Œ ๋งˆ๋‹ค ์ดˆ๊ธฐํ™”
# ๊ฒฝ๋กœ ํ•„์š”์—†๊ณ  ๊ฐˆ์ˆ˜ ์žˆ๋ƒ ์—†๋ƒ๋งŒ ์ค‘์š” -> visited 1์ฐจ์›์œผ๋กœ ํ•œ๋ฒˆ๋งŒ ๋Œ์ž

# ๋‹ฌ์ด ์ฐจ์˜ค๋ฅธ๋‹ค ๊ฐ€์ž -> ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ด๋ฏ€๋กœ ์—ด์‡  ์ฃผ์šธ ๋•Œ ๋งˆ๋‹ค visited ์ดˆ๊ธฐํ™” ํ•ด์„œ 
# ์›€์ง์ด๋Š”๊ฑฐ ์ฒดํฌ ํ•ด์ค˜์•ผ ํ•จ
# visited[x][y] | (1<<cnt) ๋ฐฉ๋ฌธ์‹œ ์ฒดํฌ : cnt -> ์ฃผ์šด ์—ด์‡  ๊ฐฏ์ˆ˜
# cnt๊ฐ€ ์ฆ๊ฐ€ ํ• ์ˆ˜๋ก ๋ฐ€๋ฆฌ๋Š” ๊ฐฏ์ˆ˜๊ฐ€ ๋Š˜์–ด visited๊ฐ€ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ํšจ๊ณผ
# ํ‚ค๋Š” 6๊ฐœ -> 0~31๋กœ ๊ฐ๊ฐ์˜ ํ‚ค ๋ณด์œ  ์ƒํ™ฉ์„ ์ฒดํฌ ๊ฐ€๋Šฅํ•˜๋‹ค.
# ex) key = 27 => 011011 (1,2,4,5๋ฒˆ ์—ด์‡ ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค.)
# ex) if visited[x][y] == 27 ํ•˜๋ฉด (1,2,4,5๋ฒˆ ์—ด์‡ ๋ฅผ ๋ณด์œ ํ•œ ์ƒํƒœ์ผ๋•Œ ๋ฐฉ๋ฌธํ–ˆ๋Š”๊ฐ€?)

# ํ‚ค -> ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— visited๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ค„ ํ•„์š” ์—†๋‹ค.
# visited๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ํ•„์š” ์—†๋‹ค? -> ๊ทธ๋ƒฅ ์—ด์‡  ์ฃผ์šฐ๋ฉด ๋Œ์•„๊ฐ€๋ฉด ๋จ, 
# ๋ฌธ์— ๋ง‰ํ˜€ ๋ชป๊ฐ€๋Š” ๊ณณ ์žˆ์œผ๋ฉด ๊ฐ€๊ณ  ์•„๋‹ˆ๋ฉด ๋ง๊ณ 
# ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํŠธ๋งˆ์Šคํ‚น ํ•  ํ•„์š”์—†๋‹ค.
# ๋กœ์ง 
# 1. ์ž…๊ตฌ๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆœ์„œ์ƒ๊ด€์—†์ด ์ž…์žฅ
# 2. ๋ฌธ์— ๊ฐ”๋Š”๋ฐ ์—ด์‡ ๊ฐ€ ์—†์–ด์„œ ๋ชป์—ฌ๋„ค? -> ๋”•์„œ๋„ˆ๋ฆฌ์— ํ‚ค์™€ ์ขŒํ‘œ ์ €์žฅ
# 3. ์ง€๋‚˜๊ฐ€๋‹ค๊ฐ€ ์—ด์‡ ๋ฅผ ์ฐพ์•˜๋„ค? -> ๊ทธ ๋”•์„œ๋„ˆ๋ฆฌ๋กœ ๊ฐ€์„œ ๊ทธ ํ‚ค์˜ ์ขŒํ‘œ๋“ค queue์— append
# ๋ฌธ ์ž…์žฅ ์ˆœ์„œ๋Š” ์ƒ๊ด€์—†๋Š” ์ด์œ  -> ๋ชป์—ฌ๋Š” ๋ฌธ์€ ์œ„์น˜ ๋‹ด์•„๋‘๊ณ  ๋‚˜์ค‘๊ฐ€์„œ ์—ด์‡  ์ฐพ์œผ๋ฉด ๊ฐ€๋ฉด ๋˜๊ณ 
# ๊ฐ”๋Š”๋ฐ ์—ด์‡ ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๋ƒฅ ์—ด๋ฉด ๋˜๊ณ  ๋๊นŒ์ง€ ๋ชป์ฃผ์šฐ๋ฉด ๋ชป๊ฐ€๋Š” ์œ„์น˜์ธ๊ฑฐ๊ณ .
# visited๋Š” ๋น„ํŠธ๋งˆ์Šคํ‚น ํ•„์š”์—†๋Š” ์ด์œ  -> ์–ด์ฐจํ”ผ ๊ฐˆ์ˆ˜์žˆ๋‚˜ ์—†๋‚˜๋งŒ ๋ณด๋Š”๊ฑด๋ฐ ๋ญ. ๊ฒฝ๋กœ๊ฐ€ ์ค‘์š”ํ•œ๊ฒŒ ์•„๋‹ˆ์ž–์•„.
  • 0816 ์ปฌ๋Ÿฌ๋ณผ
# idea -> brute force( ์™„์ „ ํƒ์ƒ‰ )
# ๊ณตํ•˜๋‚˜์”ฉ ๋Œ๋ฉด์„œ ์ž๊ธฐ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ๋ฅผ ์ „๋ถ€ ์„ผ๋‹ค.
# ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n^2) ์ด๋ฏ€๋กœ ๋ถˆ๊ฐ€๋Šฅ -> log(n) ์ด๋‚˜ nlog(n)์˜ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

# ์ฒซ๋ฒˆ์งธ idea -> ์ •๋ ฌ ํ›„ ์ˆซ์ž๊ฐ€ ๋‚ฎ์€ ๊ฒƒ ๋ถ€ํ„ฐ ๋ณธ๋‹ค.
# ๋‚ฎ์€ ๊ฒƒ๋ถ€ํ„ฐ ๋ณด๋ฉด์„œ ๊ทธ๋•Œ๊นŒ์ง€์˜ ์ „์ฒด ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ๋ณธ์ธ์˜ ์ƒ‰๊น”์„ ๋บ€๋‹ค.
# ์œ ์˜ํ•  ์  -> ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๊ณต๋“ค์„ ์ฒ˜๋ฆฌํ•ด ์ค˜์•ผํ•จ
N = int(input())
data = []
for i in range(N):
    color,size = map(int,input().split())
    data.append([size,color,i])
result = [0 for _ in range(N)]
# ์ƒ‰๊น” ๋ณ„ ํฌ๊ธฐ ํ•ฉ ์ €์žฅ
color_sum = [0 for _ in range(N+1)]
# ๋ณผ์˜ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
data.sort()
total_sum, now = 0, 0
for size,color,idx in data:
   	# ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋ณผ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    if now == size:
        # temp๋ฅผ dictionary๋กœ ์ •์˜ํ•˜๋Š” ์ด์œ ? 
        # dictionary ์˜ in ํ•จ์ˆ˜๋Š” ์‹œ๊ฐ„๋ณต์žก๋„ O(1) ์ด๋‹ค.
        if color in temp:
            result[idx] = val - temp[color]
        else:
            result[idx] = val - color_sum[color]
            temp[color] = color_sum[color]
    # ๊ฐ™์ง€ ์•Š๊ณ  ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋ฐ”๋€œ
    else:
        # ์ธ๋ฑ์Šค์˜ ๊ฐ’์€ ์ด๋•Œ๊นŒ์ง€ ์ง€๋‚˜์˜จ ๋ชจ๋“  ๊ณต์˜ ํฌ๊ธฐ ํ•ฉ - ๋‚ด๊ฐ€ ์†ํ•œ ๋ณผ์˜ ํฌ๊ธฐ ํ•ฉ
        temp = {color:color_sum[color]}
        result[idx] = total_sum - color_sum[color]
        now, val = size, total_sum
    color_sum[color] += size
    total_sum += size

for num in result:
    print(num)
       
# ๋” ์ข‹์€ idea -> ๊ตณ์ด sort๋ฅผ ํ•ด์•ผํ•˜๋‚˜?
# ๊ณต์˜ ์ตœ๋Œ€ ๊ฐ’์ด ์ •ํ•ด์ ธ ์žˆ๋‹ค -> ์ž…๋ ฅ ๋ฐ›์„ ๋•Œ ๋ถ€ํ„ฐ ์ •ํ•ด์ง„ ์œ„์น˜์— ๋„ฃ์œผ๋ฉด ์•Œ์•„์„œ ์ •๋ ฌ๋จ

N = int(input())
# ๊ณต์˜ ํฌ๊ธฐ ์ˆœ์œผ๋กœ ๋ชจ์•„๋‘ 
data = [[] for _ in range(2001)]
for i in range(N):
    color,size = map(int,input().split())
    data[size].append((color,i))
result = [0 for _ in range(N)]
color_sum = [0 for _ in range(N+1)]
total_sum = 0
for size,arr in enumerate(data):
    temp,temp_size = {},0
    # ๊ฐ ํฌ๊ธฐ๋งˆ๋‹ค ๊ณต์„ ๊บผ๋ƒ„ (์ž๋™์œผ๋กœ ํฌ๊ธฐ ์ˆœ์œผ๋กœ ๊บผ๋‚ด์ง)
    for color,idx in arr:
        if color in temp:
            result[idx] = total_sum - temp[color]
        else:
            result[idx] = total_sum - color_sum[color]
            temp[color] = color_sum[color]
        color_sum[color] += size
        temp_size += size
    total_sum += temp_size

for num in result:
    print(num)
  • 0820 ์ƒ‰์ข…์ด ๋ถ™์ด๊ธฐ
# ์ฒ˜์Œ ์ ‘๊ทผ -> ๊ทธ๋ƒฅ ์ˆœ์„œ๋Œ€๋กœ ์ง€์šฐ๊ธฐ.
# ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ฐ์งˆ ์ˆ˜ ์—†๋‹ค. ์ตœ์ ์˜ ํ•ด๋„ ์กด์žฌ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Brute Force
# ์–ด๋–จ๋•Œ Brute Force? -> ๋ฌด์—‡์ด ์ตœ์ ์˜ ํ•ด ์ธ์ง€ ๋๊นŒ์ง€ ํ•ด๋ด์•ผ ์•„๋Š” ๊ฒฝ์šฐ.
# ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ง€๊ธˆ ์ตœ์„ ์˜ ๊ฒฝ์šฐ๋ฅผ ๊ณจ๋ž๋‹ค ํ•˜๋”๋ผ๊ณ  ๋งˆ์ง€๋ง‰ ๊นŒ์ง€ ๊ฐ”์„ ๋•Œ ๊ทธ๊ฒƒ์ด ์ตœ์„ ์ด๋ผ๋Š”
# ๋ณด์žฅ์ด ์—†๋‹ค. ๊ทธ ์ˆœ๊ฐ„ ์ตœ์ ์„ ๊ณ ๋ฅด๋ฉด -> Greedy Algorithm

# ๋ฌธ์ œ ํ‘ธ๋Š” ๋ฐฉ๋ฒ• -> ํ•˜๋‚˜์”ฉ ํ•ด๋ด์•ผ ํ•œ๋‹ค. (์žฌ๊ท€๋กœ)
def solve(matrix,frequency):
    if sum(frequency) >= result[0]:
        return
    for i in range(10):
        for j in range(10):
            if matrix[i][j] == 1:
                # ํฌ๊ธฐ๊ฐ€ 5์ธ ๊ฒƒ ๋ถ€ํ„ฐ ์ฒดํฌํ•ด์„œ ๋˜๋ฉด ์ถœ๋ฐœ
                # dfs์˜ ์›๋ฆฌ, ๋งจ ์ฒ˜์Œ 5๋ถ€ํ„ฐ ์ถœ๋ฐœํ•ด์„œ ๋๊นŒ์ง€ ๊ฐ€๋ณด๊ณ  ์•„๋‹ˆ๋ฉด ๋Œ์•„์˜ด
                # ๋งŒ์ผ ์ฒ˜์Œ์ด 5๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ ๋’ค๋„ ์ „๋ถ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ฐ€์ง€์น˜๊ธฐ
                for k in range(5,0,-1):
                if i < 11-k and j < 11-k and frequency[k] < 5:
                        if Check(i, j, 5 ,matrix):
                            Make(i, j, 5, matrix)
                            frequency[5] += 1
                            solve(deepcopy(matrix),frequency[:])
                            frequency[5] -= 1
                            Reverse(i, j, 5, matrix)
                # ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋‹ค ํ•ด๋ณด๊ณ  ์ด ๊ฐ€์ง€๋Š” return
                # ๋งŒ์ผ ์œ„์˜ for๋ฌธ์—์„œ ๊ฑธ๋ ธ๋‹ค๋ฉด ๋‹ค์Œ ๊ฐ€์ง€๋กœ ๊ฐ”์„ ๊ฒƒ์ด๊ณ 
                # ๋ชป๊ฐ”๋‹ค๋ฉด ๋” ์ด์ƒ ์œ ๋งํ•˜์ง€ ๋ชปํ•œ ๊ฐ€์ง€.
                return
    result[0] = min(result[0],sum(frequency))
    
    
# ์ฒ˜์Œ ์ ‘๊ทผ ์‹œ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ด์œ .
# 1. ํ˜„์žฌ result ๋ณด๋‹ค ํ˜„ ์ƒํƒœ๊ฐ€ ํฌ๋ฉด return (๊ฐ€์ง€์น˜๊ธฐ) ํ•ด์•ผ ํ•จ.
if sum(frequency) >= result[0]:
    return

# 2. deepcopy๊ฐ€ ํ•„์š”์—†์Œ
if i < 11-k and j < 11-k and frequency[k] < 5:
    if Check(i, j, 5 ,matrix):
        Make(i, j, 5, matrix)
        frequency[5] += 1
        # ์–ด์ฐจํ”ผ ๊ทธ ๋‹น์‹œ์˜ matrix์ƒํƒœ๋กœ ๋๊นŒ์ง€ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— deepcopy๋ฅผ ํ•ด์„œ 
        # ๋„˜๊ฒจ์ค„ ํ•„์š”๊ฐ€ ์—†์Œ
        # ์žฌ๊ท€๋กœ permutation ๋งŒ๋“œ๋Š” ์›๋ฆฌ๋ฅผ ์ƒ๊ธฐ ์‹œ์ผœ๋ณด๊ธฐ ๋ฐ”๋žŒ.
        solve()
        frequency[5] -= 1
        Reverse(i, j, 5, matrix)
  • 0822 ์ผ์š”์ผ ์•„์นจ์˜ ๋ฐ์ดํŠธ
# ์ƒ๊ฐ์€ ๋น ๋ฅด๊ฒŒ ํ–ˆ์œผ๋‚˜ ๊ตฌํ˜„ ๊ณผ์ •์—์„œ ๋””ํ…Œ์ผ์ด ๋ถ€์กฑํ•ด์„œ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•จ
def bfs(x,y):
    queue = deque()
    queue.append((x,y,[0,0]))
    visited[x][y] = [0,0]
    while queue:
        x, y, step = queue.popleft()
        for i in range(4):
            nx,ny = x+dx[i],y+dy[i]
            if iswall(nx,ny):
                temp = step[:]
                # ์ด์ „์˜ ์กฐ๊ฑด์œผ๋กœ ๋จผ์ € ๊ฒ€์‚ฌํ•˜๊ณ  ๊ทธ ๋’ค์˜ temp ๋ณ€๊ฒฝ -> ์ผ๊ด€์ ์œผ๋กœ ๊ฒ€์‚ฌ๋˜์ง€ ๋ชปํ•จ
                # ์™œ? ์ด์ „์—๋Š” ์กฐ๊ฑด์— ๋งž์•˜๋Š”๋ฐ ๋ฐ”๋€Œ๊ณ  ๋‚˜๋ฉด ์กฐ๊ฑด์— ์•ˆ๋งž์œผ๊ณ  ์‹ค์งˆ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์€ ์กฐ๊ฑด์— ์•ˆ๋งž๋Š” ๊ฒƒ๋“ค
                # ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์œผ๋กœ ์กฐ๊ฑด ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ณ  ๋งž์œผ๋ฉด ์ถ”๊ฐ€ ์ด๋Ÿฐ์‹์œผ๋กœ ํ•ด์•ผํ•จ
                if visited[nx][ny][0] > step[0] or (visited[nx][ny][0] == step[0] and visited[nx][ny][1] > step[1]):
                    if matrix[nx][ny] == 'F':
                        visited[nx][ny] = temp
                        continue
                    elif matrix[nx][ny] == 'a':
                        temp[1] += 1
                    elif matrix[nx][ny] == 'g':
                        temp[0] += 1
                    queue.append((nx, ny, temp))
                    visited[nx][ny] = temp
                    
# ๋ฌด์—‡์ด ํ‹€๋ ธ์„๊นŒ? -> 'a'๋ฅผ ์ง€๋‚˜๋Š” ๊ฒฝ์šฐ์™€ 'g'๋ฅผ ์ง€๋‚˜๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์„ ์ง€๋‚˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ visited๊ฐ€ ๊ฐฑ์‹ ๋˜๋Š” ์กฐ๊ฑด์ด ๋‹ค๋ฅด๋‹ค
# if visited[nx][ny][0] > step[0] or (visited[nx][ny][0] == step[0] and visited[nx][ny][1] > step[1]):
# ์ด๋ ‡๊ฒŒ ํ†ต์ผ๋œ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ†ต๊ณผํ•˜๋ฉด temp๊ฐ€ +1 ์ด๋Ÿฐ์‹์œผ๋กœ ๋˜๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ œ๋Œ€๋กœ visited๊ฐ€ ์ฒดํฌ๋˜์ง€ ์•Š๋Š”๋‹ค

def bfs(x,y):
    queue = deque()
    queue.append((x,y,[0,0]))
    visited[x][y] = [0,0]
    while queue:
        x, y, step = queue.popleft()
        for i in range(4):
            nx,ny = x+dx[i],y+dy[i]
            if iswall(nx,ny):
                temp = step[:]
                if matrix[nx][ny] == 'F':
                    if visited[nx][ny][0] > step[0] or (visited[nx][ny][0] == step[0] and visited[nx][ny][1] > step[1]):
                        visited[nx][ny] = temp
                        continue
                # ์กฐ๊ฑด์— ์˜ํ•ด ๋จผ์ € ๋ณ€๊ฒฝํ•˜๊ณ 
                elif matrix[nx][ny] == 'a':
                        temp[1] += 1
                elif matrix[nx][ny] == 'g':
                        temp[0] += 1
                # ๊ทธ ๋ณ€๊ฒฝ๋œ ๊ฐ’์œผ๋กœ ์กฐ๊ฑด ๊ฒ€์‚ฌ ํ•ด์„œ ๋งž์œผ๋ฉด ์ถ”๊ฐ€
                if visited[nx][ny][0] > temp[0] or (visited[nx][ny][0] == temp[0] and visited[nx][ny][1] > temp[1]):
                    queue.append((nx, ny, temp))
                    visited[nx][ny] = temp
                    
# ํ•ญ์ƒ ์กฐ๊ฑด ๊ฒ€์‚ฌํ• ๋•Œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ -> ์กฐ๊ฑด ๊ฒ€์‚ฌ ํ›„ vistited ์™€ queue/stack ๋ณ€๊ฒฝ ์ด์ˆœ์„œ!!!
# ์ฆ‰ ๋‹ค์‹œ๋งํ•ด ๋ณ€๊ฒฝ๋œ ์กฐ๊ฑด์œผ๋กœ ์ฒดํฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋จผ์ € ๋ณ€๊ฒฝ์„ ํ•ด๋ณธ ํ›„ ์กฐ๊ฑด ๊ฒ€์‚ฌ ํ•ด์•ผ ํ•œ๋‹ค.
  • 0823 ํ”ผ๋ฆฌ๋ถ€๋Š” ์‚ฌ๋‚˜์ด
# ์ฒ˜์Œ ์ ‘๊ทผ -> ๊ทธ๋ƒฅ ํ•˜๋‚˜์”ฉ ๋Œ์•„์„œ ๋˜๋Š” ์ž๊ธฐ๋“ค ๋ผ๋ฆฌ ๋„๋Š” ๊ฒƒ ๋งŒํผ ์ˆซ์ž ์˜ฌ๋ ค์คŒ (์˜ค๋‹ต)
# ์™œ๋ƒ? ์ถœ๋ฐœ์ ์—์„œ ์•ˆ ์ด์–ด์ง€์ง€๋งŒ ๋’ค์—์„œ ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ
def bfs(x,y,cnt):
    queue = deque()
    queue.append((x,y,[[x,y]]))
    visited[x][y] = cnt
    while queue:
        x,y,step = queue.popleft()
        dx,dy = direction[matrix[x][y]]
        nx,ny = x+dx, y+dy
        # ์•ˆ๋“ค๋ฆฐ ์ ์ด ์žˆ์œผ๋ฉด ๋‚ด๊ฑธ๋กœ ๋งŒ๋“ค๊ณ 
        if visited[nx][ny] == 0:
            queue.append((nx,ny,step+[[nx,ny]]))
            visited[nx][ny] = cnt
        # ๋‚ด ์ ์ด๋ž‘ ์ด์–ด์ง€๋„ค? -> circular ํ•˜๋‹ค๋Š” ๊ฑฐ๋‹ˆ๊นŒ ๋‚ด ์˜ํ† 
        elif visited[nx][ny] == visited[x][y]:
            result[0] += 1
            return cnt+1
        # ๋‹ค๋ฅธ ์ ์ด๋ž‘ ๋งŒ๋‚ฌ๋„ค? -> ๋‚˜๋Š” ๊ทธ ์˜ํ† ์— ์†Œ์†์ด์—ˆ๋„ค
        elif visited[nx][ny] != visited[x][y]:
            temp = visited[nx][ny]
            for x1,y1 in step:
                visited[x1][y1] = temp
            return cnt+1

    return cnt+1

# ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. -> step์œผ๋กœ ๊ผญ visited๋ฅผ ์ผ์ผํžˆ ๋ฐ”๊ฟ”์ค„ ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ?
# ์ •ํ™•ํ•œ visited๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ช‡๊ฐœ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€๋งŒ ์•Œ๋ฉด ๋˜๋Š”๋ฐ?
# cnt๊ฐ€ ์ ์  ์ปค์ง€๋Š” ๊ตฌ์กฐ์ด๋ฏ€๋กœ visited[nx][ny] < visited[x][y] ์ด๋ฉด ๋‹ค๋ฅธ graph์™€ ๋งŒ๋‚˜๋Š” ๊ฒƒ์ž„์„ ์•Œ์ˆ˜ ์žˆ๋‹ค.
# ๋”ฐ๋ผ์„œ visited๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๋งž์ถฐ์ฃผ์ง€ ์•Š์•„๋„ ๊ฒฝ๋กœ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ

def bfs(x,y,cnt):
    queue = deque()
    queue.append((x,y))
    visited[x][y] = cnt
    while queue:
        x,y = queue.popleft()
        dx,dy = direction[matrix[x][y]]
        nx,ny = x+dx, y+dy
        # ์•ˆ๋“ค๋ฆฐ ์ ์ด ์žˆ์œผ๋ฉด ๋‚ด๊ฑธ๋กœ ๋งŒ๋“ค๊ณ 
        if visited[nx][ny] == 0:
            queue.append((nx,ny))
            visited[nx][ny] = cnt
        # ๋‚ด ์ ์ด๋ž‘ ์ด์–ด์ง€๋„ค? -> circular ํ•˜๋‹ค๋Š” ๊ฑฐ๋‹ˆ๊นŒ ๋‚ด ์˜ํ† 
        elif visited[nx][ny] == visited[x][y]:
            result[0] += 1
            return cnt+1
        # ๋‹ค๋ฅธ ์ ์ด๋ž‘ ๋งŒ๋‚ฌ๋„ค? -> ๋‚˜๋Š” ๊ทธ ์˜ํ† ์— ์†Œ์†์ด์—ˆ๋„ค
        elif visited[nx][ny] < visited[x][y]:
            return cnt+1

    return cnt+1
  • 0827 ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋‹จ์–ด ๋ณ€ํ™˜
# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์ž˜ ์•ˆ๋œ๋‹ค? -> ๋ฌด์กฐ๊ฑด ๋์ชฝ์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.
# ์•ˆ๋ ๋•Œ ๋ฐ˜๋“œ์‹œ ์ฒดํฌ ํ•ด์•ผ ํ•  ์ .
# 1. 0์ผ๋•Œ ์ž˜ ๋‚˜์˜ค๋А๋ƒ
# 2. 0์„ ์ œ์™ธํ•œ ์ฒซ ๋ฒˆ์งธ ์ˆ˜๊ฐ€ ์ž˜ ๋‚˜์˜ค๋А๋ƒ
# 3. ๋งˆ์ง€๋ง‰ ์ผ€์ด์Šค๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ€๋А๋ƒ

# ๋Œ€๋ถ€๋ถ„์˜ ์ผ€์ด์Šค๋Š” queue์— ๋‹ด์„๋•Œ์™€ ๋‚˜์˜ฌ๋•Œ๊ฐ€ ๋ฌธ์ œ๋‹ค.
# while queue ํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ์— queue๋ฅผ ๋‹ด๋Š”๋ฐ, ๊ทธ๋•Œ ๋๋‚˜๋ฒ„๋ฆด์ˆ˜๋„ ์žˆ๋‹ค.
# ๊ทธ๋ž˜์„œ queue์— ๋‹ด์„ ๋•Œ๋„ ์ฒดํฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
# ๊ทธ๋ฆฌ๊ณ  ๋ณดํ†ต queue ์•ˆ์—์„œ return ํ• ๋•Œ๊ฐ€ ์•„๋‹Œ ๋๋‚˜๊ณ  ๊ฒฐ๊ณผ ๋ณด๊ณ  return ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€
# ์žˆ๋Š”๋ฐ ๊ทธ๋•Œ๋„ ํ•œ๋ฒˆ ๋” ์ฒดํฌํ•ด์ฃผ๊ณ  return ํ•ด์•ผ ํ•œ๋‹ค.
from _collections import deque

def solution(begin, target, words):
    queue = deque()
    for word in words:
        if isword(begin,word):
            # ์ด๊ฑธ ๊ณ ๋ ค์•ˆํ•ด์„œ ํ‹€๋ฆผ
            # while queue ๋Œ๊ธฐ ์ „์— ๋๋‚˜๋Š” ๊ฒฝ์šฐ ( 0์„ ์ œ์™ธํ•œ ์ฒซ ๋ฒˆ์งธ ์ˆ˜)
            # ์ด๊ฑธ ํ•ญ์ƒ ๊ณ ๋ คํ•ด ์ค˜์•ผ ํ•œ๋‹ค.
            if word == target:
                return 1
            else:
                queue.append((word,[word]))
    while queue:
        print(queue)
        now , step = queue.popleft()
        for word in words:
            if word not in step and isword(now,word):
                if word == target:
                    return len(step)+1
                else:
                    queue.append((word,step+[word]))
    return 0

def isword(now,word):
    cnt = 0
    for idx,alpha in enumerate(word):
        if alpha != now[idx]:
            cnt += 1
    if cnt == 1:
        return True
    else:
        return False
  • 0911 ๋ชจ๋ž˜์„ฑ (very good)
# N = 1000 ์ด๊ธฐ ๋•Œ๋ฌธ์— ์™ ๋งŒํ•˜๋ฉด N * N ์œผ๋กœ ํ•œ๋ฒˆ ๋Œ์•„์•ผํ•จ.
# ๋ฌด์กฐ๊ฑด bfs 1๋ฒˆ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ.

# ์–ด๋–ป๊ฒŒ๋“  bfs ํ•œ๋ฒˆ์œผ๋กœ ๋Œ์•„์„œ ํ’€์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ ๊ทธ๋ ‡๊ฒŒ ํ’€๋ ค๋Š” ์•„์ด๋””์–ด๋ฅผ ๋‚ด์•ผํ•œ๋‹ค.

# ์•ˆํ’€๋ฆด๋•Œ๋Š” ๋ฌด์กฐ๊ฑด ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•ด ๋ด์•ผํ•œ๋‹ค.

# 1. 0์—์„œ ๋”ํ•˜๋Š” ๊ฑฐ ๋Œ€์‹  ์ „์ฒด์—์„œ ๋นผ๋Š”๊ฑฐ
# 2. ๋ชจ๋ž˜์˜ ์‹œ์ ์ด ์•„๋‹Œ ๋ฌผ์˜ ์‹œ์ ์—์„œ ๋ณด๋Š” ๊ฒƒ

# ๋งจ ์ฒ˜์Œ ์ฝ”๋“œ

# queue์˜ ๋‹จ๊ณ„๋ฅผ ๋‚˜๋ˆ ์„œ ํ‘ธ๋Š” ๋ฌธ์ œ
# ์–ด์ฐจํ”ผ queue๊ฐ€ ๋‹ด๊ธฐ๋Š”๊ฒŒ ์žˆ๊ณ  ์—†์œผ๋ฉด return

from _collections import deque

def iswall(x,y):
    if x < 0 or y < 0 : return False
    elif x >= N or y >= M : return False
    else: return True

def init():
    queue,next = deque(), deque()
    for i in range(N):
        for j in range(M):
            if matrix[i][j] == 0 and not visited[i][j]:
                queue.append((i,j))
                visited[i][j] = 1
                while queue:
                    x,y = queue.popleft()
                    for k in range(8):
                        nx,ny = x+dx[k],y+dy[k]
                        if iswall(nx,ny):
                            if matrix[nx][ny] != 0:
                                matrix[nx][ny] -= 1
                                if matrix[nx][ny] == 0:
                                    next.append((nx,ny))
                                    visited[nx][ny] = 1
                            elif not visited[nx][ny]:
                                queue.append((nx,ny))
                                visited[nx][ny] = 1
    return next

def solve(queue):
    next = deque()
    while queue:
        x, y = queue.popleft()
        for k in range(8):
            nx, ny = x + dx[k], y + dy[k]
            if iswall(nx, ny):
                if matrix[nx][ny] != 0:
                    matrix[nx][ny] -= 1
                    if matrix[nx][ny] == 0:
                        next.append((nx, ny))
                        visited[nx][ny] = 1
    return next
global N,M
N, M = map(int,input().split())
# 1~9์˜ ์ˆซ์ž ํ˜น์€ '.' ๋นˆ ๋ชจ๋ž˜
matrix = []
for i in range(N):
    temp = list(input())
    for j in range(M):
        if temp[j] == '.':
            temp[j] = 0
        else:
            temp[j] = int(temp[j])
    matrix.append(temp)
visited = [[0 for _ in range(M)] for _ in range(N)]
# ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ์ž
dx = [-1,-1,0,1,1,1,0,-1]
dy = [0,1,1,1,0,-1,-1,-1]
next = init()
result = 0
while next:
    result += 1
    next = solve(next)
print(result)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors