BFS 30

[ 구름톤 챌린지 ] 17일차 미션 - 통신망 분석

구름톤 챌린지 17일차입니다. 4주차가 시작되면서 점점 구름톤 챌린지도 마무리되어가고 있습니다. 챌린지를 통해 문제 풀이 실력을 향상시킬 수 있으며, 블로그에 학습 일기도 작성하면 추가 보상도 주어지니 관심 있으시면 참여해보시는 것을 추천드립니다. https://level.goorm.io/l/challenge/goormthon-challenge 구름LEVEL 난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다. level.goorm.io 문제 입력 / 출력 풀이 과정 BFS를 통해 컴포넌트 그룹을 탐색했다. 한 컴포넌트를 탐색하면서 간선의 개수도 동시에 세주어 저장하였다. 이를 이용해 가장 밀도가 높고, 컴포넌트를 구성하는 컴퓨터의 수가 가장 적고, 더 작은 번호를 가진 컴퓨터가 있는 ..

[ 구름톤 챌린지 ] 16일차 미션 - 연합

구름톤 챌린지 4주차가 시작되었습니다. 챌린지를 통해 문제 풀이 실력을 향상시킬 수 있으며, 블로그에 학습 일기도 작성하면 추가 보상도 주어지니 관심 있으시면 참여해보시는 것을 추천드립니다. https://level.goorm.io/l/challenge/goormthon-challenge 구름LEVEL 난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다. level.goorm.io 문제 입력 / 출력 풀이 과정 BFS를 이용해 탐색한다. s번 섬에서 e번 섬으로 가는 다리가 있을 때 e번 섬에서 s번 섬으로 가는 다리가 있다면 같은 연합으로 인식하고 탐색한다. 이를 이용해 연합의 개수를 세면 되는 문제이다. import sys from collections import deque inp..

[ 구름톤 챌린지 ] 13일차 미션 - 발전기 (2)

구름톤 챌린지 13일차입니다. 챌린지를 통해 문제 풀이 실력을 향상시킬 수 있으며, 블로그에 학습 일기도 작성하면 추가 보상도 주어지니 관심 있으시면 참여해보시는 것을 추천드립니다. https://level.goorm.io/l/challenge/goormthon-challenge 구름LEVEL 난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다. level.goorm.io 문제 입력 / 출력 풀이 과정 BFS를 이용해 단지의 개수를 센 후, 가장 많은 단지가 있는 건물 유형의 번호를 출력했다. import sys from collections import deque input = sys.stdin.readline n, k = map(int, input().rstrip().split())..

[ 구름톤 챌린지 ] 12일차 미션 - 발전기

구름톤 챌린지 12일차입니다. 챌린지를 통해 문제 풀이 실력을 향상시킬 수 있으며, 블로그에 학습 일기도 작성하면 추가 보상도 주어지니 관심 있으시면 참여해보시는 것을 추천드립니다. https://level.goorm.io/l/challenge/goormthon-challenge 구름LEVEL 난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다. level.goorm.io 문제 입력 / 출력 풀이 과정 집에 전력을 공급하기 위해선 그 집에 발전기를 설치하거나, 상하좌우로 인접한 집 중 하나가 전력을 공급받고 있으면 된다. -> 모여있는 집 그룹의 개수를 세면 된다. 집 그룹 안에 있는 한 집에 발전기를 설치하면 그 그룹의 모든 집에 전기가 공급되기 때문이다. BFS를 사용해 집 그룹의 ..

[ BOJ ] 16458 : 가장 큰 숫자 ( GOLD 5 ) / Python

문제 여러 개의 숫자들이 주어졌을 때, 이들 중 가장 큰 숫자를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 n, m(15 ≤ n ≤ m ≤ 1000)이 주어진다. 다음 n개의 줄에는 공백(' ')과 별 표('*')로 이루어진 숫자들이 주어진다. 각 줄마다 총 m개의 문자가 있다. 모든 숫자들은 어떤 자연수 k에 대해 가로 3k, 세로 5k 크기의 직사각형에 딱 맞게 들어가고, 이 직사각형을 다시 15개의 k × k 정사각형들로 분할할 경우 각 정사각형 안의 문자들은 모두 공백 혹은 별 표 중 한 종류로만 이루어져 있음이 보장된다. 위에서 언급한 숫자를 포함하는 직사각형들에 대해, 어떤 직사각형도 서로 겹쳐져 있지 않다. 또한 어떤 직사각형도 상하좌우 혹은 대각선 방향으로 맞닿아 있지 않다. 가장 큰..

[ Algorithm ] 깊이 우선 탐색과 너비 우선 탐색

