3W.3D- DFS & BFS 문제

Dazz_heyDay ·2021년 7월 14일
1

Python) Algorithm_study

목록 보기
14/39

✏️백준 문제 (18352) [특정거리 도시 찾기]

<문제>
어떤 나라에는 1번부터 N번까지의 도시와 M개의 단방향 도로가 존재한다. 모든 도로의 거리는 1이다.

이 때 특정한 도시 X로부터 출발하여 도달할 수 있는 모든 도시 중에서, 최단 거리가 정확히 K인 모든 도시들의 번호를 출력하는 프로그램을 작성하시오. 또한 출발 도시 X에서 출발 도시 X로 가는 최단 거리는 항상 0이라고 가정한다.

예를 들어 N=4, K=2, X=1일 때 다음과 같이 그래프가 구성되어 있다고 가정하자.

이 때 1번 도시에서 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 2인 도시는 4번 도시 뿐이다. 2번과 3번 도시의 경우, 최단 거리가 1이기 때문에 출력하지 않는다.

입력
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 공백을 기준으로 구분되어 주어진다. 이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미다. (1 ≤ A, B ≤ N) 단, A와 B는 서로 다른 자연수이다.
출력
X로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력한다.
이 때 도달할 수 있는 도시 중에서, 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력한다.

sys.stdin.readline()
반복문으로 여러줄 입력받는 상황에서는 반드시 sys.stdin.readline()을 사용해야 시간초과가 발생하지 않는다.
참고 블로그: https://velog.io/@yeseolee/Python-파이썬-입력-정리sys.stdin.readline

BFS문제.

code

mport sys
from collections import deque
input=sys.stdin.readline

n,m,k,x=map(int, input().split())
visited=[False] * (n+1)
path=[[for _ in range(n+1)]]
for i in range(m):
  start,end=map(int, input().split())
  path[start].append(end)
res=list()
q=deque()
q.append((x.0))
while q:
  vil,cnt=q.popleft()
  if cnt==k:
      res.append(vil)
  elif cnt<k:
      for j in path[vil]:
          if not visited[j]:
              visited[j]=True
              q.append((j,cnt+1))
if len(res)==0:
  print(-1)
else:
  res.sort()
  for answer in res:
      print(answer)

출발도시로부터 연결된 마을 추가 -> 원하는 거리 확인


✏️백준 문제(145020 [연구소]

https://www.acmicpc.net/problem/14502
<문제>
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다.
연구소는 크기가 N×M인 직사각형으로 나타낼 수 있으며, 직사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는 빈 칸, 벽으로 이루어져 있으며, 벽은 칸 하나를 가득 차지한다.
일부 칸은 바이러스가 존재하며, 이 바이러스는 상하좌우로 인접한 빈 칸으로 모두 퍼져나갈 수 있다. 새로 세울 수 있는 벽의 개수는 3개이며, 꼭 3개를 세워야 한다.
예를 들어, 아래와 같이 연구소가 생긴 경우를 살펴보자.

입력
첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (3 ≤ N, M ≤ 8)
둘째 줄부터 N개의 줄에 지도의 모양이 주어진다. 0은 빈 칸, 1은 벽, 2는 바이러스가 있는 위치이다. 2의 개수는 2보다 크거나 같고, 10보다 작거나 같은 자연수이다.
빈 칸의 개수는 3개 이상이다
출력
첫째 줄에 얻을 수 있는 안전 영역의 최대 크기를 출력한다.

code

코드를 입력하세요

https://everyyy.tistory.com/entry/백준-14502-연구소-DFS-완전탐색?category=731753

https://cotak.tistory.com/14
->그나마 이해가 잘된 코드여서 블로그 링크를 첨부해 놓는다....
복습할때 다시 혼자 해결하고 코드를 첨부해야겠다


✏️백준 문제(2583) [영역 구하기]

<문제>
눈금의 간격이 1인 M×N(M,N≤100)크기의 모눈종이가 있다. 이 모눈종이 위에 눈금에 맞추어 K개의 직사각형을 그릴 때, 이들 K개의 직사각형의 내부를 제외한 나머지 부분이 몇 개의 분리된 영역으로 나누어진다.

예를 들어 M=5, N=7 인 모눈종이 위에 <그림 1>과 같이 직사각형 3개를 그렸다면, 그 나머지 영역은 <그림 2>와 같이 3개의 분리된 영역으로 나누어지게 된다.

<그림 2>와 같이 분리된 세 영역의 넓이는 각각 1, 7, 13이 된다.

M, N과 K 그리고 K개의 직사각형의 좌표가 주어질 때, K개의 직사각형 내부를 제외한 나머지 부분이 몇 개의 분리된 영역으로 나누어지는지, 그리고 분리된 각 영역의 넓이가 얼마인지를 구하여 이를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오른쪽 위 꼭짓점의 x, y좌표값이 빈칸을 사이에 두고 차례로 주어진다. 모눈종이의 왼쪽 아래 꼭짓점의 좌표는 (0,0)이고, 오른쪽 위 꼭짓점의 좌표는(N,M)이다. 입력되는 K개의 직사각형들이 모눈종이 전체를 채우는 경우는 없다.
출력
첫째 줄에 분리되어 나누어지는 영역의 개수를 출력한다. 둘째 줄에는 각 영역의 넓이를 오름차순으로 정렬하여 빈칸을 사이에 두고 출력한다.

code

우선...입력조건을 이해를 못했다...
profile
Why.Not.Now

3개의 댓글

comment-user-thumbnail
2021년 7월 15일

안녕하세요, 김덕우입니다! sys.stdin.readline()를 왜 쓰는지 몰랐는데 첨부해주신 글 읽고 한번에 이해가 됐어요, 감사합니다! 이번에 너무 어렵죠.. 어렵지만 많이 찾아보면서 열심히 하시는 것 보고 많이 배워갑니다. 오늘도 화이팅입니다!

답글 달기
comment-user-thumbnail
2021년 7월 15일

안녕하세요 알고리줌입니다!
요새 문제가 너무 어려워져서 힘드네요😭
저도 한문제 푸니깐 뒤에는 좀 안읽어지나...이해가 안되더라고요!!
오늘 수고 많으셨습니다!!

답글 달기
comment-user-thumbnail
2021년 7월 15일

저도 김덕우님이랑 같은 부분에서 이해가 안갔는데 덕분에 이해할 수 있었어요!! 👍👍 마지막 문제는 너무 머리가 아파서 저도 다음으로,,, 남은 날들도 같이 힘내요,,!!

답글 달기