Skip to content

Commit 45be0bb

Browse files
authored
Merge pull request #249 from AlgorithmStudy-Allumbus/hongjoo
Hongjoo/ 9월 1주차 / 6문제
2 parents 8298648 + 53a83d7 commit 45be0bb

File tree

6 files changed

+246
-0
lines changed

6 files changed

+246
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""
2+
유형 : DP
3+
IDEA : dp(i,j)의 값에 만들 수 있는 정사각형 최대 길이로 할당하기
4+
FLOW
5+
- if board[i][j] == 1 이면
6+
-> dp[i,j] = min( (i-1,j), (i,j-1) , (i-1,j-1)) + 1 대입
7+
"""
8+
def solution(board):
9+
answer = 0
10+
dp = [[0]*len(board[0]) for _ in range(len(board))]
11+
#1. 반복문으로 board[i,j] 찾기
12+
for i in range(len(board)):
13+
for j in range(len(board[0])):
14+
if board[i][j] == 1 :
15+
#2. dp로 (i,j)을 정사각형 오른쪽 아래 칸으로 가지는 최대 변의 길이 구하기
16+
if 0<=i-1<=len(board) and 0<=j-1 < len(board[0]):
17+
dp[i][j] = min(dp[i-1][j] , dp[i][j-1] , dp[i-1][j-1]) +1
18+
# print(dp[i][j])
19+
20+
else :
21+
dp[i][j] = 1
22+
answer= max(answer , dp[i][j])
23+
24+
# print(dp)
25+
# print(answer)
26+
return answer**2

Hongjoo/백준/blobaww.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import sys
2+
answer =0
3+
N, M = map(int, sys.stdin.readline().split())
4+
board =[[] for _ in range(N)]
5+
# E와 M의 누적합 행렬 정의
6+
e_sum = [[0]*M for _ in range(N)]
7+
m_sum = [[0]*M for _ in range(N)]
8+
9+
for i in range(N):
10+
board[i] = list(sys.stdin.readline()[:-1])
11+
for j in range(M):
12+
if board[i][j] == "E" :
13+
e_sum[i][j] = 1
14+
elif board[i][j] == "M" :
15+
m_sum[i][j] = 1
16+
17+
# 2.E와 M 행렬 누적합 계산하기
18+
# dp[i][j] = dp[i-1][j] + dp[i][j-1] -dp[i-1][j-1 + value[i][j]
19+
for i in range(N):
20+
for j in range(M):
21+
# E의 누적합 계산
22+
# i=0 or j=0 일때 누적합 점화식
23+
if i==0 and j== 0 :
24+
e_sum[0][0] = e_sum[0][0]
25+
elif i== 0 : # 가로형 누적합 계산식 :
26+
e_sum[i][j] = e_sum[0][j-1]+e_sum[0][j]
27+
elif j == 0: # 세로형 누적합 계산식
28+
e_sum[i][j] = e_sum[i][0] + e_sum[i-1][0]
29+
else : # 일반적인 누적합 계산식
30+
e_sum[i][j] = e_sum[i-1][j] + e_sum[i][j-1] - e_sum[i-1][j-1] + e_sum[i][j]
31+
32+
#M의 누적합 계산 : E의 누적합의 역방향(아래로 뒤집기)
33+
# 기준(i,j) : 왼쪽 위쪽 칸
34+
for i in range(N-1, -1 , -1):
35+
for j in range(M-1 , -1 ,-1) :
36+
# i=0 or j=0 일때 누적합 점화식
37+
if i== N-1 and j== M-1 : # 맨 오른쪽 아래 칸의 누적합
38+
m_sum[i][j] = m_sum[i][j]
39+
elif i== N-1 : # 가로형 누적합 계산식 :
40+
m_sum[i][j] = m_sum[i][j+1]+m_sum[i][j]
41+
elif j == M-1 : # 세로형 누적합 계산식
42+
m_sum[i][j] = m_sum[i][j] + m_sum[i+1][j]
43+
else : # 일반적인 누적합 계산식
44+
m_sum[i][j] = m_sum[i+1][j] + m_sum[i][j+1] - m_sum[i+1][j+1] + m_sum[i][j]
45+
46+
#3. S 을 기준으로 총 경우의 수 구하기
47+
# 경우의 수 = E*M
48+
answer = 0
49+
for y in range(N):
50+
for x in range(M):
51+
# S 의 위치 파악하기
52+
if board[y][x] == "S" :
53+
# (y,x) 인 S의 기준에서 E*M 으로 경우의 수 구하기
54+
answer += e_sum[y][x]*m_sum[y][x]
55+
56+
57+
#4. 나머지로 출력하기
58+
print(answer%(10**9+7))

Hongjoo/백준/lcs.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""
2+
[BOJ]#9251.LCS / DP /Gold5/ 2025.09.09
3+
https://www.acmicpc.net/problem/9251
4+
#####
5+
6+
"""
7+
import sys
8+
input = sys.stdin.readline
9+
# 1. 입력 변수 - a 문자열 / b문자열
10+
a = list(input())[:-1]
11+
b= list(input())[:-1]
12+
# LCS 행렬 0 초기화
13+
lcs = [[0]*(len(b)+1) for _ in range(len(a)+1)]
14+
15+
#2. LCS (Longest Common Subsequence) 점화식
16+
"""
17+
i. a[i] VS b[j] 문자 비교하기
18+
(1) SAME(=) -> dp[i][j] = 위쪽 대각선 +1
19+
(2) DIFF(!=) -> dp[i][j] = MAX(왼쪽 , 위쪽)
20+
21+
ii. 최종 LCS = dp[-1][-1]
22+
"""
23+
for i in range(1,len(a)+1) :
24+
for j in range(1, len(b)+1) :
25+
if a[i-1] == b[j-1]:
26+
lcs[i][j] = lcs[i-1][j-1] + 1
27+
else :
28+
lcs[i][j] = max(lcs[i-1][j] , lcs[i][j-1])
29+
30+
# print(lcs)
31+
print(lcs[-1][-1])

