From 4070a7ff4c3d0b8a6d4bf9138968bf702d645cfe Mon Sep 17 00:00:00 2001 From: sumin Date: Mon, 3 Feb 2025 16:31:22 +0900 Subject: [PATCH] 7week --- ...0\354\271\230 \355\225\250\354\210\230.py" | 0 ...24\354\235\264\353\237\254\354\212\244.py" | 39 +++++++++++++++ ...4\354\235\230 \352\260\234\354\210\230.py" | 41 ++++++++++++++++ ...74\353\223\234\355\212\270\353\246\254.py" | 49 +++++++++++++++++++ "7week/2512-\354\230\210\354\202\260.py" | 25 ++++++++++ ...4 \353\247\214\353\223\244\352\270\260.py" | 39 +++++++++++++++ 6 files changed, 193 insertions(+) create mode 100644 "5week/1003-\355\224\274\353\263\264\353\202\230\354\271\230 \355\225\250\354\210\230.py" create mode 100644 "6week/2606-\353\260\224\354\235\264\353\237\254\354\212\244.py" create mode 100644 "7week/1780-\354\242\205\354\235\264\354\235\230 \352\260\234\354\210\230.py" create mode 100644 "7week/1992-\354\277\274\353\223\234\355\212\270\353\246\254.py" create mode 100644 "7week/2512-\354\230\210\354\202\260.py" create mode 100644 "7week/2630-\354\203\211\354\242\205\354\235\264 \353\247\214\353\223\244\352\270\260.py" diff --git "a/5week/1003-\355\224\274\353\263\264\353\202\230\354\271\230 \355\225\250\354\210\230.py" "b/5week/1003-\355\224\274\353\263\264\353\202\230\354\271\230 \355\225\250\354\210\230.py" new file mode 100644 index 0000000..e69de29 diff --git "a/6week/2606-\353\260\224\354\235\264\353\237\254\354\212\244.py" "b/6week/2606-\353\260\224\354\235\264\353\237\254\354\212\244.py" new file mode 100644 index 0000000..697953f --- /dev/null +++ "b/6week/2606-\353\260\224\354\235\264\353\237\254\354\212\244.py" @@ -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() diff --git "a/7week/1780-\354\242\205\354\235\264\354\235\230 \352\260\234\354\210\230.py" "b/7week/1780-\354\242\205\354\235\264\354\235\230 \352\260\234\354\210\230.py" new file mode 100644 index 0000000..cb8321d --- /dev/null +++ "b/7week/1780-\354\242\205\354\235\264\354\235\230 \352\260\234\354\210\230.py" @@ -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) diff --git "a/7week/1992-\354\277\274\353\223\234\355\212\270\353\246\254.py" "b/7week/1992-\354\277\274\353\223\234\355\212\270\353\246\254.py" new file mode 100644 index 0000000..fb03cb0 --- /dev/null +++ "b/7week/1992-\354\277\274\353\223\234\355\212\270\353\246\254.py" @@ -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)) diff --git "a/7week/2512-\354\230\210\354\202\260.py" "b/7week/2512-\354\230\210\354\202\260.py" new file mode 100644 index 0000000..b8a7810 --- /dev/null +++ "b/7week/2512-\354\230\210\354\202\260.py" @@ -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) # 최적의 상한액 출력 diff --git "a/7week/2630-\354\203\211\354\242\205\354\235\264 \353\247\214\353\223\244\352\270\260.py" "b/7week/2630-\354\203\211\354\242\205\354\235\264 \353\247\214\353\223\244\352\270\260.py" new file mode 100644 index 0000000..ece6b33 --- /dev/null +++ "b/7week/2630-\354\203\211\354\242\205\354\235\264 \353\247\214\353\223\244\352\270\260.py" @@ -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) # 파란색 종이 개수 출력