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
26 changes: 26 additions & 0 deletions Hongjoo/lv2/가장큰정사각형찾기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""
유형 : DP
IDEA : dp(i,j)의 값에 만들 수 있는 정사각형 최대 길이로 할당하기
FLOW
- if board[i][j] == 1 이면
-> dp[i,j] = min( (i-1,j), (i,j-1) , (i-1,j-1)) + 1 대입
"""
def solution(board):
answer = 0
dp = [[0]*len(board[0]) for _ in range(len(board))]
#1. 반복문으로 board[i,j] 찾기
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j] == 1 :
#2. dp로 (i,j)을 정사각형 오른쪽 아래 칸으로 가지는 최대 변의 길이 구하기
if 0<=i-1<=len(board) and 0<=j-1 < len(board[0]):
dp[i][j] = min(dp[i-1][j] , dp[i][j-1] , dp[i-1][j-1]) +1
# print(dp[i][j])

else :
dp[i][j] = 1
answer= max(answer , dp[i][j])

# print(dp)
# print(answer)
return answer**2
58 changes: 58 additions & 0 deletions Hongjoo/백준/blobaww.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import sys
answer =0
N, M = map(int, sys.stdin.readline().split())
board =[[] for _ in range(N)]
# E와 M의 누적합 행렬 정의
e_sum = [[0]*M for _ in range(N)]
m_sum = [[0]*M for _ in range(N)]

for i in range(N):
board[i] = list(sys.stdin.readline()[:-1])
for j in range(M):
if board[i][j] == "E" :
e_sum[i][j] = 1
elif board[i][j] == "M" :
m_sum[i][j] = 1

# 2.E와 M 행렬 누적합 계산하기
# dp[i][j] = dp[i-1][j] + dp[i][j-1] -dp[i-1][j-1 + value[i][j]
for i in range(N):
for j in range(M):
# E의 누적합 계산
# i=0 or j=0 일때 누적합 점화식
if i==0 and j== 0 :
e_sum[0][0] = e_sum[0][0]
elif i== 0 : # 가로형 누적합 계산식 :
e_sum[i][j] = e_sum[0][j-1]+e_sum[0][j]
elif j == 0: # 세로형 누적합 계산식
e_sum[i][j] = e_sum[i][0] + e_sum[i-1][0]
else : # 일반적인 누적합 계산식
e_sum[i][j] = e_sum[i-1][j] + e_sum[i][j-1] - e_sum[i-1][j-1] + e_sum[i][j]

#M의 누적합 계산 : E의 누적합의 역방향(아래로 뒤집기)
# 기준(i,j) : 왼쪽 위쪽 칸
for i in range(N-1, -1 , -1):
for j in range(M-1 , -1 ,-1) :
# i=0 or j=0 일때 누적합 점화식
if i== N-1 and j== M-1 : # 맨 오른쪽 아래 칸의 누적합
m_sum[i][j] = m_sum[i][j]
elif i== N-1 : # 가로형 누적합 계산식 :
m_sum[i][j] = m_sum[i][j+1]+m_sum[i][j]
elif j == M-1 : # 세로형 누적합 계산식
m_sum[i][j] = m_sum[i][j] + m_sum[i+1][j]
else : # 일반적인 누적합 계산식
m_sum[i][j] = m_sum[i+1][j] + m_sum[i][j+1] - m_sum[i+1][j+1] + m_sum[i][j]

#3. S 을 기준으로 총 경우의 수 구하기
# 경우의 수 = E*M
answer = 0
for y in range(N):
for x in range(M):
# S 의 위치 파악하기
if board[y][x] == "S" :
# (y,x) 인 S의 기준에서 E*M 으로 경우의 수 구하기
answer += e_sum[y][x]*m_sum[y][x]


#4. 나머지로 출력하기
print(answer%(10**9+7))
31 changes: 31 additions & 0 deletions Hongjoo/백준/lcs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""
[BOJ]#9251.LCS / DP /Gold5/ 2025.09.09
https://www.acmicpc.net/problem/9251
#####

"""
import sys
input = sys.stdin.readline
# 1. 입력 변수 - a 문자열 / b문자열
a = list(input())[:-1]
b= list(input())[:-1]
# LCS 행렬 0 초기화
lcs = [[0]*(len(b)+1) for _ in range(len(a)+1)]

#2. LCS (Longest Common Subsequence) 점화식
"""
i. a[i] VS b[j] 문자 비교하기
(1) SAME(=) -> dp[i][j] = 위쪽 대각선 +1
(2) DIFF(!=) -> dp[i][j] = MAX(왼쪽 , 위쪽)

ii. 최종 LCS = dp[-1][-1]
"""
for i in range(1,len(a)+1) :
for j in range(1, len(b)+1) :
if a[i-1] == b[j-1]:
lcs[i][j] = lcs[i-1][j-1] + 1
else :
lcs[i][j] = max(lcs[i-1][j] , lcs[i][j-1])

