Skip to content

Commit 7335f3f

Browse files
authored
Merge pull request #135 from AlgorithmStudy-Allumbus/minjeong
Minjeong / 1월 5주차 / 8문제
2 parents 4eac461 + ad065c8 commit 7335f3f

10 files changed

+385
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import sys
2+
import heapq
3+
4+
input = sys.stdin.readline
5+
6+
7+
def dijkstra(graph, start, n):
8+
INF = int(1e9)
9+
distance = [INF] * (n + 1)
10+
distance[start] = 0 # 시작노드의 거리 0
11+
# 최소 힙(우선순위 큐)을 사용하여 (거리, 노드) 튜플을 저장
12+
queue = []
13+
heapq.heappush(queue, (0, start)) # (거리, 노드)
14+
15+
while queue:
16+
dist, current = heapq.heappop(queue)
17+
# 만약 이미 처리된 노드라면 continue
18+
if distance[current] < dist:
19+
continue
20+
# 현재 노드와 인접한 모든 노드를 확인
21+
for next_node, cost in graph[current]:
22+
# 현재 노드를 거쳐서 인접 노드로 가는 새로운 거리
23+
new_dist = dist + cost
24+
# 만약 새로 계산한 거리가 기존의 거리보다 짧으면 업데이트하고, 큐에 추가한다.
25+
if new_dist < distance[next_node]:
26+
distance[next_node] = new_dist
27+
heapq.heappush(queue, (new_dist, next_node))
28+
29+
return distance
30+
31+
32+
# 입력: 마을의 수 N, 도로의 수 M, 모이는 마을 X
33+
N, M, X = map(int, input().split())
34+
35+
graph = [[] for _ in range(N + 1)]
36+
reverse_graph = [[] for _ in range(N + 1)]
37+
38+
for _ in range(M):
39+
u, v, w = map(int, input().split())
40+
# u번 마을에서 v번 마을로 가는 도로
41+
graph[u].append((v, w))
42+
# 역방향 그래프: v번 마을에서 u번 마을로 가는 도로
43+
reverse_graph[v].append((u, w))
44+
45+
# 1. X번 마을에서 각 마을까지의 최단 경로 (파티 후 돌아가는 시간)을 구한다.
46+
distance_from_X = dijkstra(graph, X, N)
47+
# 2. 각 마을에서 X번 마을까지의 최단 경로 (파티 갈 때 걸리는 시간)을 구한다.
48+
distance_to_X = dijkstra(reverse_graph, X, N)
49+
50+
# 각 학생의 왕복 시간 중 최댓값을 저장한다.
51+
max_time = 0
52+
for i in range(1, N + 1):
53+
# 왕복 시간 = (i번 마을에서 X까지 가는 시간) + (X에서 i번 마을까지 가는 시간)
54+
round_trip = distance_to_X[i] + distance_from_X[i]
55+
# 최댓값 갱신
56+
max_time = max(max_time, round_trip)
57+
58+
# 최댓값 출력
59+
print(max_time)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import sys
2+
import heapq
3+
4+
input = sys.stdin.readline
5+
6+
# 오른쪽, 아래, 위, 왼쪽
7+
dx = [0, 1, -1, 0]
8+
dy = [1, 0, 0, -1]
9+
10+
# 정답 출력을 위한 테스트 케이스 번호 변수
11+
cnt = 0
12+
13+
# 첫 번째 테스트 케이스의 동굴 크기
14+
n = int(input())
15+
16+
while n != 0:
17+
cnt += 1
18+
19+
# 동굴의 각 칸에 있는 도둑루피의 크기를 board에 저장
20+
board = [list(map(int, input().split())) for _ in range(n)]
21+
heap = []
22+
dist = [[1e9] * n for _ in range(n)]
23+
dist[0][0] = board[0][0]
24+
25+
# 시작점 정보를 (비용, y, x) 형태로 힙에 추가
26+
heapq.heappush(heap, (board[0][0], 0, 0))
27+
28+
# 다익스트라 알고리즘
29+
while heap:
30+
distance, y, x = heapq.heappop(heap)
31+
32+
# 최소 비용 우선 탐색이므로, 도착점 [n-1][n-1]에 도착하면 바로 출력
33+
if y == n - 1 and x == n - 1:
34+
print(f"Problem {cnt}: {distance}")
35+
n = int(input())
36+
break
37+
38+
# 상하좌우 네 방향에 대해 탐색
39+
for i in range(4):
40+
ny = y + dy[i] # 새로운 y 좌표를 계산
41+
nx = x + dx[i] # 새로운 x 좌표를 계산
42+
43+
# 새로운 좌표가 동굴 내부에 있는지 확인
44+
if 0 <= ny < n and 0 <= nx < n:
45+
# 인접한 칸까지 이동했을 때의 누적 비용을 계산
46+
cost = distance + board[ny][nx]
47+
48+
# 만약 현재 저장된 비용보다 새로운 비용이 작으면 업데이트
49+
if dist[ny][nx] > cost:
50+
dist[ny][nx] = cost
51+
# 새로운 비용과 좌표를 우선순위 큐에 추가
52+
heapq.heappush(heap, (cost, ny, nx))
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import sys
2+
import heapq
3+
4+
input = sys.stdin.readline
5+
6+
7+
def dijkstra(graph, start, n):
8+
INF = int(1e9)
9+
distance = [INF] * (n + 1)
10+
distance[start] = 0 # 시작노드의 거리 0
11+
# 최소 힙(우선순위 큐)을 사용하여 (거리, 노드) 튜플을 저장
12+
queue = []
13+
heapq.heappush(queue, (0, start)) # (거리, 노드)
14+
15+
while queue:
16+
dist, current = heapq.heappop(queue)
17+
# 만약 이미 처리된 노드라면 continue
18+
if distance[current] < dist:
19+
continue
20+
# 현재 노드와 인접한 모든 노드를 확인
21+
for next_node, cost in graph[current]:
22+
# 현재 노드를 거쳐서 인접 노드로 가는 새로운 거리
23+
new_dist = dist + cost
24+
# 만약 새로 계산한 거리가 기존의 거리보다 짧으면 업데이트하고, 큐에 추가한다.
25+
if new_dist < distance[next_node]:
26+
distance[next_node] = new_dist
27+
heapq.heappush(queue, (new_dist, next_node))
28+
29+
return distance
30+
31+
32+
# 입력: 마을의 수 N, 도로의 수 M, 모이는 마을 X
33+
N, M, X = map(int, input().split())
34+
35+
graph = [[] for _ in range(N + 1)]
36+
reverse_graph = [[] for _ in range(N + 1)]
37+
38+
for _ in range(M):
39+
u, v, w = map(int, input().split())
40+
# u번 마을에서 v번 마을로 가는 도로
41+
graph[u].append((v, w))
42+
# 역방향 그래프: v번 마을에서 u번 마을로 가는 도로
43+
reverse_graph[v].append((u, w))
44+
45+
# 1. X번 마을에서 각 마을까지의 최단 경로 (파티 후 돌아가는 시간)을 구한다.
46+
distance_from_X = dijkstra(graph, X, N)
47+
# 2. 각 마을에서 X번 마을까지의 최단 경로 (파티 갈 때 걸리는 시간)을 구한다.
48+
distance_to_X = dijkstra(reverse_graph, X, N)
49+
50+
# 각 학생의 왕복 시간 중 최댓값을 저장한다.
51+
max_time = 0
52+
for i in range(1, N + 1):
53+
# 왕복 시간 = (i번 마을에서 X까지 가는 시간) + (X에서 i번 마을까지 가는 시간)
54+
round_trip = distance_to_X[i] + distance_from_X[i]
55+
# 최댓값 갱신
56+
max_time = max(max_time, round_trip)
57+
58+
# 최댓값 출력
59+
print(max_time)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import sys
2+
import heapq
3+
4+
input = sys.stdin.readline
5+
6+
# 오른쪽, 아래, 위, 왼쪽
7+
dx = [0, 1, -1, 0]
8+
dy = [1, 0, 0, -1]
9+
10+
# 정답 출력을 위한 테스트 케이스 번호 변수
11+
cnt = 0
12+
13+
# 첫 번째 테스트 케이스의 동굴 크기
14+
n = int(input())
15+
16+
while n != 0:
17+
cnt += 1
18+
19+
# 동굴의 각 칸에 있는 도둑루피의 크기를 board에 저장
20+
board = [list(map(int, input().split())) for _ in range(n)]
21+
heap = []
22+
dist = [[1e9] * n for _ in range(n)]
23+
dist[0][0] = board[0][0]
24+
25+
# 시작점 정보를 (비용, y, x) 형태로 힙에 추가
26+
heapq.heappush(heap, (board[0][0], 0, 0))
27+
28+
# 다익스트라 알고리즘
29+
while heap:
30+
distance, y, x = heapq.heappop(heap)
31+
32+
# 최소 비용 우선 탐색이므로, 도착점 [n-1][n-1]에 도착하면 바로 출력
33+
if y == n - 1 and x == n - 1:
34+
print(f"Problem {cnt}: {distance}")
35+
n = int(input())
36+
break
37+
38+
# 상하좌우 네 방향에 대해 탐색
39+
for i in range(4):
40+
ny = y + dy[i] # 새로운 y 좌표를 계산
41+
nx = x + dx[i] # 새로운 x 좌표를 계산
42+
43+
# 새로운 좌표가 동굴 내부에 있는지 확인
44+
if 0 <= ny < n and 0 <= nx < n:
45+
# 인접한 칸까지 이동했을 때의 누적 비용을 계산
46+
cost = distance + board[ny][nx]
47+
48+
# 만약 현재 저장된 비용보다 새로운 비용이 작으면 업데이트
49+
if dist[ny][nx] > cost:
50+
dist[ny][nx] = cost
51+
# 새로운 비용과 좌표를 우선순위 큐에 추가
52+
heapq.heappush(heap, (cost, ny, nx))
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
# 문자열 입력
5+
S = input().strip()
6+
7+
# 0과 1 덩어리 개수 저장 변수
8+
count_0 = 0
9+
count_1 = 0
10+
11+
# 첫 번째 숫자가 0이면 count_0 증가, 1이면 count_1 증가
12+
if S[0] == '0':
13+
count_0 += 1
14+
else:
15+
count_1 += 1
16+
17+
# 연속된 숫자가 바뀔 때마다 덩어리 개수 증가
18+
for i in range(1, len(S)):
19+
if S[i] != S[i - 1]: # 숫자가 바뀌는 순간
20+
if S[i] == '0':
21+
count_0 += 1
22+
else:
23+
count_1 += 1
24+
25+
# 최소한의 뒤집기 횟수 출력
26+
print(min(count_0, count_1))
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
T = int(input()) # 테스트 케이스 수
5+
6+
for _ in range(T):
7+
N = int(input()) # 지원자 수
8+
new_crew = []
9+
10+
# 지원자 데이터 입력
11+
for _ in range(N):
12+
paper_score, interview_score = map(int, input().split())
13+
new_crew.append((paper_score, interview_score))
14+
15+
# 서류 심사 순위 기준 정렬
16+
new_crew.sort()
17+
18+
# 첫 번째 지원자는 무조건 선발
19+
answer = 1
20+
min_interview_rank = new_crew[0][1]
21+
22+
# 두 번째 지원자부터 체크
23+
for i in range(1, N):
24+
if new_crew[i][1] < min_interview_rank:
25+
answer += 1
26+
min_interview_rank = new_crew[i][1] # 최소 면접 등수 갱신
27+
28+
print(answer)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
N = input().strip()
5+
6+
# 0이 없으면 무조건 불가능 / 3의 배수인지 확인 (자리수 합이 3의 배수여야 함)
7+
if '0' not in N or sum(map(int, N)) % 3 != 0:
8+
print(-1)
9+
exit()
10+
11+
# 가장 큰 수 출력
12+
print(''.join(sorted(N, reverse=True)))
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import sys
2+
import heapq
3+
4+
input = sys.stdin.readline
5+
6+
# 입력 받기
7+
N, K = map(int, input().split()) # N: 보석 개수, K: 가방 개수
8+
jewelry = [] # (무게, 가격)
9+
bags = [] # 가방의 최대 무게
10+
11+
for _ in range(N):
12+
M, V = map(int, input().split())
13+
jewelry.append((M, V))
14+
15+
for _ in range(K):
16+
bags.append(int(input()))
17+
18+
# 보석을 무게 기준으로 정렬 (무게가 작은 순)
19+
jewelry.sort()
20+
21+
# 가방을 무게 기준으로 정렬 (무게가 작은 순)
22+
bags.sort()
23+
24+
# 우선순위 큐 (최대 힙)
25+
max_heap = []
26+
result = 0
27+
idx = 0
28+
29+
# 가방을 하나씩 처리
30+
for bag in bags:
31+
# 현재 가방이 수용할 수 있는 보석을 모두 추가 (무게 기준 정렬된 상태)
32+
while idx < N and jewelry[idx][0] <= bag:
33+
heapq.heappush(max_heap, -jewelry[idx][1]) # 최대 힙을 위해 음수 저장
34+
idx += 1
35+
36+
# 가장 가치가 높은 보석을 선택
37+
if max_heap:
38+
result += -heapq.heappop(max_heap)
39+
40+
print(result)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
# 입력 받기
5+
K = int(input()) # 1m2에 자라는 참외의 개수
6+
edges = []
7+
for _ in range(6):
8+
direction, length = map(int, input().split())
9+
edges.append((direction, length))
10+
11+
# 큰 직사각형과 작은 직사각형 찾기
12+
big_area = 0
13+
small_area = 0
14+
15+
for i in range(6):
16+
current = edges[i][1]
17+
next_edge = edges[(i + 1) % 6][1] # 인덱스 순환 처리
18+
big_area = max(big_area, current * next_edge)
19+
20+
# 작은 직사각형의 면적 찾기
21+
for i in range(6):
22+
# big_area에 해당하는 인덱스를 찾았다면 그 반대 방향의 면적 찾기
23+
if edges[i][1] * edges[(i + 1) % 6][1] == big_area:
24+
small_area = edges[(i + 3) % 6][1] * edges[(i + 4) % 6][1]
25+
break
26+
27+
# 전체 면적 계산
28+
total_area = big_area - small_area
29+
result = K * total_area
30+
print(result)
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+
# 0~9까지 숫자의 개수를 저장할 딕셔너리 초기화
5+
dict = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0,
6+
5: 0, 6: 0, 7: 0, 8: 0, 9: 0
7+
}
8+
9+
# 방 번호 입력
10+
room_nums = list(map(int, input().rstrip()))
11+
12+
# 숫자 개수 카운트
13+
for num in room_nums:
14+
if num == 6 or num == 9:
15+
if dict[6] <= dict[9]:
16+
dict[6] += 1
17+
else:
18+
dict[9] += 1
19+
else:
20+
dict[num] += 1
21+
22+
# 가장 많이 필요한 세트 개수 찾기
23+
answer = 0
24+
for value in dict.values():
25+
answer = max(answer, value)
26+
27+
print(answer)

0 commit comments

Comments
 (0)