Skip to content

Commit cfa4c39

Browse files
committed
GDSC Algorithm Study Week 4
1 parent 423dc4f commit cfa4c39

File tree

10 files changed

+307
-0
lines changed

10 files changed

+307
-0
lines changed

04-240409/jhjalison01/2143.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#백준 2143번 두 배열의 합
2+
3+
import sys
4+
input=sys.stdin.readline
5+
import bisect
6+
7+
T = int(input())
8+
n=int(input())
9+
a=list(map(int,input().split()))
10+
m=int(input())
11+
b=list(map(int,input().split()))
12+
13+
#배열 a,b의 부 배열의 합 모든 경우 구하기
14+
a_sum,b_sum=[],[]
15+
for i in range(n):
16+
for j in range(i+1,n+1):
17+
a_sum.append(sum(a[i:j]))
18+
19+
for i in range(m):
20+
for j in range(i+1,m+1):
21+
b_sum.append(sum(b[i:j]))
22+
23+
#이분 탐색을 위해 정렬
24+
a_sum.sort()
25+
b_sum.sort()
26+
27+
answer=0
28+
for i in range(len(a_sum)):
29+
tmp=T-a_sum[i]
30+
left = bisect.bisect_left(b_sum, tmp)
31+
right = bisect.bisect_right(b_sum, tmp)
32+
answer+=right-left #경우의 수 추가
33+
34+
print(answer)

