Skip to content
Merged
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
41 changes: 41 additions & 0 deletions minjeong/BruteForce/2025-07-26-[PGS]-거리두기확인하기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
def solution(places):
def is_safe(place):
for i in range(5):
for j in range(5):
if place[i][j] != 'P':
continue

for dx, dy in dirs:
ni, nj = i + dx, j + dy
if not (0 <= ni < 5 and 0 <= nj < 5):
continue
if place[ni][nj] != 'P':
continue

dist = abs(dx) + abs(dy)
if dist == 1:
return 0 # 거리 1에서 바로 P면 위반
elif dist == 2:
# 파티션 여부 확인
if dx == 0: # 수평
if place[i][j + dy // 2] != 'X':
return 0
elif dy == 0: # 수직
if place[i + dx // 2][j] != 'X':
return 0
else: # 대각선
if place[i][nj] != 'X' or place[ni][j] != 'X':
return 0
return 1

dirs = [
(-1, 0), (1, 0), (0, -1), (0, 1), # 거리 1
(-2, 0), (2, 0), (0, -2), (0, 2), # 일직선 거리 2
(-1, -1), (-1, 1), (1, -1), (1, 1) # 대각선 거리 2
]

answer = []
for place in places:
answer.append(is_safe(place))

return answer
41 changes: 41 additions & 0 deletions minjeong/DFSBFS/2025-07-26-[PGS]-거리두기확인하기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
def solution(places):
def is_safe(place):
for i in range(5):
for j in range(5):
if place[i][j] != 'P':
continue

for dx, dy in dirs:
ni, nj = i + dx, j + dy
if not (0 <= ni < 5 and 0 <= nj < 5):
continue
if place[ni][nj] != 'P':
continue

dist = abs(dx) + abs(dy)
if dist == 1:
return 0 # 거리 1에서 바로 P면 위반
elif dist == 2:
# 파티션 여부 확인
if dx == 0: # 수평
if place[i][j + dy // 2] != 'X':
return 0
elif dy == 0: # 수직
if place[i + dx // 2][j] != 'X':
return 0
else: # 대각선
if place[i][nj] != 'X' or place[ni][j] != 'X':
return 0
return 1

dirs = [
(-1, 0), (1, 0), (0, -1), (0, 1), # 거리 1
(-2, 0), (2, 0), (0, -2), (0, 2), # 일직선 거리 2
(-1, -1), (-1, 1), (1, -1), (1, 1) # 대각선 거리 2
]

answer = []
for place in places:
answer.append(is_safe(place))

return answer
42 changes: 42 additions & 0 deletions minjeong/DFSBFS/2025-08-03-[백준]-#2458-안전구역.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import sys
sys.setrecursionlimit(100000)

input = sys.stdin.readline

# 방향벡터
directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]

def dfs(x, y):
# 깊이 탐색을 하며 안전 영역 탐색
visited[x][y] = True
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < N and 0 <= ny < N and \
not visited[nx][ny] and map[nx][ny] > h:
dfs(nx, ny)


N = int(input())
map = [list(map(int, input().split())) for _ in range(N)]
max_height = 0

# 맵 내의 최대값 구하기
for m in map:
max_height = max(max_height, max(m))

answer = 0

for h in range(0, max_height + 1): # 물이 잠기지 않는 상황을 고려하여 0부터 시작
visited = [[False for _ in range(N)] for _ in range(N)]
count = 0

for i in range(N):
for j in range(N):
# 아직 방문하지 않았고 h(높이) 이상인 지점이라면 DFS 탐색을 한다.
if not visited[i][j] and map[i][j] > h:
dfs(i, j)
count += 1 # DFS 탐색을 마치면 하나의 안전 영역이므로 count

answer = max(answer, count) # 안전영역 최대 개수 계산

print(answer)
31 changes: 31 additions & 0 deletions minjeong/DFSBFS/2025-08-04-[백준]-#2644-촌수계산.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import sys
input = sys.stdin.readline

def dfs(start, cnt):
global chonsu
if start == y:
chonsu = cnt
return

for i in graph[start]:
if not visited[i]:
visited[i] = True
dfs(i, cnt + 1)
visited[i] = False


n = int(input()) # 전체 사람 개수
x, y = map(int, input().split())
graph = [[] for _ in range(n+1)]
visited = [False for _ in range(n + 1)]
chonsu = -1 # 정답으로 반환할 촌수

m = int(input()) # 부모 자식들간의 관계 개수
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)

visited[x] = True
dfs(x, 0)
print(chonsu)
46 changes: 46 additions & 0 deletions minjeong/DFSBFS/2025-08-05-[백준]-#5014-스타트링크.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import sys
from collections import deque

input = sys.stdin.readline

# 총 층수 F, 현재 층 S, 목표 층 G, 위 버튼 U, 아래 버튼 D
F, S, G, U, D = map(int, input().split())


def bfs():
if S == G: # 강호가 이미 도착해있다면 0번 클릭
return 0

visited = [False for _ in range(F + 1)]
queue = deque([(S, 1)]) # (현재 층, 버튼 클릭 횟수)
visited[S] = True

while queue:
x, cnt = queue.popleft()

# 위로 이동
nx = x + U
if nx <= F and not visited[nx]:
if nx == G: # 목표층 도착
return cnt
queue.append((nx, cnt + 1))
visited[nx] = True # 방문여부 표시 꼭 넣어주기

# 아래로 이동
nx = x - D
if nx > 0 and not visited[nx]:
if nx == G: # 목표층 도착
return cnt
queue.append((nx, cnt + 1))
visited[nx] = True

# 목표층에 도달하지 못한 경우
return -1


# BFS 탐색
answer = bfs()
if answer == -1:
print("use the stairs")
else:
print(answer)
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import sys
from collections import deque
input = sys.stdin.readline

N, K = map(int, input().split())
# 1번부터 N번까지 사람을 큐에 넣기
people = deque([i+1 for i in range(N)])
answer = [] # 제거된 순서를 저장할 리스트

while people:
# K-1번 앞의 원소를 빼서 뒤로 보냄 (원형 이동)
for _ in range(K-1):
cur = people.popleft()
people.append(cur)
# K번째에서 제거
answer.append(people.popleft())

# 정답 출력
print("<" + ", ".join(map(str, answer)) + ">")