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
11 changes: 11 additions & 0 deletions heesoo/Backjoon/DP/11659 구간 합 구하기 4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
arr = list(map(int,input().split()))

for i in range(1, len(arr)):
arr[i] += arr[i - 1]
arr = [0] + arr
for _ in range(m):
a, b = map(int, input().split())
print(arr[b] - arr[a - 1])
7 changes: 7 additions & 0 deletions heesoo/Backjoon/bfs_dfs/2206 벽 부수고 이동하기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
n,m=map(int,input().split())
board=[[int(char) for char in input()] for _ in range(n)]

dx=[0,0,-1,1]
dy=[1,-1,0,0]

open=0
39 changes: 39 additions & 0 deletions heesoo/Backjoon/bfs_dfs/2667 단지번호붙이기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from collections import deque
n=int(input())
board=[[int(char) for char in input()] for _ in range(n)]

dx=[0,0,-1,1]
dy=[1,-1,0,0]

def bfs(a,b,board):
cnt=0
q=deque()
q.append((a,b))
board[a][b]=0

while q:
x,y=q.popleft()
cnt+=1
for i in range(4):
nx=x+dx[i]
ny=y+dy[i]

if 0>nx or nx>=n or 0>ny or ny>=n:
continue

if board[nx][ny]==1:
board[nx][ny]=0
q.append((nx,ny))
return cnt


ans=[]
for i in range(n):
for j in range(n):
if board[i][j]==1:
ans.append(bfs(i,j,board))

print(len(ans))
ans.sort()
for i in ans:
print(i)
53 changes: 53 additions & 0 deletions heesoo/Backjoon/bfs_dfs/7569 토마토.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from collections import deque
m,n,h=map(int,input().split())
answer=0
dx=[0,0,1,-1,0,0]
dy=[1,-1,0,0,0,0]
dz=[0,0,0,0,-1,1]

graph=[[] for _ in range(h)]
visited=[[[0 for _ in range(m)] for _ in range(n)] for _ in range(h)]

for i in range(n*h):
listm=list(map(int,input().split()))
graph[i//n].append(listm)

dq=deque()

def bfs(x,y,z,graph):
dq=deque()
dq.append((x,y,z))

while dq:
a,b,c=dq.popleft()

for i in range(6):
nx=a+dx[i]
ny=b+dy[i]
nz=c+dz[i]

if nx<0 or nx>=h or ny<0 or ny>=n or nz<0 or nz>=m:
continue

if graph[nx][ny][nz]==0 and visited[nx][ny][nz]==0:
dq.append([nx,ny,nz])
visited[nx][ny][nz]==1
graph[nx][ny][nz]=graph[a][b][c]+1

for i in range(h):
for j in range(n):
for k in range(m):
if graph[i][j][k]==1 and visited[i][j][k]==0:
bfs(i,j,k,graph)
visited[i][j][k]=1

for i in graph:
for j in i:
for k in j:
if k==0:
print(-1)
exit(0)
answer=max(answer,max(j))


print(answer-1)
25 changes: 25 additions & 0 deletions heesoo/Backjoon/그래프/1613 역사.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import sys
ip = sys.stdin.readline

n, k = map(int, ip().split())
arr=[[0 for _ in range(n+1)] for _ in range(n+1)]

for _ in range(k):
a,b=map(int,ip().split())
arr[a][b]=1 # a -> b

for i in range(n+1):
for j in range(n+1):
for t in range(n+1):
if arr[j][i]+arr[i][t] == 2:
arr[j][t]=1

s=int(ip())
for _ in range(s):
a,b=map(int,ip().split())
if arr[a][b]==1:
print(-1)
elif arr[b][a]==1:
print(1)
else:
print(0)
40 changes: 40 additions & 0 deletions heesoo/Backjoon/그래프/1753 최단경로.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import sys
import heapq
input = sys.stdin.readline

n, m = map(int, input().split())
k = int(input())
INF = int(1e9)


graph = [[] * (n+1) for _ in range(n+1)]
distance = [INF] * (n+1)

for _ in range(m):
a, b, c = map(int, input().split())
graph[a].append((b, c))


def dijkstra(start):
q = []
heapq.heappush(q, (0, start))
distance[start] = 0

while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue

for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))

dijkstra(k)