도입 이 글은 그래프 탐색에서 사용할 수 있는 깊이 우선 탐색 (DFS, Depth-First Search) 과 너비 우선 탐색 (BFS, Breadth-First Search) 에 대한 개념 설명을 담고 있습니다. 개인적으로 자료 구조 분야에서 스택 및 큐 개념을 배운 이후 중간 단계를 건너뛰고 바로 DFS와 BFS를 배우면서 PS에 입문한 사람으로써, DFS와 BFS는 실버 시절 제가 많은 실버 문제와 골드 문제를 풀 수 있도록 도와준 알고리즘입니다. 그래프 탐색이라고 해서 단순 그래프 측면이 아닌 다양한 방식으로 응용이 가능한 알고리즘이기에, 익힌다면 여러 분야에서 실전적으로 활용할 수 있을 것입니다. DFS와 BFS의 기본적인 개념을 응용 방식과 함께 배우고 풀이하는 것이 이 글의 목적입니다. 본..

[ BOJ ] 3055 : 탈출 ( GOLD 4 ) / Python

문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다. 티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나타내어져 있다. 매 분마다 고슴도치는 현재 있는 칸과 인접한 네 칸 중 하나로 이동할 수 있다. (위, 아래, 오른쪽, 왼쪽) 물도 매 분마다 비어있는 칸으로 확장한다. 물이 있는 칸과 인접해있는 비어있는 칸(적어도 한 변을 공유)은 물이 차게 된다. 물..

[ BOJ ] 1938 : 통나무 옮기기 ( GOLD 2 ) / Python

문제 가로와 세로의 길이가 같은 평지에서 벌목을 한다. 그 지형은 0과 1로 나타나 있다. 1은 아직 잘려지지 않은 나무를 나타내고 0은 아무 것도 없음을 나타낸다. 다음 지형을 보자. B 0 0 1 1 B 0 0 0 0 B 0 0 0 0 1 1 0 0 0 E E E 0 0 위의 지형에서 길이 3인 통나무 BBB를 밀거나 회전시켜 EEE의 위치로 옮기는 작업을 하는 문제를 생각해 보자. BBB와 EEE의 위치는 임의로 주어진다. 단 문제에서 통나무의 길이는 항상 3이며 B의 개수와 E의 개수는 같다. 통나무를 움직이는 방법은 아래와 같이 상하좌우(Up, Down, Left, Right)와 회전(Turn)이 있다. - 코드의미 U 통나무를 위로 한 칸 옮긴다. D 통나무를 아래로 한 칸 옮긴다. L 통나무..

[ BOJ ] 16930 : 달리기 ( PLATINUM 3 ) / Python

문제 진영이는 다이어트를 위해 N×M 크기의 체육관을 달리려고 한다. 체육관은 1×1 크기의 칸으로 나누어져 있고, 칸은 빈 칸 또는 벽이다. x행 y열에 있는 칸은 (x, y)로 나타낸다. 매 초마다 진영이는 위, 아래, 오른쪽, 왼쪽 중에서 이동할 방향을 하나 고르고, 그 방향으로 최소 1개, 최대 K개의 빈 칸을 이동한다. 시작점 (x1, y1)과 도착점 (x2, y2)가 주어졌을 때, 시작점에서 도착점으로 이동하는 최소 시간을 구해보자. 입력 첫째 줄에 체육관의 크기 N과 M, 1초에 이동할 수 있는 칸의 최대 개수 K가 주어진다. 둘째 줄부터 N개의 줄에는 체육관의 상태가 주어진다. 체육관의 각 칸은 빈 칸 또는 벽이고, 빈 칸은 '.', 벽은 '#'으로 주어진다. 마지막 줄에는 네 정수 x1,..

[ BOJ ] 16932 : 모양 만들기 ( GOLD 3 ) / Python

문제 N×M인 배열에서 모양을 찾으려고 한다. 배열의 각 칸에는 0과 1 중의 하나가 들어있다. 두 칸이 서로 변을 공유할때, 두 칸을 인접하다고 한다. 1이 들어 있는 인접한 칸끼리 연결했을 때, 각각의 연결 요소를 모양이라고 부르자. 모양의 크기는 모양에 포함되어 있는 1의 개수이다. 배열의 칸 하나에 들어있는 수를 변경해서 만들 수 있는 모양의 최대 크기를 구해보자. 입력 첫째 줄에 배열의 크기 N과 M이 주어진다. 둘째 줄부터 N개의 줄에는 배열에 들어있는 수가 주어진다. 출력 첫째 줄에 수 하나를 변경해서 만들 수 있는 모양의 최대 크기를 출력한다. 제한 2 ≤ N, M ≤ 1,000 0과 1의 개수는 하나 이상이다. 풀이 과정 먼저 이미 있는 1의 모양을 먼저 탐색하면서 방문 기록을 이용해 모..