220v
젝무의 개발새발
220v
전체 방문자
오늘
어제
  • 분류 전체보기 (255)
    • AI (35)
      • ML, DL 학습 (30)
      • 논문 리뷰 (4)
      • 실습 및 프로젝트 (1)
    • Algorithm (145)
      • LeetCode (13)
      • 프로그래머스 (35)
      • 백준 (96)
      • 알고리즘, 문법 정리 (1)
    • Mobile, Application (17)
      • Flutter (10)
      • iOS, MacOS (7)
    • BackEnd (7)
      • Flask (1)
      • Node.js (5)
      • Spring, JSP..etc (1)
    • Web - FrontEnd (18)
      • JavaScript, JQuery, HTML, C.. (12)
      • React (6)
    • DataBase (1)
      • MySQL (1)
      • Firebase Firestore (0)
      • Supabase (0)
    • Git (1)
    • 기타 툴 및 오류 해결 (3)
    • 강의 (5)
      • Database (3)
      • 암호학 (2)
      • 알고리즘 (0)
    • 후기와 회고 (2)
    • 블로그 꾸미기 (1)
    • 일상과 이것저것 (20)
      • 맛집 (12)
      • 세상사는일 (4)
      • 도서리뷰 (1)
      • 이런저런 생각들 (잡글) (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • disjoint set
  • BFS
  • Greedy
  • Priority Queue
  • Prefix Sum
  • IMPLEMENT
  • REACT
  • Minimum Spanning Tree
  • simulation
  • two pointer
  • 다익스트라
  • Lis
  • top-down
  • 백준
  • implementation
  • brute-Force
  • binary search
  • 오블완
  • bitmasking
  • union-find
  • topological sort
  • Dynamic Programming
  • 티스토리챌린지
  • Mathematics
  • dp
  • dfs
  • 위상 정렬
  • 프로그래머스
  • 구현
  • Backtracking

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
220v

젝무의 개발새발

Algorithm/백준

[백준] 9328. 열쇠 - Python

2024. 2. 13. 15:26

[Gold I]

 

https://www.acmicpc.net/problem/9328

 

9328번: 열쇠

상근이는 1층 빌딩에 침입해 매우 중요한 문서를 훔쳐오려고 한다. 상근이가 가지고 있는 평면도에는 문서의 위치가 모두 나타나 있다. 빌딩의 문은 모두 잠겨있기 때문에, 문을 열려면 열쇠가

www.acmicpc.net

 

풀이

시간초과와 메모리 초과를 몇 번 받다가, 이리저리 최적화하여 Accepted 받은 문제.

 

처음엔 [백준] 1194. 달이 차오른다, 가자. 와 비슷해 보여, 비슷하게 Bitmasking을 이용해 풀이할까 생각했지만,

가능한 열쇠의 개수가 26개이므로, 2^26의 경우의 수를 모두 저장할 수는 없어, 다른 방법을 생각했다.


우선 그래프(지도)의 형태를 입력받을 때, 겉을 빈 공간('.')으로 둘러싼다. (line 10~14)

빌딩 가장자리의 벽이 아닌 곳을 통해 빌딩 안팎을 드나들 수 있으므로, 좌표 (0, 0)부터 시작하여 BFS로 진행할 시, 가장자리의 벽이 아닌 모든 곳에 도달할 수 있게 하기 위함.

 

열쇠 보유 여부는 길이가 26(a~z)인 배열에 0, 1 state로 저장한다. (line 16)

 

이후, 여느 시뮬레이션/구현 BFS 문제와 비슷하게 BFS로 탐색하며 진행하면 되는데, 문에 다다랐을 때, 문에 대한 열쇠가 없다면, 문의 위치를 임시로 저장한 후에, 대응하는 열쇠를 얻었을 때 다시 queue에 append하여 진행한다. (line 41~51)

 

마지막으로, visited 처리는 지나간 칸을 벽('*')으로 변경하며 진행하는 것으로 처리했다.

 

AC.

from collections import deque

T = int(input())
results = []

for _ in range(T):
    h, w = map(int, input().split())

    # 입력
    graph = []
    graph.append(["." for _ in range(w+2)])
    for _ in range(h):
        graph.append(list("."+input()+"."))
    graph.append(["." for _ in range(w+2)])

    keys = [0 for _ in range(26)]  # a~z : 0 초기화
    for k in list(input()):
        if k != "0":
            keys[ord(k) - 97] = 1
            
    # BFS
    dr = [1, 0, -1, 0]
    dc = [0, 1, 0, -1]

    deq = deque([(0,0)])

    papers = 0
    tempDoors = [[] for _ in range(26)]  # A~Z : [] 초기화

    while deq:
        r, c = deq.popleft()
        
        # 상하좌우 방문 확인 및 queue append
        for i in range(4):
            nr = r + dr[i]
            nc = c + dc[i]
            
            if 0 <= nr < h+2 and 0 <= nc < w+2 and graph[nr][nc] != "*":
                # 방문 처리 및 방문한 곳의 상태에 대한 업데이트
                num = ord(graph[nr][nc])
                if 65 <= num <= 90:    # 문
                    # 열쇠가 없는 상태면, 문을 임시 저장
                    if keys[num - 65] == 0:
                        tempDoors[num - 65].append((nr, nc))
                        continue
                elif 97 <= num <= 122:   # 열쇠
                    # 열쇠가 새로 추가된다면, 임시 저장한 문을 꺼내 deq 맨 위에 push
                    if keys[num - 97] == 0:
                        for door in tempDoors[num - 97]:
                            deq.appendleft(door)
                    keys[num - 97] = 1
                elif graph[nr][nc] == "$":  # 서류
                    papers += 1
                
                graph[nr][nc] = "*"
                
                deq.append((nr, nc))
            
    results.append(papers)
    
for r in results:
    print(r)

 

    'Algorithm/백준' 카테고리의 다른 글
    • [백준] 1562. 계단 수 - Python
    • [백준] 13460. 구슬 탈출 2 - Python
    • [백준] 17387. 선분 교차 2 - Python
    • [백준] 1719. 택배 - Python
    220v
    220v
    DGU CSE 20 / Apple Developer Academy @ POSTECH 2nd Jr.Learner.

    티스토리툴바