김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 원격저장소
  • KMU_WINK
  • Remote저장소
  • local저장소
  • GitHubDesktop
  • 깃허브데스크탑
  • ㄱ
  • 로컬저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

•알고리즘(Algorithm )/문제풀이

[백준6593&파이썬] BFS로 3차원 공간을 탐색할 수 있다.

2023. 4. 9. 20:21

# 문제

백준 6593 상범빌딩 파이썬 풀이

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

# 코드

import sys
from collections import deque

dirs = [
  (-1, 0, 0),  # 아래
  (0, -1, 0), (0, 0, 1), (0, 1, 0), (0, 0, -1),  # 상하좌우
  (1, 0, 0)  # 위로
  ]


def solve(L, R, C):
  board = list()
  start_point = [-1, -1, -1]
  flag = True

  ### BOARD 구성 ###
  for l in range(L):
    temp = list()
    for r in range(R + 1):
      inputStr = str(sys.stdin.readline().strip())
      line = list(inputStr)
      if len(line) == 0:
        continue
      if flag and 'S' in inputStr:
        c = inputStr.find('S')
        if c != -1:
          start_point[0] = l
          start_point[1] = r
          start_point[2] = c
          flag = False

      temp.append(line)
    board.append(temp)

  # print(board)
  # print("start_point : ", start_point)
  #####################

  dq = deque()
  dq.append((start_point[0], start_point[1], start_point[2], 0))  # 초기 시작값
  board[start_point[0]][start_point[1]][start_point[2]] = "#"  # # 방문 처리

  while len(dq) != 0:
    cur = dq.popleft()  # 꺼내기

    for dir in dirs:
      next = (cur[0] + dir[0], cur[1] + dir[1], cur[2] + dir[2], cur[3] + 1)

      if 0 <= next[0] < L and 0 <= next[1] < R and 0 <= next[2] < C:  # 범위 안인지 확인
        if board[next[0]][next[1]][next[2]] == ".":  # 갈 수 있는 곳인지 확인
          dq.append(next)  # 추가해주기
          board[next[0]][next[1]][next[2]] = "#"  # 방문처리

        elif board[next[0]][next[1]][next[2]] == "E":  # 목표 지점이면
          return next[3]  # 끝내기
  return -1


while True:
  L, R, C = map(int, sys.stdin.readline().split())
  # L 층 수
  # R 행, C 열
  if L == 0 and R == 0 and C == 0:
    break
  result = solve(L, R, C)
  if result == -1:
    print("Trapped!")
  else:
    print(f"Escaped in {result} minute(s).")

 

# 풀이

## BFS로 3차원 공간을 탐색할 수 있다.

dirs = [
  (-1, 0, 0),  # 아래
  (0, -1, 0), (0, 0, 1), (0, 1, 0), (0, 0, -1),  # 상하좌우
  (1, 0, 0)  # 위로
  ]
  • 3차원은 그냥 하나의 차원만 추가시키면 된다 별로 어렵지 않다.  대신 범위도 한차원 추가해서 검사해야 한다.
if 0 <= next[0] < L and 0 <= next[1] < R and 0 <= next[2] < C:  # 범위 안인지 확인

 

## 시작 지점을 기록한다면 꽤 유용하게 사용된다.

  • 문제에서 시작위치가 "S"가 되게 된다. 이 "S" 를 문자를 입력받을때 미리 저장해둔다면, 추후에 모든 3차원 공간을 for문을 돌면서 S를 찾을 필요가 없다. 
  if flag and 'S' in inputStr:
    c = inputStr.find('S')

 

## 문자열을 이용하지말고, 한 문자씩 배열에 담아야지 수정이 가능하다.

  • 문자열(STRING)을 리스트에 한글자씩 쪼개서 담으려면 .split()을 이용하는 것이 아니다. 문자열을 list()로 만들면 된다.
  • 백준 문제를 풀때는 아래와 같이 이용하자
inputStr = str(sys.stdin.readline().strip())
line = list(inputStr)

 

## find 메소드를 사용하자

  • find는 문자열에서 문자열을 찾아준다. 찾는다면 해당 인덱스를 찾지 못한다면 -1을 리턴한다.
c = inputStr.find('S')
if c != -1:
  start_point[0] = l
  start_point[1] = r
  start_point[2] = c

 

## 찾을 문자 in 문자열 이다.

if 'S' in inputStr:

이건 맨날 헷갈린다. "S"가 문자열 안에 있냐? 로 생각하자

 

## l[0] == 'S' 와 l[0] =="S"는 똑같으니까 시간날리지 말자

l = ['S',"S",'E',"E"]
print(l)

if l[0] == 'S' : # or l[0] == "S"
  print(True)
else :
  print(False)
  • 해보니까 똑같다. 이걸로 시간 날리지 말자
저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준2573&파이썬] BFS를 활용할때는 단계적으로 잘 나누어 풀자  (0) 2023.04.11
[백준2206&파이썬] BFS에서 이동상태가 분리된다면 방문 확인도 분리시켜야 한다.  (0) 2023.04.10
[백준2468&파이썬] BFS를 사용할때 탐색 단위에 대한 생각이 필요하다.  (0) 2023.04.08
[백준5014&파이썬] BFS은 1차원에서도 최단거리를 구할 수 있다.  (0) 2023.04.08
[백준2583&파이썬] 좌표평면을 배열로 표현하는 방법  (0) 2023.04.06
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준2573&파이썬] BFS를 활용할때는 단계적으로 잘 나누어 풀자
    • [백준2206&파이썬] BFS에서 이동상태가 분리된다면 방문 확인도 분리시켜야 한다.
    • [백준2468&파이썬] BFS를 사용할때 탐색 단위에 대한 생각이 필요하다.
    • [백준5014&파이썬] BFS은 1차원에서도 최단거리를 구할 수 있다.
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바