From 357ea63a21ff2dcb2374427551b9734ac075e877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=ED=98=9C=EC=9B=90?= <127714800+janghw0126@users.noreply.github.com> Date: Tue, 26 Mar 2024 10:21:47 +0900 Subject: [PATCH] 2024-03-26 --- janghw0126/README.md | 1 + ...0 \354\240\244\353\213\244\354\247\200.py" | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 "janghw0126/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274/\353\205\271\354\203\211 \354\230\267 \354\236\205\354\235\200 \354\225\240\352\260\200 \354\240\244\353\213\244\354\247\200.py" diff --git a/janghw0126/README.md b/janghw0126/README.md index 6c78a1f3..e42dffb3 100644 --- a/janghw0126/README.md +++ b/janghw0126/README.md @@ -26,4 +26,5 @@ | 22차시 | 2024.3.8 | 분할 정복 | 종이의 개수 |[#91](https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/91) | | 23차시 | 2024.3.13 | 백트래킹 | 로또 |[#97](https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/97) | | 24차시 | 2024.3.15 | 누적합 | 출석체크 |[#101](https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/101) | +| 25차시 | 2024.3.26 | 녹색 옷 입은 애가 젤다지? | 출석체크 |[#108](https://github.com/AlgoLeadMe/AlgoLeadMe-4/pull/108) | --- diff --git "a/janghw0126/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274/\353\205\271\354\203\211 \354\230\267 \354\236\205\354\235\200 \354\225\240\352\260\200 \354\240\244\353\213\244\354\247\200.py" "b/janghw0126/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274/\353\205\271\354\203\211 \354\230\267 \354\236\205\354\235\200 \354\225\240\352\260\200 \354\240\244\353\213\244\354\247\200.py" new file mode 100644 index 00000000..aaae2278 --- /dev/null +++ "b/janghw0126/\353\213\244\354\235\265\354\212\244\355\212\270\353\235\274/\353\205\271\354\203\211 \354\230\267 \354\236\205\354\235\200 \354\225\240\352\260\200 \354\240\244\353\213\244\354\247\200.py" @@ -0,0 +1,44 @@ +# 양방향 큐 모듈을 불러온다. +from collections import deque +# 문제 번호를 세기 위한 count와, 상하좌우 이동을 위한 dx, dy 배열을 정의한다. +count, dx, dy = 0, [0, 0, 1, -1], [1, -1, 0, 0] + +# 너비 우선 탐색(BFS) 함수를 정의한다. +def bfs(): + queue = deque() + # 시작점을 queue에 추가한다. + queue.append([0, 0]) + # 시작점의 비용을 초기화한다. + cost[0][0] = field[0][0] + # queue에 요소가 있는 동안 반복한다. + while queue: + # queue에서 요소를 하나 꺼내 x, y에 할당한다. + x, y = queue.popleft() + # 상하좌우 네 방향에 대해 반복한다. + for i in range(4): + # 현재 위치에서 이동할 새로운 위치를 계산한다. + nx, ny = x + dx[i], y + dy[i] + # 새로운 위치가 범위 내에 있는지 확인한다. + if -1 < nx < n and -1 < ny < n: + # 새로운 위치로 이동하는 비용이 더 저렴한지 확인하고 더 저렴한 경우 비용을 갱신한 후 갱신된 위치를 queue에 추가한다. + if cost[y][x] + field[ny][nx] < cost[ny][nx]: + cost[ny][nx] = cost[y][x] + field[ny][nx] + queue.append([nx, ny]) + # 목적지까지의 최소 비용을 반환한다. + return cost[n-1][n-1] + + +while True: + n = int(input()) + if n == 0: + break + # 문제 번호를 1 증가시킨다. + count += 1 + # 지도 정보를 저장할 리스트를 초기화한다. + field = [] + # 지도 정보를 입력받아 field에 저장한다. + for i in range(n): field.append(list(map(int, input().split()))) + # 각 위치까지의 최소 비용을 저장할 리스트를 무한대로 초기화한다. + cost = [[1e9 for j in range(n)] for i in range(n)] + # 각 테스트 케이스의 결과를 출력한다. + print(f"Problem {count}: {bfs()}")