# print(lcs)
print(lcs[-1][-1])
37 changes: 37 additions & 0 deletions Hongjoo/백준/결혼식.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""
https://www.acmicpc.net/problem/5567
1-> 2다리 이하 친구 관계만 초대 -> 총 인원수 파악
1-2-3-4-5
"""
import sys
from collections import deque
#1.양방향 인접 리스트 만들기
input =sys.stdin.readline

N = int(input())
M = int(input())
friends = [[] for _ in range(N+1)] # 1~ n 번까지
for i in range(1,M+1):
x,y = map(int, input().split())
friends[x].append(y)
friends[y].append(x)

#2. lv2 이하인 BFS 가즈아~
start = 1
q = deque([[start,0]]) # 학번, 관계 거리
visited = [start]
answer =-1
while q :
cnum , crelationship= q.popleft()
if crelationship >= 3:
break # 거리가3 넘으면 강제종료
answer +=1
# print(f"#{cnum} : {crelationship}")
for nn in friends[cnum] :
if nn not in visited :
q.append([nn, crelationship+1])
visited.append(nn)


# print(visited)
print(answer)
65 changes: 65 additions & 0 deletions Hongjoo/백준/그림.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""
[BOJ]#1826.그림
https://www.acmicpc.net/problem/1926
# problem
- 그림은 1로 가로,세로(대각선x) 연결됨
- 그림 넓이 = 1의 개수 (0:여백)
-goal) 전체 nxm 도화지 속 (1) 그림 개수 (2)그림들 중 최대 넓이
*없으면 0 0 출력
# flow
1. 그림 개수 구하기
i. 전체 칸(i,j)을 기준점으로 BFS/DFS로 연결된 그래프 더미 찾기

2. 최대 그림 넓이
- 그래프 탐색시 각 그래프에서 방문한 노드의 개수 확인&최대값 저장하기
"""

import sys
from collections import deque
# 1. 입력 변수 - 전체 도화지 크기 / 도화지 속 그림 위치 정보
input = sys.stdin.readline
N,M = map(int, input().split())

canvas = [[0]*M for _ in range(N)]
for i in range(N):
canvas[i] = list(map(int, input().split()))
# print(canvas)
# 그림 개수 /최대 그림 넓이 변수 선언
pic_cnt = 0
pic_area = 0

#2. 전체 도화지 칸을 탐색하며서 BFS로 그림들 연결하기
def bfs(start):
# 해당 노드 1 의 개수, 방문한 노드 위치 정보 -> canvas 의 0으로 기입
one_cnt = 0 # start 초기화
q =deque([start])
canvas[start[0]][start[1]] = 0
dy = [-1,1,0,0] # 상하좌우 이동 가능
dx = [0,0,-1,1]

while q :
cy,cx = q.popleft()
one_cnt +=1 #그림 넓이 추가

for d in range(4):
ny,nx= cy+dy[d], cx +dx[d]

if 0<=ny<N and 0<= nx <M and canvas[ny][nx] == 1 : # 범위 내, 그림 범위임
q.append([ny,nx])
canvas[ny][nx]=0

return one_cnt

#3. 전체 칸을 BFS탐색 시작점으로 순회하기

for i in range(N) :
for j in range(M):
if canvas[i][j] == 1 : #그림이면,BFS 탐색 시작
area=bfs([i,j])
# 그림 최대 넓이 업데이트하기
if area > 0 : # 그림이 존재하면, 그림 개수 +1 & 넓이 최대값 업데이트
pic_cnt += 1
pic_area = max(pic_area,area)

print(pic_cnt)
print(pic_area)
29 changes: 29 additions & 0 deletions Hongjoo/백준/평범한배낭_2t.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""
[BOJ]평범한 배낭_2트/09.14.2025
https://www.acmicpc.net/problem/12865
"""

import sys
input =sys.stdin.readline
#1. 입력 변수 - 물품 총 개수 / 제한 무게 / 물건별 무게 w, 가치 v
N , K = map(int,input().split())
items = [[] for _ in range(N+1)]
for i in range(1,N+1):
items[i] = list(map(int, input().split()))
# print(items)
#2. DP : 0-1 Knapsack 문제
# DP[k][i]: 최대 K kg 제한을 가진 가방안에 0~ i번쨰 item 까지 탐색 후 최대 가치
#(물건 w > 배낭 무게 k) dp[k][i] = dp[k][i-1] #물건i는 못 넣음
#(물건 w <= 배낭 무게 k) dp[k][i] = max(item[v] + dp[k-w][i-1],dp[k][i-1]) # 물건i를 넣거나(배낭 K-item 무게 만큼의 최대값 + 물건 i 넣기) , 안넣거나

dp = [[0]*(N+1) for _ in range(K+1)]
for k in range(1,K+1) :
for i in range(1, N+1):
if items[i][0] <= k :
dp[k][i] = max(dp[k-items[i][0]][i-1] + items[i][1],dp[k][i-1] )
else :
dp[k][i] =dp[k][i-1]

# print(dp)
#3. dp[-1][-1] = 최종 배낭 K kg에서 최대 가치 출력
print(dp[-1][-1])