Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions INSEA-99/week09/15649_N과_M_(1).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# pypy3
# 시간(ms) : 160
# 공간(KB) : 240752

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**5)

def dfs(depth) :
global n, m
if depth == m : # m 길이라면 출력
print(*anw)
else : # m 길이가 아니라면 탐색
for num in range(1, n + 1) :
if visited[num] == 0 : # 아직 사용하지 않았다면 사용
visited[num] = 1 # 방문처리
anw[depth] = num # 정답에 추가
dfs(depth + 1) # 탐색 지속

visited[num] = 0 # 탐색 후 미방문 처리

n, m = map(int, input().split())
anw = [0] * m
visited = [0] * (n + 1)
dfs(0)
20 changes: 20 additions & 0 deletions INSEA-99/week09/15652_N과_M_(4).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# pypy3
# 시간(ms) : 136
# 공간(KB) : 238864

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**5)

def dfs(depth, pre_num) :
global n, m
if depth == m : # m 길이라면 출력
print(*anw)
else : # m 길이가 아니라면 탐색
for num in range(pre_num, n + 1) : # 비내림차순을 위해 이전 숫자부터 탐색
anw[depth] = num # 정답에 추가
dfs(depth + 1, num) # 탐색 지속

n, m = map(int, input().split())
anw = [0] * m
dfs(0, 1)
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# pypy3
# 재귀
# 시간(ms) : 568
# 공간(KB) : 346740
#
# 스택
# 시간(ms) : 320
# 공간(KB) : 136564
#
# 공유 :
# - 스택(반복문) DFS가 재귀 DFS보다 대부분 더 빠르다. 그리고 안정성도 높다.
# - 파이썬은 재귀에 최적화 되어 있지 않고, 재귀는 함수를 호출하는거라 호출할 때마다 오버헤드가 발생한다.


import sys
from collections import deque
sys.setrecursionlimit(10**5)
input = sys.stdin.readline

# 재귀를 이용한 dfs
def dfs(node):
global idx
visited[node] = idx
idx += 1
for neighbor in adj[node]:
if not visited[neighbor]:
dfs(neighbor)

n, m, r = map(int, input().split())
adj = [[] for _ in range(n+1)]
visited = [0] * (n+1)
idx = 1
for _ in range(m): # 인접리스트 생성
u, v = map(int, input().split())
adj[u].append(v)
adj[v].append(u)

for neighbors in adj: # 인접리스트 정렬
neighbors.sort(reverse=True)

dfs(r)
print(*visited[1:], sep='\n')

# # 스택을 이용한 dfs
# def dfs2(start):
# idx = 1
# queue = deque([start])
# while queue:
# node = queue.popleft()
# if not visited[node]:
# visited[node] = idx
# idx += 1
# for neighbor in adj[node]:
# if not visited[neighbor]:
# queue.appendleft(neighbor)

# n, m, r = map(int, input().split())
# adj = [[] for _ in range(n+1)]
# visited = [0] * (n+1)
# for _ in range(m): # 인접리스트 생성
# u, v = map(int, input().split())
# adj[u].append(v)
# adj[v].append(u)

# for neighbors in adj: # 인접리스트 정렬
# neighbors.sort()

# dfs2(r)
# print(*visited[1:], sep='\n')
43 changes: 43 additions & 0 deletions INSEA-99/week09/2667_단지번호붙이기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# pypy3
# 시간(ms) : 108
# 공간(KB) : 113496

import sys
from collections import deque
input = sys.stdin.readline
# 방향: ↑, ↓, ←, →
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]


def dfs(r, c):
global n
map[r][c] = 0 # 방문 처리 (1 -> 0으로 변경하여 재방문 방지)
cnt = 1 # 현재 위치의 집을 카운트

# 4방향 탐색
for d in range(4):
nr = r + dr[d] # 다음 행 위치
nc = c + dc[d] # 다음 열 위치

# 범위 내에 있고, 집이 있는 경우(map[nr][nc] == 1)
if 0 <= nr < n and 0 <= nc < n and map[nr][nc] == 1:
cnt += dfs(nr, nc) # 재귀적으로 DFS 수행하여 카운트 누적

return cnt

n = int(input()) # 지도의 크기 N
map = [list(map(int, input().strip())) for _ in range(n)] # N×N 지도 (0: 집 없음, 1: 집 있음)

anw = [] # 각 단지별 집의 개수를 저장할 리스트

# 전체 지도를 순회하며 단지 찾기
for r in range(n):
for c in range(n):
# 집이 있고 아직 방문하지 않은 경우
if map[r][c] == 1:
anw.append(dfs(r, c)) # BFS로 단지 크기 계산 후 저장

# 출력
print(len(anw)) # 총 단지 수
print(*sorted(anw), sep='\n') # 각 단지 내 집의 수를 오름차순으로 출력