백준 14716(현수막) - 파이썬(Python),자바(Java) - DFS(재귀함수),sys.setrecursionlimit(10**6),BFS
반응형
14716번: 현수막
혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라.
www.acmicpc.net
* 재귀함수 문제 시에는 sys.setrecursionlimit(10**6)을 상단에 적어준다. 파이썬의 기본 재귀 깊이 제한이 1000으로 작은 편이기 때문에 런타임 에러 발생한다.
graph=[]
for i in range(m):
graph.append(list(map(int,sys.stdin.readline().split())))
graph=[list(map(int,sys.stdin.readline().split())) for _ in range(m)]
둘은 동일하다.
1. DFS로 푼 경우
스택, 큐, 재귀함수, DFS
탐색(Search) : 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정 대표적인 탐색 알고리즘으로 DFS, BFS , 이 두 알고리즘을 이해하기 위해서 스택, 큐, 재귀 함수를 알아야한다. 참고자료. https:
coooco.tistory.com
1-1) Python(파이썬으로 푼경우)
import sys
sys.setrecursionlimit(10 ** 6) # 재귀 허용 깊이를 수동으로 늘려주는 코드
m,n=map(int,sys.stdin.readline().split())
graph=[]
for i in range(m):
graph.append(list(map(int,sys.stdin.readline().split())))
def dfs(x,y):#행,열
if x<=-1 or x>=m or y<=-1 or y>=n:
return False
if graph[x][y]==1:
graph[x][y]=0
dfs(x-1,y)
dfs(x-1,y-1)
dfs(x-1,y+1)
dfs(x,y-1)
dfs(x,y+1)
dfs(x+1,y)
dfs(x+1,y-1)
dfs(x+1,y+1)
return True
return False
result=0
for i in range(m):
for j in range(n):
if graph[i][j]==1:
dfs(i,j)
result+=1
print(result)
import sys
sys.setrecursionlimit(10 ** 6) # 재귀 허용 깊이를 수동으로 늘려주는 코드
m,n=map(int,sys.stdin.readline().split())
graph=[list(map(int,sys.stdin.readline().split())) for _ in range(m)]
dx=[-1,-1,-1,0,0,1,1,1]
dy=[1,0,-1,1,-1,1,0,-1]
def dfs(x,y):#행,열
if x<=-1 or x>=m or y<=-1 or y>=n:
return False
if graph[x][y]==1:
graph[x][y]=0
for i in range(8):
dfs(x+dx[i],y+dy[i])
return True
return False
result=0
for i in range(m):
for j in range(n):
if dfs(i,j)==True:
result+=1
print(result)
1-2) Java(자바로 푼경우)
import java.util.*;
import java.io.*;
public class Main {
static int[][] graph;
static int m,n;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
m = Integer.parseInt(st.nextToken());//행
n = Integer.parseInt(st.nextToken());//열
graph=new int[m][n];
for(int i=0;i<m;i++){
st = new StringTokenizer(br.readLine()," ");
for(int j=0;j<n;j++){
graph[i][j]=Integer.parseInt(st.nextToken());
}
}
int result=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(graph[i][j]==1){
dfs(i,j);
result+=1;
}
}
}
System.out.println(result);
}
public static boolean dfs(int x,int y){
if(x<=-1|| x>=m || y<=-1 || y>=n){
return false;
}
if(graph[x][y]==1){
graph[x][y]=0;
dfs(x-1,y-1);
dfs(x-1,y);
dfs(x-1,y+1);
dfs(x,y-1);
dfs(x,y+1);
dfs(x+1,y-1);
dfs(x+1,y);
dfs(x+1,y+1);
return true;
}
return false;
}
}
2. BFS로 푼 경우
BFS - duque 메서드 - Python(파이썬),Java(자바)
DFS 설명 스택, 큐, 재귀함수, DFS 탐색(Search) : 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정 대표적인 탐색 알고리즘으로 DFS, BFS , 이 두 알고리즘을 이해하기 위해서 스택, 큐, 재귀 함
coooco.tistory.com
2-1) Python(파이썬인 경우)
import sys
from collections import deque
#sys.setrecursionlimit(10 ** 6) # 재귀 허용 깊이를 수동으로 늘려주는 코드
m,n=map(int,sys.stdin.readline().split())
graph=[list(map(int,sys.stdin.readline().split())) for _ in range(m)]
dx=[-1,-1,-1,0,0,1,1,1]
dy=[1,0,-1,1,-1,1,0,-1]
def bfs(x,y):#행,열
queue=deque()
#큐 안에 저장
queue.append((x,y))
graph[x][y]=0
while queue:
x,y = queue.popleft()
for i in range(8):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<m and 0<=ny<n:
if graph[nx][ny]==1:
graph[nx][ny]=0
queue.append((nx,ny))
result=0
for i in range(m):
for j in range(n):
if graph[i][j]==1:
bfs(i,j)
result+=1
print(result)
2-2) Java(자바인 경우)
import java.util.*;
import java.io.*;
public class Main {
static int[][] graph;
static int m,n;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
m = Integer.parseInt(st.nextToken());//행
n = Integer.parseInt(st.nextToken());//열
graph=new int[m][n];
for(int i=0;i<m;i++){
st = new StringTokenizer(br.readLine()," ");
for(int j=0;j<n;j++){
graph[i][j]=Integer.parseInt(st.nextToken());
}
}
int result=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(graph[i][j]==1){
bfs(i,j);
result+=1;
}
}
}
System.out.println(result);
}
static int[] dx={-1,-1,-1,0,0,1,1,1};
static int[] dy={-1,0,1,-1,1,-1,0,1};
public static void bfs(int x,int y){
Queue<int[]> q = new LinkedList<>();
int[] array = {x,y};
q.offer(array);
graph[x][y]=0;
while (!q.isEmpty()){
int[] tmp = q.poll();
for(int i=0;i<8;i++){
int nx = tmp[0]+dx[i];
int ny = tmp[1]+dy[i];
if(0<=nx && nx<m && 0<=ny && ny<n && graph[nx][ny]==1){
graph[nx][ny]=0;
int[] array1={nx,ny};
q.offer(array1);
}
}
}
}
}
반응형
'[백준] Python,Java로 풀기📖 > DFS&BFS' 카테고리의 다른 글
백준 24479(깊이 우선 탐색 1) - Python(파이썬),Java(자바) - DFS (2) | 2022.06.01 |
---|---|
백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS (0) | 2022.05.25 |
백준 16948(데스나이트) - Python(파이썬),자바(Java) (0) | 2022.05.24 |
백준 4936(섬의 개수) - BFS 풀기 (0) | 2022.05.21 |
백준 1260(DFS와 BFS) - DFS & BFS (0) | 2022.05.18 |
댓글
이 글 공유하기
다른 글
-
백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS
백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS
2022.05.25 -
백준 16948(데스나이트) - Python(파이썬),자바(Java)
백준 16948(데스나이트) - Python(파이썬),자바(Java)
2022.05.24 -
백준 4936(섬의 개수) - BFS 풀기
백준 4936(섬의 개수) - BFS 풀기
2022.05.21 -
백준 1260(DFS와 BFS) - DFS & BFS
백준 1260(DFS와 BFS) - DFS & BFS
2022.05.18