본문 바로가기

Algorithm/BFS

(63)
(C++) - 백준(BOJ) 16932번 : 모양 만들기 https://www.acmicpc.net/problem/16932 16932번: 모양 만들기 N×M인 배열에서 모양을 찾으려고 한다. 배열의 각 칸에는 0과 1 중의 하나가 들어있다. 두 칸이 서로 변을 공유할때, 두 칸을 인접하다고 한다. 1이 들어 있는 인접한 칸끼리 연결했을 때, 각각의 www.acmicpc.net 아이디어가 필요한 bfs였습니다. 📕 풀이방법 📔 입력 및 초기화 n(행), m(열), groupNum(그룹번호), groupCk(그룹 체크 배열), board(입력받을 2차원 배열), ck(board 방문여부 확인 배열) dr,dc(인접 4방향 확인용 배열), areaPerGroup(그룹당 영역을 의미하는 unordered_map)을 선언합니다.n행, m열 입력 후 board에 n x..
(C++) - 백준(BOJ) 3197번 : 백조의 호수 https://www.acmicpc.net/problem/3197 3197번: 백조의 호수 입력의 첫째 줄에는 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1500. 다음 R개의 줄에는 각각 길이 C의 문자열이 하나씩 주어진다. '.'은 물 공간, 'X'는 빙판 공간, 'L'은 백조가 있는 공간으로 나타낸다. www.acmicpc.net bfs로 해결한 문제였습니다. 📕 풀이방법 📔 입력 및 초기화 호수의 세로, 가로 길이를 저장할 변수 r, c, 빙하를 제거하기 위해 물의 (행, 열) 좌표들을 저장하는 waterQ, 백조가 다닐 수 있는 최전선 범위의 좌표들이 담겨있는 swanQ, 백조 두 마리의 좌표가 저장된 vector 변수 swan, 호수의 모양을 저장할 이차원 문자 배열 lake, 답을 출력할..
(C++) - 백준(BOJ) 16954번 : 움직이는 미로 탈출 https://www.acmicpc.net/problem/16954 16954번: 움직이는 미로 탈출 욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽 www.acmicpc.net bfs문제였습니다. 📕 풀이방법 📔 입력 및 초기화 string 배열 chess에 체스판을 입력받습니다. 9방향 (상, 하, 좌, 우, 대각선 4방향, 가만히 있기)를 살펴보기 위한 일차원 배열 dr, dc를 선언합니다. 📔 풀이과정 고정된 미로를 탐색하는 bfs방식이 아닌 벽이 한 줄씩 내려오는 특성이 있습니다. 따라서 brute force방식으로 편하게 모든 경우의 수를 탐색하고 싶..
(C++) - 백준(BOJ) 2021번 : 최소 환승 경로 https://www.acmicpc.net/problem/2021 2021번: 최소 환승 경로 첫째 줄에 역의 개수 N(1≤N≤100,000), 노선의 개수 L(1≤L≤100,000)이 주어진다. 다음 L개의 줄에는 각 노선이 지나는 역이 순서대로 주어지며 각 줄의 마지막에는 -1이 주어진다. 마지막 줄에는 출발 www.acmicpc.net 5214번과 같은 bfs 문제였습니다. 📕 풀이방법 같은 호선에 속해있는 역끼리는 간선으로 연결할 필요가 없습니다. 유의미한 간선은 역 호선 또는 호선 역 뿐입니다. 인접그래프를 형성할 때 정점을 역, 호선으로 생각하며 역과 호선 사이를 간선으로 해 형성해줍니다. 호선은 동그라미, 역은 네모로 그림을 그렸습니다. 이렇게 간선의 개수를 줄일 수 있습니다. 이제 탐색할 ..
(C++) - 백준(BOJ) 5214번 : 환승 https://www.acmicpc.net/problem/5214 5214번: 환승 첫째 줄에 역의 수 N과 한 하이퍼튜브가 서로 연결하는 역의 개수 K, 하이퍼튜브의 개수 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ K, M ≤ 1000) 다음 M개 줄에는 하이퍼튜브의 정보가 한 줄에 하나씩 주어 www.acmicpc.net bfs 문제였습니다. 📕 풀이방법 같은 호선에 속해있는 역끼리는 간선으로 연결할 필요가 없습니다. 유의미한 간선은 역 호선 또는 호선 역 뿐입니다. 인접그래프를 형성할 때 정점을 역, 하이퍼튜브로 생각하며 역과 하이퍼튜브 사이를 간선으로 해 형성해줍니다. 📔 입력 및 초기화 m개의 호선에 대해 각 호선에 속한 정점들을 k개씩 입력하고 무방향 인접리스트를 형성해줍니다. 하..
(C++) - 백준(BOJ) 15723번 : n단 논법 https://www.acmicpc.net/problem/15723 15723번: n단 논법 m개의 줄에 걸쳐 각 줄에 결론이 참인지 거짓인지 출력하라. 참일 경우 T, 거짓일 경우 F를 출력하라. 알 수 없는 경우도 거짓이다. 답은 필히 대문자로 출력해야 한다. www.acmicpc.net bfs로 해결한 문제였습니다. 📕 풀이방법 📔 입력 및 초기화 1. 삼단논법을 그래프로 빗대어 설명하자면 a에서 b로가는 길이 있고 b에서 c로가는 길이 있는 경우에 a에서 c로가는 길이 있음이 자명합니다. 2. 적절히 입력을 받아 유향 인접 그래프를 형성합니다. 📔 풀이과정 1. m개의 질문에 대해 다음을 수행합니다. 1-1. getline으로 한줄 입력받고 x,y 문자변수에 해당하는 질문 알파벳을 저장합니다. 1..
(C++) - 백준(BOJ) 1240번 : 노드사이의 거리 https://www.acmicpc.net/problem/1240 1240번: 노드사이의 거리 N(2≤N≤1,000)개의 노드로 이루어진 트리가 주어지고 M(M≤1,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라. www.acmicpc.net bfs로 푼 문제였습니다. 📕 풀이방법 📔 입력 및 초기화 인접리스트로 트리를 구현합니다. 📔 풀이과정 플로이드 와샬은 1000^3의 시간복잡도가 걸리므로 시간초과가 될 수 있습니다. 따라서 매 출발과 도착점을 입력받을 때마다 출발점을 기준으로 거리를 구해줍니다. 1. 출발점과 도착점의 입력 후에 해당 부분으로 bfs를 수행합니다. 2. 트리에는 사이클이 없으므로 방문하지 않은 정점까지의 거리는 인접정점에서 그 정점으로 가는 거리를 더한 값이..
(C++) - 백준(BOJ) 13565번 : 침투 https://www.acmicpc.net/problem/13565 13565번: 침투 첫째 줄에는 격자의 크기를 나타내는 M (2 ≤ M ≤ 1,000) 과 N (2 ≤ N ≤ 1,000) 이 주어진다. M줄에 걸쳐서, N개의 0 또는 1 이 공백 없이 주어진다. 0은 전류가 잘 통하는 흰색, 1은 전류가 통하지 않 www.acmicpc.net bfs문제였습니다. 📕 풀이방법 📔 입력 및 초기화 1. m, n을 입력받습니다. m은 행, n은 열입니다. 2. m행 n열만큼 이차원 배열인 board변수에 적절히 입력해줍니다. 📔 풀이과정 1. 아직 전류를 흘러보낸적이 없다면 ck = 0, 있다면 ck = 1로 생각합니다. 2. 0행에 해당하는 부분은 outer side에서 전류를 흘려보낸다고 생각할 수 있..