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
36 changes: 36 additions & 0 deletions mingsound/Backjoon/BFS/13549 숨바꼭질 3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import sys
input = sys.stdin.readline
from collections import deque

n, k = map(int, input().split())
MAX = 100001
visited = [False] * MAX
dist = [-1] * MAX

q = deque()
q.append(n)
visited[n] = True
dist[n] = 0

dx = [-1, 1]
while q:
now = q.popleft()
if now == k: # 목표 도달
break

next = now * 2
if 0 <= next < MAX and not visited[next]:
q.appendleft(next) # 우선순위가 높으니까 왼쪽
visited[next] = True
dist[next] = dist[now]

for i in range(2):
next = now + dx[i]
if 0 <= next < MAX and not visited[next]:
q.append(next)
visited[next] = True
dist[next] = dist[now] + 1

print(dist[k])

# 우선순위에 따라서 왼쪽에 넣을수가 있군
41 changes: 41 additions & 0 deletions mingsound/Backjoon/BFS/13913 숨바꼭질 4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import sys
input = sys.stdin.readline
from collections import deque

n, k = map(int, input().split())

visited = [-1] * 100001


def bfs():

deq = deque([(n, 0)])
visited[n] = n

while deq:
now, cnt = deq.popleft()

if now == k:
return cnt

next = now * 2
if 0 <= next < 100001 and visited[next] == -1 and next != 0:
visited[next] = now # 방문처리 대신, 이전에 방문한 위치를 저장
deq.append((next, cnt + 1))

for dx in [-1, 1]:
next = now + dx
if 0 <= next < 100001 and visited[next] == -1:
visited[next] = now
deq.append((next, cnt + 1))


print(bfs())

route = [k]
while k != n:
route.append(visited[k])
k = visited[k]
print(*route[::-1])

# https://www.acmicpc.net/board/view/125156 <- 메모리 초과 해결...
41 changes: 41 additions & 0 deletions mingsound/Backjoon/BFS/14442 벽 부수고 이동하기 2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import sys
input = sys.stdin.readline
from collections import deque

n, m, k = map(int, input().split())
graph = [list(map(int, list(input().rstrip()))) for _ in range(n)]
visited = [[[0] * m for _ in range(n)] for _ in range(k+1)]
# print(len(visited), len(visited[0]), len(visited[0][0]))
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def bfs():
deq = deque([(0, 0, 0)]) # (x, y, cnt)
visited[0][0][0] = 1

while deq:
x, y, cnt = deq.popleft()

if x == n-1 and y == m-1: # 원하는 위치에 도달
return visited[cnt][x][y]


for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m: # 격자 범위 안에 들어오는 경우에 대해서만
# 다음 이동 칸이 벽이 아닌 경우
if graph[nx][ny] == 0:

if not visited[cnt][nx][ny]:
visited[cnt][nx][ny] = visited[cnt][x][y] + 1
deq.append((nx, ny, cnt))
# 다음 이동 칸이 벽인 경우
else:
if cnt < k and not visited[cnt+1][nx][ny]: # 아직 벽을 부술 수 있는 경우
visited[cnt+1][nx][ny] = visited[cnt][x][y] + 1
deq.append((nx, ny, cnt+1))

return -1

print(bfs())
41 changes: 41 additions & 0 deletions mingsound/Backjoon/BFS/1600 말이 되고픈 원숭이.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import sys
input = sys.stdin.readline
from collections import deque


k = int(input())
w, h = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(h)]
visited = [[[0] * w for _ in range(h)] for _ in range(k+1)]
# print(len(visited), len(visited[0]), len(visited[0][0]))
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
dx2 = [-1, -1, -2, -2, 1, 1, 2, 2]
dy2 = [-2, 2, -1, 1, -2, 2, -1, 1]

deq = deque([(0, 0, 0)]) # (x, y, cnt)
visited[0][0][0] = 1

while deq:
x, y, cnt = deq.popleft()

if x == h-1 and y == w-1:
print(visited[cnt][x][y]-1)
exit(0)

for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < h and 0 <= ny < w and not visited[cnt][nx][ny] and graph[nx][ny] == 0:
visited[cnt][nx][ny] = visited[cnt][x][y] + 1
deq.append((nx, ny, cnt))

if cnt < k:
for i in range(8):
nx = x + dx2[i]
ny = y + dy2[i]
if 0 <= nx < h and 0 <= ny < w and not visited[cnt+1][nx][ny] and graph[nx][ny] == 0:
visited[cnt+1][nx][ny] = visited[cnt][x][y] + 1
deq.append((nx, ny, cnt+1))

print(-1)
69 changes: 69 additions & 0 deletions mingsound/Backjoon/BFS/2146 다리 만들기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import sys
input = sys.stdin.readline
from collections import deque

n = int(input())
graph = [list(map(int, input().split())) for _ in range(n)]


dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 각 섬 구분
def color_bfs(x, y, idx):
deq = deque([(x, y)])
deq2 = deque([(x, y)]) # 섬의 모든 좌표를 담은 deque
graph[x][y] = idx

while deq:
x, y = deq.popleft()

for i in range(4):
nx = x + dx[i]
ny = y + dy[i]

