diff --git "a/INSEA-99/week09/15649_N\352\263\274_M_(1).py" "b/INSEA-99/week09/15649_N\352\263\274_M_(1).py" new file mode 100644 index 0000000..083bb42 --- /dev/null +++ "b/INSEA-99/week09/15649_N\352\263\274_M_(1).py" @@ -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) diff --git "a/INSEA-99/week09/15652_N\352\263\274_M_(4).py" "b/INSEA-99/week09/15652_N\352\263\274_M_(4).py" new file mode 100644 index 0000000..3295212 --- /dev/null +++ "b/INSEA-99/week09/15652_N\352\263\274_M_(4).py" @@ -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) diff --git "a/INSEA-99/week09/24480_\354\225\214\352\263\240\353\246\254\354\246\230_\354\210\230\354\227\205_-_\352\271\212\354\235\264_\354\232\260\354\204\240_\355\203\220\354\203\211_2.py" "b/INSEA-99/week09/24480_\354\225\214\352\263\240\353\246\254\354\246\230_\354\210\230\354\227\205_-_\352\271\212\354\235\264_\354\232\260\354\204\240_\355\203\220\354\203\211_2.py" new file mode 100644 index 0000000..e968510 --- /dev/null +++ "b/INSEA-99/week09/24480_\354\225\214\352\263\240\353\246\254\354\246\230_\354\210\230\354\227\205_-_\352\271\212\354\235\264_\354\232\260\354\204\240_\355\203\220\354\203\211_2.py" @@ -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') \ No newline at end of file diff --git "a/INSEA-99/week09/2667_\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.py" "b/INSEA-99/week09/2667_\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.py" new file mode 100644 index 0000000..d206ffb --- /dev/null +++ "b/INSEA-99/week09/2667_\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.py" @@ -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') # 각 단지 내 집의 수를 오름차순으로 출력 \ No newline at end of file