728x90
반응형
★ 핵심 : DFS(깊이우선탐색)
https://www.codetree.ai/cote/13/problems/seperate-village?&utm_source=clipboard&utm_medium=text
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
· 핵심
1. 각 마을의 위치를 찾기 위해 전체 board영역에 이중for문 돌면서 '벽이거나 이미 방문한 곳'을 제외하고 DFS 진행
→ global cnt 도입하는 대신 cnt(사람의 수)를 dfs 내에서 초기화하고 return값으로는 누적되는 cnt값 출력
→ dfs 함수 종료되고 변수 cnt에 누적된 사람 수 넣고 cnts에 모으기
2. is_vaild()에서 판단할 것들
→ 0 <= r < n & 0 <= c < n, r과 c 가 적절한 좌표값인지
→ in_queue[r][c] 가 False, 즉 방문 하지 않은 곳인지
→ board[r][c] == 1, 이동 가능한 곳인지
· 코드(Python)
N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]
visited = [[False for _ in range(N)] for _ in range(N)]
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
def is_valid(r, c):
return 0 <= r < N and 0 <= c < N and not visited[r][c] and board[r][c] == 1
def dfs(cr, cc):
visited[cr][cc] = True
cnt = 1
for k in range(4):
nr = cr + dr[k]
nc = cc + dc[k]
if is_valid(nr, nc):
cnt += dfs(nr, nc)
return cnt
cnts = []
for r in range(N):
for c in range(N):
if visited[r][c] or board[r][c] == 0:
continue
cnt = dfs(r, c)
cnts.append(cnt)
print(len(cnts))
for x in sorted(cnts):
print(x)
※ 실력진단
PS. 정보처리기사 10월 7일날 마무리했다. 그래서 코딩테스트는 하나도 신경 쓰지 못했다. 열심히 해야지라는 마인드로 호기롭게 블로그챌리진 도전했는데 점수는 더 떨어지고 아쉬운 마음만 크다. 이번 주에는 그래도 저번 주보다 조금이라도 아주 조금이라도 더 공부하자.
728x90
반응형
'PS > 코드트리' 카테고리의 다른 글
[코드트리 챌린지] 7주차 - 시뮬레이션(격자 안에서 단일 객체를 이동) (1) | 2023.10.23 |
---|---|
[코드트리 챌린지] 6주차 - 시간최적화(Priority Queue) (0) | 2023.10.16 |
[코드트리 챌린지] 4주차 - 그래프 탐색(BFS) (0) | 2023.10.02 |
[코드트리 챌린지] 3주차 - 2차원 바람 (0) | 2023.09.29 |
[코드트리 챌린지] 3주차 - 1차원 바람 (0) | 2023.09.23 |