for i in range(1, n+1):
if distance[i] == INF:
print("INF")
else:
print(distance[i])
33 changes: 33 additions & 0 deletions heesoo/Backjoon/그래프/2252 줄 세우기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from collections import deque

n,m=map(int,input().split())
indegree=[0]*(n+1)
graph=[[] for _ in range(n+1)]

for _ in range(m):
a,b=map(int,input().split())
graph[a].append(b)
indegree[b]+=1

def sortList(indegree, graph):
result=[]
q=deque()
for i in range(1,len(indegree)):
if indegree[i]==0:
q.append(i)

while q:
now=q.popleft()
result.append(now)

for i in graph[now]:
indegree[i]-=1

if indegree[i]==0:
q.append(i)

return result

answer=sortList(indegree,graph)
answer = list(map(str,answer))
print(' '.join(answer))
Empty file.
Empty file.
8 changes: 8 additions & 0 deletions heesoo/코테준비/1563 개근상.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# 지각 두번 이상
# 결석 세번 연속
# O 출석 L 지각 A 결석
n = int(input())
total = 3 ** n

# 결석 세번 연속
absent =
21 changes: 21 additions & 0 deletions heesoo/코테준비/17626 Four Squares.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from itertools import permutations, combinations
import math
n = int(input())


def getValue(n):
if math.sqrt(n) == int(math.sqrt(n)):
return 1

for i in range(1, int(math.sqrt(n)) + 1):
if math.sqrt(n - i**2) == int(math.sqrt(n - i**2)):
return 2

for i in range(1, int(math.sqrt(n)) + 1):
for j in range(1, int(math.sqrt(n - i**2)) + 1):
if math.sqrt(n - i**2 - j**2) == int(math.sqrt(n - i**2 - j**2)):
return 3

return 4

print(getValue(n))
25 changes: 25 additions & 0 deletions heesoo/코테준비/18870 좌표압축.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
n = int(input())
arr = list(map(int, input().split()))

temp_list = []
for i in range(len(arr)):
temp_list.append([i, arr[i]])

temp_list = sorted(temp_list, key = lambda x:x[1])

temp_list[0].append(0)
num = temp_list[0][1]
pos = 0

for i in range(1, len(temp_list)):
a, b = temp_list[i]
if temp_list[i - 1][1] < b:
pos += 1
temp_list[i].append(pos)
else:
temp_list[i].append(pos)

temp_list = sorted(temp_list, key = lambda x : x[0])

for c in temp_list:
print(c[2], end = ' ')
10 changes: 10 additions & 0 deletions heesoo/코테준비/18870 좌표압축2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
n = int(input())
arr = list(map(int, input().split()))

arr2 = sorted(list(set(arr)))
print(arr2)

dict_val = {arr2[i] : i for i in range(len(arr2))}

for i in arr:
print(dict_val[i], end = ' ')
30 changes: 30 additions & 0 deletions heesoo/코테준비/2170 선 긋기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import sys

input = sys.stdin.readline

N = int(input())
origin_lines = list(tuple(map(int, input().split())) for _ in range(N))

origin_lines.sort() # 정렬

# 맨 처음 꺼 기준으로
start = origin_lines[0][0]
end = origin_lines[0][1]

ans = 0
for k in range(1, N): # 나머지 선들 보자
now_start, now_end = origin_lines[k]

# 겹치는 경우 => 시작점은 무조건 원래 있던 게 더 앞섬. 도착점은 비교해서 정하기.
if end > now_start:
end = max(end, now_end)

# 안 겹치는 경우
else:
# 기존 것을 ans에 더하기
ans += (end - start)
# 새로운 걸로 업데이트
start, end = now_start, now_end

ans += (end - start)
print(ans)
30 changes: 30 additions & 0 deletions heesoo/코테준비/dfsbfs/10971 외판원 순회.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
ans = int(1e9)

def dfs(start, now, value, cnt):
print(start, now, value, cnt)
global ans
if cnt == n:
if a[now][start]:
value += a[now][start]
if ans > value:
ans = value

return

if value > ans:
return

for i in range(n):
if not visited[i] and a[now][i]:
visited[i] = 1
dfs(start, i, value + a[now][i], cnt + 1)
visited[i] = 0

visited = [0] * n
for i in range(n):
visited[i] = 1
dfs(i, i, 0, 1)
visited[i] = 0
print(ans)
Loading