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
Empty file.
39 changes: 39 additions & 0 deletions 6week/2606-바이러스.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import sys
from collections import deque

# 입력: 정점(N)과 간선(M)의 개수를 읽음
N = int(sys.stdin.readline()) # 정점의 개수
M = int(sys.stdin.readline()) # 간선의 개수

# 그래프를 인접 리스트로 표현하기 위해 초기화
net = [[] for _ in range(N + 1)] # 1번부터 N번까지의 정점

# 간선 정보 입력받아 그래프 구성
for _ in range(M):
a, b = map(int, sys.stdin.readline().split())
net[a].append(b) # 정점 a에서 b로 가는 간선 추가
net[b].append(a) # 방향이 없는 그래프이므로 b에서 a로 가는 간선 추가

# BFS 함수 정의
def bfs():
q = deque() # 큐 생성
count = 0 # 감염된 컴퓨터 수
q.append(1) # 1번 컴퓨터를 시작점으로 설정
visited[1] = True # 1번 컴퓨터를 방문 처리

while q: # 큐가 빌 때까지 반복
cur = q.popleft() # 큐에서 현재 정점(cur)을 꺼냄
# 현재 정점과 연결된 모든 정점을 탐색
for val in net[cur]:
if not visited[val]: # 연결된 정점 중 아직 방문하지 않은 정점이 있다면
q.append(val) # 큐에 추가
visited[val] = True # 방문 처리
count += 1 # 감염된 컴퓨터 수 증가

print(count) # 모든 감염이 끝난 후 결과 출력

# 방문 여부를 저장하는 배열 초기화
visited = [False for _ in range(N + 1)] # 모든 정점을 방문하지 않은 상태로 초기화

# BFS 실행
bfs()
41 changes: 41 additions & 0 deletions 7week/1780-종이의 개수.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import sys

# 입력 받기
N = int(sys.stdin.readline())
paper = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

# 개수 저장할 변수 (-1, 0, 1 종이 개수)
count_minus1 = 0
count_0 = 0
count_1 = 0

# 분할 정복 함수
def cut(row, col, n):
global count_minus1, count_0, count_1
first_value = paper[row][col] # 현재 영역의 첫 번째 값 저장

# 현재 영역이 모두 같은 숫자인지 확인
for i in range(row, row + n):
for j in range(col, col + n):
if paper[i][j] != first_value: # 다른 숫자가 하나라도 있다면 9등분
size = n // 3 # 새로운 크기 (n을 3등분)
for a in range(3):
for b in range(3):
cut(row + a * size, col + b * size, size) # 9개로 나누어 재귀 호출
return # 9등분 후에는 더 이상 진행하지 않음

# 만약 영역이 하나의 숫자로만 이루어졌다면, 해당 숫자의 개수를 증가
if first_value == -1:
count_minus1 += 1
elif first_value == 0:
count_0 += 1
else:
count_1 += 1

# 전체 영역(0,0)에서 시작하여 N x N 검사
cut(0, 0, N)

# 결과 출력
print(count_minus1)
print(count_0)
print(count_1)
49 changes: 49 additions & 0 deletions 7week/1992-쿼드트리.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import sys
sys.setrecursionlimit(10**6) # 재귀 깊이 제한 증가 (최대 10^6번까지 허용)
input = sys.stdin.readline # 빠른 입력을 위한 sys.stdin.readline 사용

# 입력 받기
N = int(input()) # 영상의 크기 N (N은 항상 2^k 형태)
video = [] # 영상 정보를 저장할 리스트

# 영상 정보를 2차원 리스트로 저장
for _ in range(N):
v = [int(x) for x in list(input().rstrip())] # 문자열을 한 글자씩 정수로 변환하여 리스트로 저장
video.append(v)

# 쿼드 트리 압축을 수행하는 재귀 함수
def quadtree(n, vlist):
s = 0 # 현재 영역 내 모든 값의 합을 저장할 변수

# 현재 영역의 모든 값의 합을 계산
for l in vlist:
s += sum(l) # 리스트 내 값들을 모두 더함

# 만약 모든 값이 '1'이라면 "1" 반환 (압축 가능)
if s == n**2:
return '1'

# 만약 모든 값이 '0'이라면 "0" 반환 (압축 가능)
if s == 0:
return '0'

# 위 조건을 만족하지 않으면 4등분하여 다시 검사
half = n // 2 # 현재 영역을 4등분할 크기

# 결과를 저장할 문자열 (괄호로 감싸기 위해 '(' 추가)
temp = '('

temp += quadtree(half, [l[:half] for l in vlist[:half]])

temp += quadtree(half, [l[half:] for l in vlist[:half]])

temp += quadtree(half, [l[:half] for l in vlist[half:]])

temp += quadtree(half, [l[half:] for l in vlist[half:]])

temp += ')'

return temp # 압축된 문자열 반환

# 결과 출력
print(quadtree(N, video))
25 changes: 25 additions & 0 deletions 7week/2512-예산.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import sys
input = sys.stdin.readline

N = int(input()) # 지방 수
budget = list(map(int, input().split())) # 예산 요청 리스트
M = int(input()) # 총 예산

start, end = 0, max(budget) # 이진 탐색 범위 설정

# 예산 요청의 총합이 총 예산 M 이하라면, 최대 요청 금액이 최적해
if sum(budget) <= M:
print(max(budget))
else:
while start <= end:
mid = (start + end) // 2 # 중간값(상한액)

# 상한액 기준으로 배정된 총 예산 계산
total_budget = sum(min(mid, i) for i in budget)

if total_budget > M: # 총 예산 초과 시 상한액 줄이기
end = mid - 1
else: # 총 예산 이하일 때, 더 높은 상한액을 탐색
start = mid + 1

print(end) # 최적의 상한액 출력
39 changes: 39 additions & 0 deletions 7week/2630-색종이 만들기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import sys # 표준 입력을 빠르게 받기 위해 sys 모듈 사용

# N 입력 받기 (종이의 크기)
N = int(sys.stdin.readline())

# N x N 크기의 정사각형 종이 정보 입력 받기
square = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

# 흰색(0)과 파란색(1) 종이의 개수를 저장할 변수
white = 0
blue = 0

# 종이를 자르는 함수 정의
def cut(row, column, n):
global white, blue
color = square[row][column] # 현재 영역의 첫 번째 색깔 저장

# 현재 영역이 모두 같은 색인지 확인
for i in range(row, row + n):
for j in range(column, column + n):
if color != square[i][j]: # 하나라도 다른 색이 있으면 나눈다
cut(row, column, n // 2) # 1사분면 (좌상단)
cut(row, column + n // 2, n // 2) # 2사분면 (우상단)
cut(row + n // 2, column, n // 2) # 3사분면 (좌하단)
cut(row + n // 2, column + n // 2, n // 2) # 4사분면 (우하단)
return # 더 이상 진행하지 않음

# 모든 영역이 같은 색이라면, 해당 색깔의 종이 개수를 증가
if color == 0:
white += 1 # 흰색 종이 개수 증가
else:
blue += 1 # 파란색 종이 개수 증가

# (0,0)에서 시작하여 전체 종이를 검사
cut(0, 0, N)

# 결과 출력
print(white) # 흰색 종이 개수 출력
print(blue) # 파란색 종이 개수 출력