Hongjoo/백준/결혼식.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"""
2+
https://www.acmicpc.net/problem/5567
3+
1-> 2다리 이하 친구 관계만 초대 -> 총 인원수 파악
4+
1-2-3-4-5
5+
"""
6+
import sys
7+
from collections import deque
8+
#1.양방향 인접 리스트 만들기
9+
input =sys.stdin.readline
10+
11+
N = int(input())
12+
M = int(input())
13+
friends = [[] for _ in range(N+1)] # 1~ n 번까지
14+
for i in range(1,M+1):
15+
x,y = map(int, input().split())
16+
friends[x].append(y)
17+
friends[y].append(x)
18+
19+
#2. lv2 이하인 BFS 가즈아~
20+
start = 1
21+
q = deque([[start,0]]) # 학번, 관계 거리
22+
visited = [start]
23+
answer =-1
24+
while q :
25+
cnum , crelationship= q.popleft()
26+
if crelationship >= 3:
27+
break # 거리가3 넘으면 강제종료
28+
answer +=1
29+
# print(f"#{cnum} : {crelationship}")
30+
for nn in friends[cnum] :
31+
if nn not in visited :
32+
q.append([nn, crelationship+1])
33+
visited.append(nn)
34+
35+
36+
# print(visited)
37+
print(answer)

