일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백트랙킹
- dp
- 재귀
- 프로그래머스
- 코딩테스트
- DFS
- java #자바 #동빈나
- 백준 #알고리즘 #파이썬 #코딩테스트
- 자바 #java
- 백준
- java #자바
- 백준 #파이썬 #알고리즘 #코딩테스트
- PYTHON
- java #자바 #나동빈
- java #자바 #생활코딩
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- react #리액트 #동빈나
- 파이썬
- css #생활코딩 #웹
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 투포인터
- Dijkstra
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- 알고리즘
- 다익스트라
- 파이썬 #백준 #알고리즘 #코딩테스트
- css #웹 #생활코딩
- 다이나믹프로그래밍
- BFS
Archives
- Today
- Total
커리까지
[백준] 21736번 헌내기는 친구가 필요해 본문
728x90
SMALL
문제
2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고 싶다.
도연이가 다니는 대학의 캠퍼스는 N×M$N \times M$ 크기이며 캠퍼스에서 이동하는 방법은 벽이 아닌 상하좌우로 이동하는 것이다. 예를 들어, 도연이가 (x$x$, y$y$)에 있다면 이동할 수 있는 곳은 (x+1$x+1$, y$y$), (x$x$, y+1$y+1$), (x−1$x-1$, y$y$), (x$x$, y−1$y-1$)이다. 단, 캠퍼스의 밖으로 이동할 수는 없다.
불쌍한 도연이를 위하여 캠퍼스에서 도연이가 만날 수 있는 사람의 수를 출력하는 프로그램을 작성해보자.
입력
첫째 줄에는 캠퍼스의 크기를 나타내는 두 정수 N$N$ (1≤N≤600$ 1 \leq N \leq 600$), M$M$ (1≤M≤600$ 1 \leq M \leq 600$)이 주어진다.
둘째 줄부터 N$N$개의 줄에는 캠퍼스의 정보들이 주어진다. O
는 빈 공간, X
는 벽, I
는 도연이, P
는 사람이다. I
가 한 번만 주어짐이 보장된다.
출력
첫째 줄에 도연이가 만날 수 있는 사람의 수를 출력한다. 단, 아무도 만나지 못한 경우 TT
를 출력한다.
예제 입력 1
3 5
OOOPO
OIOOX
OOOXP
예제 출력 1
1
예제 입력 2
3 3
IOX
OXP
XPP
예제 출력 2
TT
제출 답안
- 시작 y,x를 미리 지정한다.
- 그래서 dfs를 수행하는 이중 for가 필요하지 않다.
- 벽이 아니면 돌아다니다가 사람을 만나면 cnt를 1 증가시킨다.
'''
1. 아이디어
- y,x를 지정
- I일 경우 상하좌우 확인
- I가 아니면 방문 처리 후 넘겨버림
2. 시간 복잡도
- O(V+E)
- V : NM
- E : 4V
- 5V = 5(600*600) = 1,800,000 < 2억
3. 자료구조
int [][]
bool [][]
'''
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**9)
n, m = map(int, input().split())
graph = []
start_y, start_x = 0, 0
for i in range(n):
row = list(input().strip())
if "I" in row:
start_y, start_x = i, row.index('I')
graph.append(row)
visited = [[False] * (m) for _ in range(n)]
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
cnt = 0
def dfs(y, x):
global cnt
for k in range(4):
ny = y + dy[k]
nx = x + dx[k]
if 0<=ny<n and 0<=nx<m:
if not visited[ny][nx] and (val:=graph[ny][nx]) != 'X':
visited[ny][nx] = True
if val == 'P' :
cnt +=1
dfs(ny, nx)
visited[start_y][start_x] = True
dfs(start_y, start_x)
print(cnt if cnt != 0 else 'TT')
728x90
LIST
'알고리즘 > 풀이' 카테고리의 다른 글
[백준] 1260번 DFS와 BFS 파이썬 (0) | 2022.12.14 |
---|---|
[백준] 17086번 아기상어2 (0) | 2022.12.13 |
[백준] 16953번 A->B (1) | 2022.12.11 |
[백준] 24480번 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2022.12.10 |
[백준] 24479 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2022.12.10 |
Comments