04-240409/jhjalison01/A.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#백준 14697번 방 배정하기
2+
3+
import sys
4+
input=sys.stdin.readline
5+
6+
a,b,c,n=map(int,input().split())
7+
result=0
8+
9+
for i in range(n//a+1):
10+
for j in range(n//b+1):
11+
for k in range(n//c+1):
12+
#합이 n이 될 경우
13+
if i*a+j*b+k*c==n:
14+
result=1
15+
16+
print(result)

04-240409/jhjalison01/B.py

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#백준 10597번 방 배정하기
2+
3+
import sys
4+
input=sys.stdin.readline
5+
6+
nums=input().rstrip()
7+
#n: 숫자 개수
8+
if len(nums)<10:
9+
n=len(nums)
10+
else:
11+
n=9+(len(nums)-9)//2
12+
13+
visited=[False for _ in range(n+1)]
14+
15+
def dfs(idx,arr):
16+
#다 구한 경우 복구된 수열 출력
17+
if idx==len(nums):
18+
print(*arr)
19+
exit()
20+
21+
#한 자릿수 체크
22+
num1 = int(nums[idx])
23+
if not visited[num1]:
24+
visited[num1]=True
25+
arr.append(num1)
26+
dfs(idx+1,arr)
27+
visited[num1] = False
28+
arr.pop()
29+
30+
#두 자릿수 체크
31+
if idx+1<len(nums):
32+
num2 = int(nums[idx:idx+2])
33+
if num2<=n and not visited[num2]:
34+
visited[num2]=True
35+
arr.append(num2)
36+
dfs(idx+2,arr)
37+
visited[num2]=False
38+
arr.pop()
39+
40+
dfs(0,[])

04-240409/jhjalison01/C.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#백준 14675번 단절점과 단절선
2+
3+
import sys
4+
input=sys.stdin.readline
5+
6+
n=int(input())
7+
8+
graph=[[] for _ in range(n+1)]
9+
for _ in range(n-1):
10+
a,b=map(int,input().split())
11+
graph[a].append(b)
12+
graph[b].append(a)
13+
14+
q=int(input())
15+
for _ in range(q):
16+
t,k=map(int,input().split())
17+
if t==1: #k번 정점이 단절점인지
18+
if len(graph[k])<2:
19+
print("no")
20+
else:
21+
print("yes")
22+
else: #k번 정점이 단절선인지
23+
#모든 간선은 노드 2개를 연결하고 있기 때문에 항상 yes
24+
print("yes")

04-240409/jhjalison01/D.py

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#백준 3273번 두 수의 합
2+
3+
#n 입력받기
4+
n=int(input())
5+
#수열 입력받기
6+
data=list(map(int,input().split()))
7+
#x 입력받기
8+
x=int(input())
9+
data.sort() #수열 오름차순으로 정렬
10+
answer=0
11+
12+
front=0 #앞쪽 포인터
13+
back=n-1 #뒤쪽 포인터
14+
15+
while front<back:
16+
#두 수를 더했을 때 x가 나온 경우
17+
if data[front]+data[back]==x:
18+
answer+=1
19+
#두 수를 더했을 때 x보다 작은 경우
20+
elif data[front]+data[back]<x:
21+
front+=1 #포인터 뒤로 이동
22+
continue
23+
#포인터 앞으로 이동
24+
back-=1
25+
26+
print(answer)

04-240409/jhjalison01/E.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#백준 21318번 피아노 체조
2+
3+
import sys
4+
input=sys.stdin.readline
5+
6+
#악보의 개수
7+
n=int(input())
8+
#악보 난이도
9+
diff = list(map(int,input().split()))
10+
11+
dp=[0]*n
12+
for i in range(1,n):
13+
if diff[i-1]>diff[i]:
14+
dp[i]=dp[i-1]+1
15+
else:
16+
dp[i]=dp[i-1]
17+
18+
#질문 개수
19+
q=int(input())
20+
21+
for _ in range(q):
22+
x,y=map(int,input().split())
23+
#x부터 y까지 틀린 악보 개수 출력
24+
print(dp[y-1]-dp[x-1])

04-240409/jhjalison01/F.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#백준 1757번 달려달려
2+
3+
import sys
4+
input=sys.stdin.readline
5+
6+
n,m=map(int,input().split())
7+
dis=[0]
8+
for _ in range(n):
9+
dis.append(int(input()))
10+
11+
#dp[i][j] - 달린 거리
12+
#: i - i분, j - 지침 지수
13+
dp=[[0]*(m+1) for _ in range(n+1)]
14+
15+
for i in range(1,n+1):
16+
#직전에도 쉬고 현재 분에도 쉰 거리
17+
dp[i][0] = dp[i-1][0]
18+
for j in range(1,m+1):
19+
#i분까지 달린 거리
20+
dp[i][j] = dp[i-1][j-1]+dis[i]
21+
dp[i][0] = max(dp[i][0],dp[i-j][j])
22+
23+
#최대 거리 출력
24+
print(dp[-1][0])

04-240409/jhjalison01/G.py

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#백준 2606번 바이러스
2+
3+
import sys
4+
5+
n=int(sys.stdin.readline())
6+
m=int(sys.stdin.readline())
7+
8+
graph=[]
9+
10+
#그래프를 리스트 자료형으로 표현
11+
for i in range(n+1):
12+
graph.append([])
13+
14+
#각 노드가 연결된 정보를 표현
15+
for i in range(m):
16+
a,b=map(int,sys.stdin.readline().split())
17+
graph[a].append(b)
18+
graph[b].append(a)
19+
20+
#각 노드가 방문된 정보를 리스트 자료형으로 표현
21+
visited=[False]*(n+1)
22+
23+
#1번 컴퓨터는 제외해야 하므로 초기값을 -1로 설정한다.
24+
result=-1
25+
26+
#dfs 메소드 정의
27+
def dfs(graph,v,visited):
28+
visited[v]=True
29+
global result
30+
result+=1
31+
for i in graph[v]:
32+
if not visited[i]:
33+
dfs(graph,i,visited)
34+
35+
36+
dfs(graph,1,visited)
37+
print(result)

04-240409/jhjalison01/H.py

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#백준 12761번 돌다리
2+
3+
import sys
4+
input=sys.stdin.readline
5+
from collections import deque
6+
#스카이 콩콩의 힘, 동규의 현재위치, 주미의 현재위치
7+
a,b,n,m=map(int,input().split())
8+
9+
graph=[0 for _ in range(100001)]
10+
visited=[False for _ in range(100001)]
11+
#-1,+1,+a,-a,+b,-b, a배, b배
12+
dx=[-1,1,a,-a,b,-b,a,b]
13+
14+
def bfs(a):
15+
q=deque([a])
16+
visited[a]=True
17+
18+
while q:
19+
x=q.popleft()
20+
21+
for i in range(8):
22+
#6가지 경우는 덧셈 연산
23+
if i<6:
24+
nx=x+dx[i]
25+
else:
26+
#나머지는 곱셈 연산
27+
nx=x*dx[i]
28+
#범위 내에 있고 탐색하지 않은 경우
29+
if 0<=nx<=100000 and not visited[nx]:
30+
q.append(nx)
31+
visited[nx]=True
32+
graph[nx]=graph[x]+1
33+
34+
35+
bfs(n)
36+
print(graph[m])

04-240409/jhjalison01/I.py

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#백준 14923번 미로 탈출
2+
3+
import sys
4+
input=sys.stdin.readline
5+
from collections import deque
6+
7+
dx=[-1,1,0,0]
8+
dy=[0,0,-1,1]
9+
10+
n,m=map(int,input().split())
11+
12+
hx,hy=map(int,input().split())
13+
ex,ey=map(int,input().split())
14+
15+
graph=[]
16+
for _ in range(n):
17+
graph.append(list(map(int,input().split())))
18+
19+
#visited[x][y][magic]: (x,y) 지점에 남은 마법 횟수가 magic 일 경우 도달한 적이 있는지
20+
visited=[[[False]*2 for _ in range(m)] for _ in range(n)]
21+
visited[hx-1][hy-1][1]=True
22+
23+
def bfs():
24+
q=deque()
25+
q.append((hx-1,hy-1,1,0))
26+
27+
while q:
28+
#magic: 남은 마법 횟수, cost: 걸린 시간
29+
x,y,magic,cost=q.popleft()
30+
if x==ex-1 and y==ey-1:
31+
return cost
32+
33+
for i in range(4):
34+
nx,ny=x+dx[i],y+dy[i]
35+
if 0<=nx<n and 0<=ny<m and not visited[nx][ny][magic]:
36+
#(nx,ny)가 벽이고 마법을 쓸 수 있을 경우 - 마법 사용
37+
if magic==1 and graph[nx][ny]==1:
38+
visited[nx][ny][0]=True
39+
q.append((nx,ny,0,cost+1))
40+
#(nx,ny)가 빈 칸일 경우 - 그냥 이동
41+
elif graph[nx][ny]==0:
42+
visited[nx][ny][magic]=True
43+
q.append((nx,ny,magic,cost+1))
44+
return -1
45+
46+
print(bfs())

0 commit comments

Comments
 (0)