Po_tta_tt0
콩심콩 팥심팥 🌱
Po_tta_tt0
전체 방문자
오늘
어제
  • 분류 전체보기 (266)
    • 🐛 회고 (14)
    • 💭 생각 (2)
    • 🤸‍♀️ 내 프로젝트 (16)
      • FISH-NEWS (8)
      • MBTI 과몰입 테스트 (2)
      • twitter clonecoding with TS (4)
      • pilzagenda (2)
    • 👨‍👩‍👧‍👦 팀 프로젝트 (2)
      • 피우다 프로젝트 (0)
      • SEMO(세상의 모든 모임) (1)
      • 마음을 전하는 텃밭 (1)
      • Stackticon (0)
    • 👨‍💻 CS지식 (11)
    • ✍ 공부 (94)
      • JavaScript (21)
      • TypeScript (39)
      • Html (0)
      • CSS (2)
      • React (18)
      • NextJS (7)
      • Vue (1)
      • Python (1)
      • Django (0)
      • 개발환경 & 그 외 (2)
    • 🏄‍♀️ 코딩테스트 (99)
      • 🐍 Python (99)
    • 🐙 Git & GitHub (3)
    • 📑 오류기록 (8)
    • 📚 우리를 위한 기록 (9)
    • 수업 (3)
    • 강의 등 (2)
    • 👩‍🎓 SSAFY (0)
    • 👋 우테코 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 플로이드 워셜
  • react-router-dom
  • Next.js
  • 백준
  • 시뮬레이션
  • bfs
  • dfs
  • 문자열
  • js
  • 파이썬 감시 피하기
  • 이분탐색
  • React
  • BFS + DP
  • 백준 숨바꼭질
  • 구현
  • 자바스크립트
  • DP
  • 백준 파이썬
  • 파이썬
  • 파이썬 다익스트라

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Po_tta_tt0

콩심콩 팥심팥 🌱

🏄‍♀️ 코딩테스트/🐍 Python

[ 백준 2665 해설 ] ( python ) 미로만들기

2022. 7. 12. 22:40
반응형

 

📚 미로만들기

 

 

문제

 

n×n 바둑판 모양으로 총 n2개의 방이 있다. 일부분은 검은 방이고 나머지는 모두 흰 방이다. 검은 방은 사면이 벽으로 싸여 있어 들어갈 수 없다. 서로 붙어 있는 두 개의 흰 방 사이에는 문이 있어서 지나다닐 수 있다. 윗줄 맨 왼쪽 방은 시작방으로서 항상 흰 방이고, 아랫줄 맨 오른쪽 방은 끝방으로서 역시 흰 방이다.

시작방에서 출발하여 길을 찾아서 끝방으로 가는 것이 목적인데, 아래 그림의 경우에는 시작방에서 끝 방으로 갈 수가 없다. 부득이 검은 방 몇 개를 흰 방으로 바꾸어야 하는데 되도록 적은 수의 방의 색을 바꾸고 싶다.

아래 그림은 n=8인 경우의 한 예이다.

위 그림에서는 두 개의 검은 방(예를 들어 (4,4)의 방과 (7,8)의 방)을 흰 방으로 바꾸면, 시작방에서 끝방으로 갈 수 있지만, 어느 검은 방 하나만을 흰 방으로 바꾸어서는 불가능하다. 검은 방에서 흰 방으로 바꾸어야 할 최소의 수를 구하는 프로그램을 작성하시오.

단, 검은 방을 하나도 흰방으로 바꾸지 않아도 되는 경우는 0이 답이다.

 

입력

첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다.

 

출력

첫 줄에 흰 방으로 바꾸어야 할 최소의 검은 방의 수를 출력한다.

 

예제 입력 1 복사

8
11100110
11010010
10011010
11101100
01000111
00110001
11011000
11000111

예제 출력 1 복사

2

 

 

✍ 접근

  • 다익스트라. 최단거리
  • 알고스팟 문제가 떠올랐다

 

 

 

 

정답코드

# ✨ 입력
import sys
import heapq
input = sys.stdin.readline
N = int(input())
INF = 2147000000
board = [list(map(int,input().rstrip())) for _ in range(N)]
ch_board = [[INF]*N for _ in range(N)]