Hongjoo/백준/그림.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""
2+
[BOJ]#1826.그림
3+
https://www.acmicpc.net/problem/1926
4+
# problem
5+
- 그림은 1로 가로,세로(대각선x) 연결됨
6+
- 그림 넓이 = 1의 개수 (0:여백)
7+
-goal) 전체 nxm 도화지 속 (1) 그림 개수 (2)그림들 중 최대 넓이
8+
*없으면 0 0 출력
9+
# flow
10+
1. 그림 개수 구하기
11+
i. 전체 칸(i,j)을 기준점으로 BFS/DFS로 연결된 그래프 더미 찾기
12+
13+
2. 최대 그림 넓이
14+
- 그래프 탐색시 각 그래프에서 방문한 노드의 개수 확인&최대값 저장하기
15+
"""
16+
17+
import sys
18+
from collections import deque
19+
# 1. 입력 변수 - 전체 도화지 크기 / 도화지 속 그림 위치 정보
20+
input = sys.stdin.readline
21+
N,M = map(int, input().split())
22+
23+
canvas = [[0]*M for _ in range(N)]
24+
for i in range(N):
25+
canvas[i] = list(map(int, input().split()))
26+
# print(canvas)
27+
# 그림 개수 /최대 그림 넓이 변수 선언
28+
pic_cnt = 0
29+
pic_area = 0
30+
31+
#2. 전체 도화지 칸을 탐색하며서 BFS로 그림들 연결하기
32+
def bfs(start):
33+
# 해당 노드 1 의 개수, 방문한 노드 위치 정보 -> canvas 의 0으로 기입
34+
one_cnt = 0 # start 초기화
35+
q =deque([start])
36+
canvas[start[0]][start[1]] = 0
37+
dy = [-1,1,0,0] # 상하좌우 이동 가능
38+
dx = [0,0,-1,1]
39+
40+
while q :
41+
cy,cx = q.popleft()
42+
one_cnt +=1 #그림 넓이 추가
43+
44+
for d in range(4):
45+
ny,nx= cy+dy[d], cx +dx[d]
46+
47+
if 0<=ny<N and 0<= nx <M and canvas[ny][nx] == 1 : # 범위 내, 그림 범위임
48+
q.append([ny,nx])
49+
canvas[ny][nx]=0
50+
51+
return one_cnt
52+
53+
#3. 전체 칸을 BFS탐색 시작점으로 순회하기
54+
55+
for i in range(N) :
56+
for j in range(M):
57+
if canvas[i][j] == 1 : #그림이면,BFS 탐색 시작
58+
area=bfs([i,j])
59+
# 그림 최대 넓이 업데이트하기
60+
if area > 0 : # 그림이 존재하면, 그림 개수 +1 & 넓이 최대값 업데이트
61+
pic_cnt += 1
62+
pic_area = max(pic_area,area)
63+
64+
print(pic_cnt)
65+
print(pic_area)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""
2+
[BOJ]평범한 배낭_2트/09.14.2025
3+
https://www.acmicpc.net/problem/12865
4+
"""
5+
6+
import sys
7+
input =sys.stdin.readline
8+
#1. 입력 변수 - 물품 총 개수 / 제한 무게 / 물건별 무게 w, 가치 v
9+
N , K = map(int,input().split())
10+
items = [[] for _ in range(N+1)]
11+
for i in range(1,N+1):
12+
items[i] = list(map(int, input().split()))
13+
# print(items)
14+
#2. DP : 0-1 Knapsack 문제
15+
# DP[k][i]: 최대 K kg 제한을 가진 가방안에 0~ i번쨰 item 까지 탐색 후 최대 가치
16+
#(물건 w > 배낭 무게 k) dp[k][i] = dp[k][i-1] #물건i는 못 넣음
17+
#(물건 w <= 배낭 무게 k) dp[k][i] = max(item[v] + dp[k-w][i-1],dp[k][i-1]) # 물건i를 넣거나(배낭 K-item 무게 만큼의 최대값 + 물건 i 넣기) , 안넣거나
18+
19+
dp = [[0]*(N+1) for _ in range(K+1)]
20+
for k in range(1,K+1) :
21+
for i in range(1, N+1):
22+
if items[i][0] <= k :
23+
dp[k][i] = max(dp[k-items[i][0]][i-1] + items[i][1],dp[k][i-1] )
24+
else :
25+
dp[k][i] =dp[k][i-1]
26+
27+
# print(dp)
28+
#3. dp[-1][-1] = 최종 배낭 K kg에서 최대 가치 출력
29+
print(dp[-1][-1])

0 commit comments

Comments
 (0)