Skip to content

Commit 444f7e3

Browse files
authored
Merge pull request #108 from AlgorithmStudy-Allumbus/minjeong
Minjeong / 12월 3주차 / 5문제
2 parents 19e363b + 4990734 commit 444f7e3

File tree

5 files changed

+182
-0
lines changed

5 files changed

+182
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from collections import deque
2+
3+
# 입력 받기
4+
N, M = map(int, input().split())
5+
maps = []
6+
for _ in range(N):
7+
temp = input().strip()
8+
maps.append(list(map(int, temp)))
9+
10+
# 방문 배열 초기화
11+
visited = [[[0] * 2 for _ in range(M)] for _ in range(N)]
12+
visited[0][0][0] = 1
13+
# visited[x][y][0] = 벽을 뚫지 않고 온 최단 경로
14+
# visited[x][y][1] = 벽을 1회 뚫고 온 최단 경로
15+
16+
# BFS 탐색 방향 (상, 우, 하, 좌)
17+
directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]
18+
19+
# BFS 큐 초기화
20+
queue = deque([(0, 0, 0)])
21+
22+
# BFS 시작
23+
while queue:
24+
x, y, wall = queue.popleft()
25+
26+
# 목표 지점 도달 시 최단 거리 출력
27+
if x == N - 1 and y == M - 1: # 목표지점에 도달했다면
28+
print(visited[x][y][wall])
29+
exit(0)
30+
31+
# 네 방향 탐색
32+
for dx, dy in directions:
33+
nx, ny = x + dx, y + dy
34+
35+
# 맵 범위를 벗어난 경우 무시
36+
if nx < 0 or nx >= N or ny < 0 or ny >= M:
37+
continue
38+
39+
# 벽이고 벽 파괴를 아직 안 쓴 경우, 벽 부수기 가능. 값을 업데이트하고 큐에 추가
40+
if maps[nx][ny] == 1 and wall == 0:
41+
visited[nx][ny][1] = visited[x][y][0] + 1
42+
queue.append((nx, ny, 1))
43+
# 벽이 아니고, 아직 방문하지 않았을 경우에는 이동 가능하므로 큐에 추가
44+
elif maps[nx][ny] == 0 and visited[nx][ny][wall] == 0:
45+
visited[nx][ny][wall] = visited[x][y][wall] + 1
46+
queue.append((nx, ny, wall))
47+
48+
# 도달하지 못한 경우 -1 출력
49+
print(-1)
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
5+
# 보드의 크기 입력
6+
N, M = map(int, input().split()) # N: 세로, M: 가로
7+
rect_board = [list(map(str, input().strip())) for _ in range(N)] # 직사각형 보드
8+
9+
# BFS 탐색 방향 (상, 우, 하, 좌)
10+
directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]
11+
12+
# 빨간 구슬(R)과 파란 구슬(B)의 초기 위치 찾기
13+
rx, ry, bx, by = 0, 0, 0, 0
14+
for i in range(N):
15+
for j in range(M):
16+
if rect_board[i][j] == 'R':
17+
rx, ry = i, j
18+
if rect_board[i][j] == 'B':
19+
bx, by = i, j
20+
21+
# BFS 탐색 준비
22+
queue = deque([(rx, ry, bx, by, 1)]) # (rx, ry, bx, by, depth)
23+
visited = set()
24+
visited.add((rx, ry, bx, by)) # 방문 체크
25+
26+
# 구슬 이동 함수
27+
def move(x, y, dx, dy):
28+
# 빨간 구슬과 파란 구슬을 보드에서 #이나 O를 만날 때까지 이동
29+
count = 0
30+
while rect_board[x + dx][y + dy] != '#' and rect_board[x][y] != 'O':
31+
x += dx
32+
y += dy
33+
count += 1 # 이동횟수
34+
return x, y, count
35+
36+
37+
# BFS 탐색
38+
while queue:
39+
rx, ry, bx, by, depth = queue.popleft()
40+
41+
# 10번을 초과했다면 실패
42+
if depth > 10:
43+
print(-1)
44+
exit()
45+
46+
# BFS 4방향 탐색
47+
for dx, dy in directions:
48+
# 빨간 구슬과 파란 구슬 이동
49+
nrx, nry, r_count = move(rx, ry, dx, dy)
50+
nbx, nby, b_count = move(bx, by, dx, dy)
51+
52+
# 파란 구슬이 구멍에 빠지면 실패 -> 다음 방향 탐색
53+
if rect_board[nbx][nby] == 'O':
54+
continue
55+
56+
# 빨간 구슬이 구멍에 빠지면 성공
57+
if rect_board[nrx][nry] == 'O':
58+
print(depth)
59+
exit()
60+
61+
# 두 구슬이 겹칠 경우, 더 많이 이동한 구슬을 한 칸 뒤로
62+
if nrx == nbx and nry == nby:
63+
if r_count > b_count:
64+
nrx -= dx
65+
nry -= dy
66+
else:
67+
nbx -= dx
68+
nby -= dy
69+
70+
71+
# 방문하지 않은 경우에만 큐에 추가
72+
if (nrx, nry, nbx, nby) not in visited:
73+
queue.append((nrx, nry, nbx, nby, depth + 1))
74+
visited.add((nrx, nry, nbx, nby))
75+
# 10번 이내에 성공하지 못했다면 -1 출력
76+
77+
print(-1)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
# 입력 받기
5+
n = int(input())
6+
7+
# DP 배열 초기화
8+
dp = [0] * (n+1)
9+
dp[1] = 1
10+
11+
# 초기값 설정
12+
if n >= 2:
13+
dp[2] = 3
14+
15+
# 점화식을 이용해 계산
16+
for i in range(3, n+1):
17+
dp[i] = (dp[i-1] + 2 * dp[i-2]) % 10007
18+
19+
# 결과 출력
20+
print(dp[n])
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+
# 입력 받기
5+
N = int(input()) # 배열 길이
6+
A = list(map(int, input().split())) # 배열 A
7+
B = list(map(int, input().split())) # 배열 B
8+
9+
# A 오름차순 정렬, B 내림차순 정렬
10+
A.sort()
11+
B.sort(reverse=True)
12+
13+
# 최소값 계산
14+
answer = 0
15+
for i in range(N):
16+
answer += A[i] * B[i]
17+
18+
# 결과 출력
19+
print(answer)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
# 입력 받기
5+
N = int(input()) # 로프 개수
6+
rope = [int(input()) for _ in range(N)]
7+
8+
# 내림차순 정렬
9+
rope.sort(reverse=True)
10+
11+
# 최대 중량 계산
12+
max_weight = 0
13+
for i in range(N):
14+
# i + 1: 현재 사용된 로프 개수
15+
max_weight = max(max_weight, rope[i] * (i + 1))
16+
17+
print(max_weight)

0 commit comments

Comments
 (0)