dx = [-1,0,1,0]
dy = [0,-1,0,1]

# ✨ 다익스트라
def dj(d,x,y):
    hq = []
    heapq.heappush(hq,(d,x,y))
    ch_board[x][y] = d
    while hq:
        dd,xx,yy = heapq.heappop(hq)
        if xx == N-1 and yy == N-1:
            print(dd)
            break
        for i in range(4):
            nx = xx + dx[i]
            ny = yy + dy[i]
            if 0<=nx<N and 0<=ny<N and ch_board[nx][ny]> dd+1:
                if board[nx][ny] == 0:
                    ch_board[nx][ny] = min(ch_board[nx][ny],dd+1)
                else:
                    ch_board[nx][ny] = min(ch_board[nx][ny],dd)
                heapq.heappush(hq,(ch_board[nx][ny],nx,ny))
                    
dj(0,0,0)

해설

입력

  • 문제에서 나온 값을 입력받는다
  •  board와 뚫을 벽을 세어주고 방문을 측정하는 ch_board를 만들어준다

다익스트라

  • hq에 거리,좌표순으로 heappush해준다
  • hq가 존재할 때
    BFS문제처럼 풀고
    • 만약 검은 벽이라면 ch_board를 전 ch_board에서 1을 더해주고
    • 흰 벽이라면 ch_board 값(최소로 뚫은 벽의 값)을 전의 값으로 넘겨준다

 

 

정답코드 2 (알고스팟)

# ✨ 입력
import sys
from collections import deque
input = sys.stdin.readline
N = int(input())
board = [list(map(int,input().rstrip())) for _ in range(N)]
ch_board = [[-1]*N for _ in range(N)]

dx = [-1,0,1,0]
dy = [0,-1,0,1]

# ✨ BFS
def BFS(x,y):
    dq = deque([])
    dq.append((x,y))
    ch_board[x][y] = 0
    while dq:
        xx,yy = dq.popleft()
        for i in range(4):
            nx = xx+dx[i]
            ny = yy+dy[i]
            if 0<=nx<N and 0<=ny<N and ch_board[nx][ny] == -1 :
                if board[nx][ny] == 1:
                    ch_board[nx][ny] = ch_board[xx][yy]
                    dq.appendleft((nx,ny))
                else:
                    ch_board[nx][ny] = ch_board[xx][yy]+1
                    dq.append((nx,ny))
    print(ch_board[N-1][N-1])

                    
BFS(0,0)

해설

입력

  • 문제에서 나온 값을 입력받는다
  •  board와 뚫을 벽을 세어주고 방문을 측정하는 ch_board를 만들어준다

BFS

  • 위 해설과 거의 같다 + 일반 BFS 풀이와 거의 같다
  • 다른 점이 있다면 appendleft()로 흰 벽을 지나는 경우를 먼저 생각해주는 것!!!!

 

 

 

 

⭐ 배움

  • 알고스팟도 dijkstra로 풀 수 있지 않을까!?!!!?!?!??!?
반응형
저작자표시 (새창열림)

'🏄‍♀️ 코딩테스트 > 🐍 Python' 카테고리의 다른 글

[ 백준 10610 해설 ] ( python ) 30  (0) 2022.07.13
[ 백준 14889 해설 ] ( python ) 스타트와 링크  (1) 2022.07.13
[ 백준 18405 해설 ] ( python ) 경쟁적 전염  (0) 2022.07.05
[ 백준 14891 해설 ] ( python ) 톱니바퀴  (0) 2022.07.04
[ 백준 14500 해설 ] ( python ) 테트로미노  (0) 2022.06.30
    '🏄‍♀️ 코딩테스트/🐍 Python' 카테고리의 다른 글
    • [ 백준 10610 해설 ] ( python ) 30
    • [ 백준 14889 해설 ] ( python ) 스타트와 링크
    • [ 백준 18405 해설 ] ( python ) 경쟁적 전염
    • [ 백준 14891 해설 ] ( python ) 톱니바퀴
    Po_tta_tt0
    Po_tta_tt0
    감자의 코딩하는 블로그 콩심은데 콩나고 팥심은데 팥난다

    티스토리툴바