Skip to content

Commit 762e804

Browse files
authored
Merge pull request #205 from AlgorithmStudy-Allumbus/minjeong3
Minjeong / 4월 5주차 / 4문제
2 parents 20ddb15 + 4f6803b commit 762e804

File tree

4 files changed

+128
-0
lines changed

4 files changed

+128
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
N, C = map(int, input().split()) # N: 집 개수, C: 공유기 개수
5+
houses = [int(input()) for _ in range(N)] # 집 좌표 리스트
6+
houses.sort()
7+
8+
left = 1 # 최소 거리
9+
right = houses[N-1] - houses[0]
10+
result = 0
11+
12+
while left <= right:
13+
mid = (left + right) // 2 # 현재 설정된 거리
14+
cnt = 1 # 공유기 최소 1대
15+
check = houses[0]
16+
17+
for i in range(N):
18+
if houses[i] - check >= mid: # 현재 설정된 거리 이상이면 공유기 개수 늘리기
19+
cnt += 1
20+
check = houses[i]
21+
if cnt >= C: # 공유기 설치 수가 C 이상이면, 공유기간 거리 늘리기
22+
left = mid + 1
23+
result = max(result, mid)
24+
else: # 공유기 설치 수가 C보다 미만이면, 공유기간 거리 줄이기
25+
right = mid - 1
26+
27+
print(result)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
K, N = map(int, input().split()) # K: 기존 랜선 수, N: 필요한 랜선 수
5+
arr = [int(input()) for _ in range(K)]
6+
7+
start = 1
8+
end = max(arr)
9+
10+
while start <= end:
11+
mid = (start + end) // 2 # 현재 시도할 랜선 길이
12+
cnt = sum(x // mid for x in arr) # 해당 길이로 만들 수 있는 랜선 개수
13+
14+
if cnt >= N:
15+
start = mid + 1 # 더 길게 잘라도 됨
16+
else:
17+
end = mid - 1 # 너무 길어서 N개 못 만듦
18+
19+
print(end) # 조건을 만족하는 최대 길이
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
5+
# 입력 처리
6+
N, M = map(int, input().split())
7+
graph = [list(map(int, input().strip())) for _ in range(N)]
8+
9+
def bfs(x, y):
10+
# 방향: 상, 하, 좌, 우
11+
dx = [-1, 1, 0, 0]
12+
dy = [0, 0, -1, 1]
13+
14+
queue = deque()
15+
queue.append((x, y))
16+
17+
while queue:
18+
x, y = queue.popleft()
19+
20+
for i in range(4):
21+
nx = x + dx[i]
22+
ny = y + dy[i]
23+
24+
# 범위 벗어나면 무시
25+
if nx < 0 or nx >= N or ny < 0 or ny >= M:
26+
continue
27+
28+
# 벽이면 무시
29+
if graph[nx][ny] == 0:
30+
continue
31+
32+
# 이동 가능한 칸이면 거리 갱신 후 방문 처리
33+
if graph[nx][ny] == 1:
34+
graph[nx][ny] = graph[x][y] + 1
35+
queue.append((nx, ny))
36+
37+
return graph[N-1][M-1]
38+
39+
print(bfs(0, 0))
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
5+
# 방향 벡터: 상, 하, 좌, 우
6+
dx = [-1, 1, 0, 0]
7+
dy = [0, 0, -1, 1]
8+
9+
def bfs(start_x, start_y):
10+
queue = deque()
11+
queue.append((start_x, start_y))
12+
graph[start_x][start_y] = 0 # 방문 처리
13+
house_count = 1 # 단지 내 집 수
14+
15+
while queue:
16+
x, y = queue.popleft()
17+
for i in range(4): # 상하좌우 탐색
18+
nx, ny = x + dx[i], y + dy[i]
19+
20+
# 좌표가 유효한지 확인
21+
if 0 <= nx < n and 0 <= ny < n and graph[nx][ny] == 1:
22+
graph[nx][ny] = 0 # 방문 처리
23+
queue.append((nx, ny))
24+
house_count += 1
25+
return house_count
26+
27+
# 입력
28+
n = int(input())
29+
graph = [list(map(int, input().strip())) for _ in range(n)]
30+
31+
result = []
32+
33+
# 모든 좌표 순회하며 BFS 수행
34+
for i in range(n):
35+
for j in range(n):
36+
if graph[i][j] == 1:
37+
result.append(bfs(i, j))
38+
39+
# 결과 출력
40+
result.sort()
41+
print(len(result))
42+
for count in result:
43+
print(count)

0 commit comments

Comments
 (0)