새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 2146 다리 만들기

by 언호 2022. 3. 24.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

섬들간에 다리를 놓아야 하므로, 섬들을 구분하기 위해서 DFS 탐색을 이용하여 섬들에 서로 다른 번호를 매겼습니다.

섬마다 경계선 부분의 좌표들을 모두 구하여 각 섬들의 경계선끼리 거리를 구해주었습니다.

2) 알고리즘

  • BFS

3) 풀이 코드

사용 언어 - Python

import sys
from collections import deque
sys.stdin = open('input.txt')

dr = [-1, 0, 1, 0]                                  # 위 오른쪽 아래 왼쪽
dc = [0, 1, 0, -1]

def numbering(y, x, num):                           # 섬마다 숫자를 매김
    q = deque([(y, x)])                 
    board[y][x] = num                               # 현재 위치부터 섬 번호를 매김

    coors = set()                                   # 해당 섬의 경계의 좌표들을 저장할 변수
    while q:
        y, x = q.popleft()
        for k in range(4):
            r = y + dr[k]
            c = x + dc[k]

            if 0 <= r < N and 0 <= c < N:
                if board[r][c] == 1:                # 옆의 땅을 탐색해서 같은 번호를 매김
                    board[r][c] = num
                    q.append((r, c))
                elif not board[r][c]:               # 주변에 바다가 있으면, 경계이므로
                    coors.add((y, x))

    coordinates.append(coors)                       # 섬들 경계선 좌표를 모아두는 변수에
                                                    # 해당 섬의 경계 좌표를 저장

def bridge_search():                                        # 다리 길이 탐색
    global answer

    for i in range(len(coordinates)):                       # 섬 하나 선택
        for j in range(i+1, len(coordinates)):              # 다른 섬 하나 선택
            for y1, x1 in coordinates[i]:                   # 각 섬들의 경계좌표끼리
                for y2, x2 in coordinates[j]:               # 거리를 구해줌
                    dist = abs(y1-y2) + abs(x1-x2) - 1
                    answer = min(answer, dist)              # 제일 작은 길이만 구함

N = int(sys.stdin.readline())                                               # 보드판의 크기
board = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]    # 보드판 정보
coordinates = []                        # 섬들 경계선 좌표들
answer = 1e10                           # 정답 초기화

num = 2                                 # 초기 섬 번호
for i in range(N):
    for j in range(N):
        if board[i][j] == 1:            # 육지이면
            numbering(i, j, num)        # 섬 번호 매기기 시작
            num += 1

bridge_search()                         # 다리 건설 탐색

print(answer)

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- https://www.acmicpc.net/problem/2146

 

2146번: 다리 만들기

여러 섬으로 이루어진 나라가 있다. 이 나라의 대통령은 섬을 잇는 다리를 만들겠다는 공약으로 인기몰이를 해 당선될 수 있었다. 하지만 막상 대통령에 취임하자, 다리를 놓는다는 것이 아깝다

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[프로그래머스] 등굣길  (0) 2022.03.27
[프로그래머스] 정수삼각형  (0) 2022.03.26
[백준] 5014 스타트링크  (0) 2022.03.23
[백준] 13460 구슬탈출 2  (0) 2022.03.22
[프로그래머스] 여행경로  (0) 2022.03.21

댓글