if 0 <= nx < n and 0 <= ny < n and graph[nx][ny] == 1:
graph[nx][ny] = idx
deq.append((nx, ny))
deq2.append((nx, ny))

return bfs(deq2, idx)


# 해당 섬에서 다른 섬까지의 가장 짧은 좌표
def bfs(deq2, idx):
deq = deq2
x, y = deq2[0]
visited = [[0] * n for _ in range(n)]
visited[x][y] = 1
answer = sys.maxsize

while deq:
x, y = deq.popleft()

for i in range(4):
nx = x + dx[i]
ny = y + dy[i]

if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]: # 범위 안에 있고, 아직 방문하지 않았다면
if graph[nx][ny] == idx: # 같은 섬이라면 visited 1로 처리(방문표시만 하고, 거리는 증가 X)
visited[nx][ny] = 1 #
deq.append((nx, ny))
elif graph[nx][ny] == 0: # 물이라면, visited에 거리를 +1한 값을 작성
visited[nx][ny] = visited[x][y] + 1
deq.append((nx, ny))
else: # 다른섬을 만났다면, answer 더 작은 값으로 갱신
answer = min(answer, visited[x][y]-1)
return answer

# 섬 구분
idx = 2
answer = sys.maxsize
for i in range(n):
for j in range(n):
if graph[i][j] == 1:
answer = min(answer, color_bfs(i, j, idx))
idx += 1

print(answer)


20 changes: 20 additions & 0 deletions mingsound/Backjoon/DP/12865 평범한 배낭.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import sys
input = sys.stdin.readline

n, k = map(int, input().split()) # 물건 수, 버틸 수 있는 무게
arr = [(0, 0)] + [tuple(list(map(int, input().split()))) for _ in range(n)] # (무게, 가치)

dp = [[0] * (k+1) for _ in range(n+1)] # dp[i][j]는 i번째 물건까지 봤을때, 견딜 수 있는 무게가 j인 경우 최대 value

for i in range(1, n+1):
weight, value = arr[i]
for j in range(1, k+1):
# 새로 추가될 물건의 무게가, 견딜 수 있는 무게보다 크다면, 이전 물건까지의 값을 이어 받는다.
if weight > j:
dp[i][j] = dp[i-1][j]
else:
# 새로운 물건을 담아 value를 얻는 것과 이전 물건까지 계산했던 value 중에서 더 큰 것을 택함
dp[i][j] = max(dp[i-1][j-weight] + value, dp[i-1][j])

print(dp[n][k])

15 changes: 15 additions & 0 deletions mingsound/Backjoon/그리디/1026 보물.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import sys
input = sys.stdin.readline

n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

A.sort()
B.sort(reverse=True)

answer = 0
for i in range(n):
answer += A[i] * B[i]

print(answer)
20 changes: 20 additions & 0 deletions mingsound/Backjoon/백트래킹/N과 M(1).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
def dfs():
if len(s) == m: # m개를 모두 택했다면
print(' '.join(map(str, s))) # 출력
return

# 백트래킹 핵심 구조
for i in range(1, n+1):
if visited[i]:# 아직 i가 사용되지 않았다면
continue # 계속
visited[i] = True
s.append(i)
dfs() # 다음 수를 고르러 한 단계 더 들어감
s.pop() # 백 트래킹, 다 확인했으니까 마지막꺼
visited[i] = False

n, m = map(int, input().split())
s = []
visited = [False] * (n+1)

dfs()
23 changes: 23 additions & 0 deletions mingsound/Backjoon/백트래킹/N과 M(2).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
def dfs():
if len(s) == m:
print(" ".join(list(map(str, s))))
return

for i in range(1, n+1):
if visited[i]:
continue
if len(s) != 0 and s[-1] > i: # s가 비어있지 않은데, 가장 마지막에 있는 것보다 작으면, 오름차순 아님
continue

visited[i] = True
s.append(i)
dfs()
s.pop()
visited[i] = False


n, m = map(int, input().split())
s = []
visited = [False] * (n+1)

dfs()
15 changes: 15 additions & 0 deletions mingsound/Backjoon/백트래킹/N과 M(3).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
def dfs():
if len(s) == m:
print(" ".join(list(map(str, s))))
return

for i in range(1, n+1):
s.append(i)
dfs()
s.pop()


n, m = map(int, input().split())
s = []

dfs()
18 changes: 18 additions & 0 deletions mingsound/Backjoon/백트래킹/N과 M(4).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
def dfs():
if len(s) == m:
print(" ".join(list(map(str, s))))
return

for i in range(1, n+1):
if len(s) != 0 and s[-1] > i: # s가 비어있지 않은데, 가장 마지막에 있는 것보다 작으면, 오름차순 아님
continue

s.append(i)
dfs()
s.pop()


n, m = map(int, input().split())
s = []

dfs()
21 changes: 21 additions & 0 deletions mingsound/Backjoon/백트래킹/N과 M(5).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
def dfs():
if len(s) == m:
print(' '.join(map(str, s)))
return

# 백트래킹 핵심 구조
for i in range(n):
if visited[i]:
continue
visited[i] = True
s.append(arr[i])
dfs()
s.pop()
visited[i] = False

n, m = map(int, input().split())
arr = sorted(list(map(int, input().split())))
s = []
visited = [False] * (n+1)

dfs()
Loading