Algorithm Problem/Python

[python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค (2020 ์นด์นด์˜ค ์ธํ„ด์‹ญ)

deo2kim 2020. 8. 30. 08:52
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

1. visited = {} ํ˜„์žฌ์œ„์น˜ x, y, ํ˜„์žฌ์œ„์น˜์—์„œ ๋ฐ”๋กœ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ ์„ ํ‚ค๊ฐ’์œผ๋กœ, ํ˜„์žฌ์œ„์น˜๊นŒ์ง€ ์˜ค๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์„ ๋ฒจ๋ฅ˜๊ฐ’์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค. ( 0, 1, 2, 3 | ์ƒ ํ•˜ ์ขŒ ์šฐ )

2. q = deque() visited์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  BFS๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ.

 ( ์œ„์น˜ x,y, ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ k, ๋น„์šฉ )

3. BFS๋ฅผ ๋Œ๋ฉฐ ํ˜„์žฌ ๋ฐฉํ–ฅ d ์™€ ์•ž์œผ๋กœ์˜ ๋ฐฉํ–ฅ k๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋„๋กœ๊ฑด์„ค ๋น„์šฉ์„ ์ฑ…์ •ํ•œ๋‹ค.

4. ๋์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ตœ์†Œ๋น„์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 ( ๋์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ์ด๋ฏ€๋กœ ๋๋‚  ๋•Œ ๊นŒ์ง€ ๋น„๊ตํ•ด์ค€๋‹ค. )

 

๐Ÿ’จ ๋„ˆ๋ฌด ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ... ๋ช‡์‹œ๊ฐ„๋™์•ˆ ํ‘ผ๊ฑฐ๊ฐ™๋‹ค. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š”๊ฒŒ ์ค‘์š”!!

 

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

from collections import deque

def solution(board):
    answer = 0
    answer = 999999
    q = deque()
    q.append((0, 0, 4, 0))

    visited = {  
        (0, 0, 1): 0,  # (x, y, ํ˜„์žฌ์œ„์น˜(x, y)์—์„œ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ): ํ˜„์žฌ์œ„์น˜๊นŒ์ง€ ์˜ค๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ
        (0, 0, 3): 0,  # 0, 1, 2, 3 | ์ƒ ํ•˜ ์ขŒ ์šฐ
    }
    dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
    while q:
        x, y, d, c = q.popleft()

        # ๋งˆ์ง€๋ง‰์— ๋„๋‹ฌ ํ–ˆ์„ ๋•Œ ์ตœ์†Ÿ๊ฐ’์„ ๊ฒฐ๊ณผ์— ๋„ฃ๋Š”๋‹ค.
        if x == len(board) - 1 and y == len(board) - 1:
            answer = min(answer, c)

        for k in range(len(dx)):
            nx = x + dx[k]
            ny = y + dy[k]
            if 0 <= nx < len(board) and 0 <= ny < len(board) and board[nx][ny] == 0:
                nc = c
                if d == 4:  # ๋งจ์ฒ˜์Œ์—” ์–ด๋Š๋ฐฉํ–ฅ์œผ๋กœ๋‚˜ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง์„ ๋„๋กœ ํ•œ๋‹ค.
                    nc += 100
                elif d <= 1 and k <= 1: # ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ๊ณผ ์ง„ํ–‰ ๋ฐฉํ–ฅ์ด ์„ธ๋กœ์ผ ๋•Œ
                    nc += 100
                elif d >= 2 and k >= 2: # ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ๊ณผ ์ง„ํ–‰ ๋ฐฉํ–ฅ์ด ๊ฐ€๋กœ์ผ ๋•Œ
                    nc += 100
                else: # ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ๊ณผ ์ง„ํ–‰ ๋ฐฉํ–ฅ์ด ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ | ์ฝ”๋„ˆ์™€ ์ง์„ ์ด ์ƒ๊ธฐ๋ฏ€๋กœ 600์›
                    nc += 500 + 100
                # ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๊ฑฐ๋‚˜, ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ์–ด๋„ ๊ธฐ์กด์˜ ๋น„์šฉ๋ณด๋‹ค ์ง€๊ธˆ ์˜จ ๊ฒฝ๋กœ์˜ ๋น„์šฉ(nc))๊ฐ€ ์ ๋‹ค๋ฉด
                if not visited.get((nx, ny, k)) or visited[(nx, ny, k)] > nc:
                    visited[(nx, ny, k)] = nc  # ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, nc๋ฅผ ๊ฐฑ์‹ ํ•ด ์ค€๋‹ค.
                    q.append((nx, ny, k, nc))  # ๋‹ค์Œ ์ถœ๋ฐœ ์ง€๋ฅผ q์— ๋„ฃ์–ด์ค€๋‹ค.
    
    return answer

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/67259

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค

[[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]] 3800 [[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]] 2100 [[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[

programmers.co.kr

 


๋ฌธ์ œ ์„ค๋ช…

๊ฑด์„คํšŒ์‚ฌ์˜ ์„ค๊ณ„์‚ฌ์ธ ์ฃ ๋ฅด๋””๋Š” ๊ณ ๊ฐ์‚ฌ๋กœ๋ถ€ํ„ฐ ์ž๋™์ฐจ ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค์— ํ•„์š”ํ•œ ๊ฒฌ์ ์„ ์˜๋ขฐ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
์ œ๊ณต๋œ ๊ฒฝ์ฃผ๋กœ ์„ค๊ณ„ ๋„๋ฉด์— ๋”ฐ๋ฅด๋ฉด ๊ฒฝ์ฃผ๋กœ ๋ถ€์ง€๋Š” N x N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ๊ฒฉ์ž ํ˜•ํƒœ์ด๋ฉฐ ๊ฐ ๊ฒฉ์ž๋Š” 1 x 1 ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
์„ค๊ณ„ ๋„๋ฉด์—๋Š” ๊ฐ ๊ฒฉ์ž์˜ ์นธ์€ 0 ๋˜๋Š” 1 ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์œผ๋ฉฐ, 0์€ ์นธ์ด ๋น„์–ด ์žˆ์Œ์„ 1์€ ํ•ด๋‹น ์นธ์ด ๋ฒฝ์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
๊ฒฝ์ฃผ๋กœ์˜ ์ถœ๋ฐœ์ ์€ (0, 0) ์นธ(์ขŒ์ธก ์ƒ๋‹จ)์ด๋ฉฐ, ๋„์ฐฉ์ ์€ (N-1, N-1) ์นธ(์šฐ์ธก ํ•˜๋‹จ)์ž…๋‹ˆ๋‹ค. ์ฃ ๋ฅด๋””๋Š” ์ถœ๋ฐœ์ ์ธ (0, 0) ์นธ์—์„œ ์ถœ๋ฐœํ•œ ์ž๋™์ฐจ๊ฐ€ ๋„์ฐฉ์ ์ธ (N-1, N-1) ์นธ๊นŒ์ง€ ๋ฌด์‚ฌํžˆ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ค‘๊ฐ„์— ๋Š๊ธฐ์ง€ ์•Š๋„๋ก ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฒฝ์ฃผ๋กœ๋Š” ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋‘ ๋นˆ ์นธ์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ฑด์„คํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฒฝ์ด ์žˆ๋Š” ์นธ์—๋Š” ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด๋•Œ, ์ธ์ ‘ํ•œ ๋‘ ๋นˆ ์นธ์„ ์ƒํ•˜ ๋˜๋Š” ์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฒฝ์ฃผ๋กœ๋ฅผ ์ง์„  ๋„๋กœ ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๋‘ ์ง์„  ๋„๋กœ๊ฐ€ ์„œ๋กœ ์ง๊ฐ์œผ๋กœ ๋งŒ๋‚˜๋Š” ์ง€์ ์„ ์ฝ”๋„ˆ ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
๊ฑด์„ค ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด ๋ณด๋‹ˆ ์ง์„  ๋„๋กœ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” 100์›์ด ์†Œ์š”๋˜๋ฉฐ, ์ฝ”๋„ˆ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค ๋•Œ๋Š” 500์›์ด ์ถ”๊ฐ€๋กœ ๋“ญ๋‹ˆ๋‹ค.
์ฃ ๋ฅด๋””๋Š” ๊ฒฌ์ ์„œ ์ž‘์„ฑ์„ ์œ„ํ•ด ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๊ทธ๋ฆผ์€ ์ง์„  ๋„๋กœ 6๊ฐœ์™€ ์ฝ”๋„ˆ 4๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ ์ž„์˜์˜ ๊ฒฝ์ฃผ๋กœ ์˜ˆ์‹œ์ด๋ฉฐ, ๊ฑด์„ค ๋น„์šฉ์€ 6 x 100 + 4 x 500 = 2600์› ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ, ์•„๋ž˜ ๊ทธ๋ฆผ์€ ์ง์„  ๋„๋กœ 4๊ฐœ์™€ ์ฝ”๋„ˆ 1๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ์ฃผ๋กœ์ด๋ฉฐ, ๊ฑด์„ค ๋น„์šฉ์€ 4 x 100 + 1 x 500 = 900์› ์ž…๋‹ˆ๋‹ค.


๋„๋ฉด์˜ ์ƒํƒœ(0์€ ๋น„์–ด ์žˆ์Œ, 1์€ ๋ฒฝ)์„ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด board๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

[์ œํ•œ์‚ฌํ•ญ]

  • board๋Š” 2์ฐจ์› ์ •์‚ฌ๊ฐ ๋ฐฐ์—ด๋กœ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 3 ์ด์ƒ 25 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • board ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ์˜ ๊ฐ’์€ 0 ๋˜๋Š” 1 ์ž…๋‹ˆ๋‹ค.
    • ๋„๋ฉด์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์ƒ๋‹จ ์ขŒํ‘œ๋Š” (0, 0)์ด๋ฉฐ, ๊ฐ€์žฅ ์šฐ์ธก ํ•˜๋‹จ ์ขŒํ‘œ๋Š” (N-1, N-1) ์ž…๋‹ˆ๋‹ค.
    • ์›์†Œ์˜ ๊ฐ’ 0์€ ์นธ์ด ๋น„์–ด ์žˆ์–ด ๋„๋กœ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•จ์„ 1์€ ์นธ์ด ๋ฒฝ์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์–ด ๋„๋กœ ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • board๋Š” ํ•ญ์ƒ ์ถœ๋ฐœ์ ์—์„œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ถœ๋ฐœ์ ๊ณผ ๋„์ฐฉ์  ์นธ์˜ ์›์†Œ์˜ ๊ฐ’์€ ํ•ญ์ƒ 0์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

boardresult

[[0,0,0],[0,0,0],[0,0,0]] 900
[[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]] 3800
[[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]] 2100
[[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[0,1,0,0,0,1],[0,0,0,0,0,0]] 3200

์ž…์ถœ๋ ฅ ์˜ˆ์— ๋Œ€ํ•œ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1

๋ณธ๋ฌธ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #2

์œ„์™€ ๊ฐ™์ด ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋ฉด ์ง์„  ๋„๋กœ 18๊ฐœ, ์ฝ”๋„ˆ 4๊ฐœ๋กœ ์ด 3800์›์ด ๋“ญ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #3

์œ„์™€ ๊ฐ™์ด ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋ฉด ์ง์„  ๋„๋กœ 6๊ฐœ, ์ฝ”๋„ˆ 3๊ฐœ๋กœ ์ด 2100์›์ด ๋“ญ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #4

๋ถ‰์€์ƒ‰ ๊ฒฝ๋กœ์™€ ๊ฐ™์ด ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•˜๋ฉด ์ง์„  ๋„๋กœ 12๊ฐœ, ์ฝ”๋„ˆ 4๊ฐœ๋กœ ์ด 3200์›์ด ๋“ญ๋‹ˆ๋‹ค.
๋งŒ์•ฝ, ํŒŒ๋ž€์ƒ‰ ๊ฒฝ๋กœ์™€ ๊ฐ™์ด ๊ฒฝ์ฃผ๋กœ๋ฅผ ๊ฑด์„คํ•œ๋‹ค๋ฉด ์ง์„  ๋„๋กœ 10๊ฐœ, ์ฝ”๋„ˆ 5๊ฐœ๋กœ ์ด 3500์›์ด ๋“ค๋ฉฐ, ๋” ๋งŽ์€ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•