반응형
snowman95
코딩수련장
snowman95
전체 방문자
오늘
어제
  • 분류 전체보기 (229)
    • 앱테크 (3)
    • 옵시디언 (5)
    • 드라마, 영화 (1)
    • 개발자 이야기 (23)
    • 프로젝트 (10)
      • 프로젝트 방법론 (7)
      • 프로젝트 기록 (2)
      • Github (1)
    • 개발 지식 (0)
      • 디자인 패턴 (0)
    • 프론트엔드 개발 (5)
      • 테크트리 (2)
      • React.js (19)
      • ReactNative (2)
      • Next.js (6)
      • GraphQL (6)
      • 패키지 매니저 (2)
      • 라이브러리 (3)
      • 상태관리 라이브러리 (4)
      • Web 지식 (3)
      • HTML CSS (26)
      • Javascript (16)
      • 도구 (Tool) (3)
      • 성능 최적화 (1)
      • 디자인시스템 (0)
    • Python (53)
      • 모음집 (1)
      • 문법 (12)
      • 라이브러리 (15)
      • 알고리즘 (10)
      • 백준 문제풀이 (9)
      • 코딩테스트 (2)
      • 도구 (Tool) (3)
    • C++ (20)
      • 알고리즘 (6)
      • 삼성SW기출 (6)
      • 삼성 A형 (6)
    • 데이터사이언스 (1)
    • 인프라 (9)
      • 하드웨어 지식 (4)
      • Ansible (2)
      • Database (2)
      • 쉘스크립트 (1)
    • 주식 (0)
    • 취업 준비 (4)
      • 취업 이야기 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 전공 요약 #운영체제
  • 알고리즘
  • A형
  • 티스토리챌린지
  • 전공 요약 #데이터베이스
  • 언어
  • Next.js #graphql #tailwind.css
  • 삼성SDS
  • 삼성SW역량테스트
  • 백준
  • 기계식키보드 #nuphy
  • nextjs
  • 전공 요약 #네트워크
  • 전공요약
  • 오블완
  • C++
  • 나의 해방일지
  • GraphQL
  • 면접
  • 공간복잡도

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
snowman95

코딩수련장

Python/백준 문제풀이

파이썬(python) 백준 2206 : 벽 부수고 이동하기

2021. 5. 2. 00:59
728x90
반응형
 

2206번: 벽 부수고 이동하기

N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로

www.acmicpc.net

문제 내용

시간 제한 : 2 초

메모리 : 192 MB

 

N×M의 행렬로 표현되는 맵에서 (1, 1)에서 (N, M)로 이동할때 최단 경로로 이동

이동은 4방향이다. 시작, 끝점 카운트해서 최단경로 길이 구하라.

이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동해도 됨

  • 0은 이동할 수 있는 곳
  • 1은 이동할 수 없는 벽이 있는 곳

입력

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)이 주어진다.

다음 N개의 줄에 M개의 숫자로 맵이 주어진다.

(1, 1)과 (N, M)은 항상 0이라고 가정하자.

 

출력

최단거리 출력. 불가능하면 -1

 

예제 입력 1

8 8
01000100
01010100
01010100
01010100
01010100
01010100
01010100
00010100

 

예제 출력 1 

29


유형

  • 그래프 이론
  • 그래프 탐색
  • 너비 우선 탐색

풀이

최단경로를 구하는 문제이므로 DFS와 BFS 를 생각해낼 수 있는데

가중치가 없는 최단경로 문제이므로 이 문제는 BFS 문제다.

또한 최단거리를 구해야 하므로 visited 배열에 방문여부가 아닌 최단길이를 갱신해나간다.

여기까지는 평범한데 이 문제는 갈 수 없는 곳을 1회 지나갈 수 있으므로 추가적인 처리가 필요하다.

 

1) 진행 상황에 내가 벽을 부쉈는지 안부쉈는지 여부를 추가해줘야 한다

(x위치, y위치, 현재경로길이, 벽을 부쉈는지 여부(True/False)

 

2) 벽을 부수고 지나가는 경우와 벽을 부수지 않은 경우가 같은 배열에 기록되면 혼란이 오므로 분리해야 한다.

아래의 예시를 보자.
벽을 부수고 지나간 경우가 더 빠르다고 기록했었는데 알고보니 그 끝에 막다른 길이 있었고
부수지 않은 경우가 처음엔 느리지만 마지막에 벽을 뚫어서 도착지에 도달할 수 있다.

만약 같은 배열에 쓰면 엉망이 되어버릴 것이다.

01000100
01010100
01010100
01010100
01010100
01010100
01010100
00010100

 

그러므로 아래와 같이 배열을 분리하여 각각 다르게 진행시키면 해결된다.

  1. 벽을 안부순 경우의 최단경로 저장 배열
  2. 벽을 부순 경우의 최단경로 저장 배열
import sys
import collections
n,m= map(int, sys.stdin.readline().split())
board = [sys.stdin.readline().rstrip() for _ in range(n)]
move_arr = [[[int(1e9)]*m for _ in range(n)] for _ in range(2)]
dx = [1,-1,0,0]
dy = [0,0,-1,1]
min_day = 999999

q = collections.deque([(0,0,1,False)])
move_arr[0][0][0] = 1
move_arr[1][0][0] = 1

while q:
    cur = q.popleft()
    if cur[0]==n-1 and cur[1]==m-1:
        min_day = min(min_day, cur[2])
    for i in range(4):
        xx = dx[i]+cur[0]
        yy = dy[i]+cur[1]
        if xx >=0 and yy>=0 and xx<n and yy<m:
            next_day = cur[2]+1
            broken = cur[3]
            if  board[xx][yy] == '0':
                if move_arr[broken][xx][yy] > next_day:
                    move_arr[broken][xx][yy] = next_day
                    q.append((xx,yy,next_day,broken))
            else:
                if broken == False and move_arr[1][xx][yy] > next_day:
                    move_arr[1][xx][yy] = next_day
                    q.append((xx,yy,next_day, True))

if min_day == 999999:
    print(-1)
else:
    print(min_day)

 

반응형
저작자표시 동일조건 (새창열림)

'Python > 백준 문제풀이' 카테고리의 다른 글

파이썬(python) 백준 16236 : 아기 상어  (2) 2021.05.25
파이썬(python) 백준 14496 : 그대, 그머가 되어  (0) 2021.05.19
파이썬(python) 백준 7576 : 토마토  (0) 2021.05.01
파이썬(python) 백준 2580 : 스도쿠  (0) 2021.04.22
파이썬 (python) 백준 13305 : 주유소  (0) 2021.04.22
    'Python/백준 문제풀이' 카테고리의 다른 글
    • 파이썬(python) 백준 16236 : 아기 상어
    • 파이썬(python) 백준 14496 : 그대, 그머가 되어
    • 파이썬(python) 백준 7576 : 토마토
    • 파이썬(python) 백준 2580 : 스도쿠
    snowman95
    snowman95
    (17~19) Unity/Unreal Engine 게임 프로그래머 (20~21) System Administrator ___________ (22~) React 웹 프론트앤드 개발자 __________ 깃헙 : https://github.com/snowman95

    티스토리툴바