Skip to content

Commit 90a02dc

Browse files
committed
2 parents 80e7790 + 8b6f83f commit 90a02dc

File tree

9 files changed

+214
-0
lines changed

9 files changed

+214
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
'''
2+
BOJ #2294. 동전 2 (골드 5)
3+
https://www.acmicpc.net/problem/2294
4+
유형: DP
5+
'''
6+
7+
8+
for _ in range(n):
9+
arr.append(int(input()))
10+
11+
dp = [100001 for i in range(k + 1)]
12+
dp[0] = 0
13+
14+
for coin in arr:
15+
for i in range(coin, k + 1):
16+
dp[i] = min(dp[i], dp[i - coin] + 1)
17+
18+
if dp[k] == 100001:
19+
print(-1)
20+
else:
21+
print(dp[k])
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
## 🚀3월 3주차 (3/22) 스터디 발제 주제: DP
2+
> 발제자: 조윤상 (@YoonYn9915)
3+
4+
> 주제: DP
5+
### 🗂️ 스터디 자료
6+
- PDF: [바로가기
7+
](./Study_BOJ_2293.pdf)
8+
9+
### 📖 문제
10+
- [백준 #2293. 동전 1](https://www.acmicpc.net/problem/2293): DP / 골드 4
11+
- 정답 코드: [Study_BOJ_2293_동전 1.py](https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/fad656cae819a42bc7b82c541388bcf249df9604/_WeeklyChallenges/W14-%5BDP%5D/Assignment_BOJ_2294_%EB%8F%99%EC%A0%84%202.py)
12+
13+
14+
15+
### 💻 과제
16+
- [백준 #2294. 동전 2](https://www.acmicpc.net/problem/2294): DP / 골드 5
17+
- 정답 코드: [Study_BOJ_2294_동전 2.py](https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/fad656cae819a42bc7b82c541388bcf249df9604/_WeeklyChallenges/W14-%5BDP%5D/Assignment_BOJ_2294_%EB%8F%99%EC%A0%84%202.py)
463 KB
Binary file not shown.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'''
2+
BOJ #2293. 동전 1 (골드4)
3+
https://www.acmicpc.net/problem/2293
4+
유형: DP
5+
'''
6+
7+
n, k = map(int, input().split())
8+
9+
coin = []
10+
dp = [0] * (k + 1)
11+
12+
for _ in range(n):
13+
coin.append(int(input()))
14+
15+
coin.sort()
16+
dp[0] = 1
17+
18+
for c in coin:
19+
for i in range(c, k+1):
20+
dp[i] += dp[i-c]
21+
22+
print(dp[k])
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+
nums = list(map(int, input().split()))
5+
6+
n = len(nums)
7+
dp = [[[4*len(nums) for _ in range(5)] for _ in range(5)]
8+
for _ in range(len(nums))]
9+
dp[0][0][0] = 0 # 초기값
10+
11+
12+
def move(start, end):
13+
if start == 0: # 0을 거침
14+
return 2
15+
if start == end: # 같은 지점
16+
return 1
17+
if abs(start - end) % 2 == 0: # 짝수차이가 나면 반대지점
18+
return 4
19+
else:
20+
return 3
21+
22+
23+
for i in range(n-1):
24+
start = nums[i]
25+
for left in range(5):
26+
for right in range(5):
27+
dp[i+1][left][start] = min(dp[i+1][left][start], dp[i][left][right] + move(right, start))
28+
dp[i+1][start][right] = min(dp[i+1][start][right], dp[i][left][right] + move(left, start))
29+
30+
print(min(map(min, dp[n-1])))
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
n, k = map(int, input().split())
5+
coins = list((int(input()) for _ in range(n)))
6+
7+
dp = [0] * (k + 1)
8+
dp[0] = 1
9+
10+
coins.sort()
11+
12+
for c in coins:
13+
for i in range(c, k+1):
14+
dp[i] += dp[i - c]
15+
16+
print(dp[k])
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
MAX_NUM = 100001
5+
n, k = map(int, input().split()) # 동전 개수, 목표 가치 합
6+
coins = [int(input()) for _ in range(n)] # 동전의 가치 리스트
7+
coins.sort()
8+
9+
# DP 선언
10+
dp = [MAX_NUM] * (k+1)
11+
dp[0] = 0
12+
13+
# DP 채우기
14+
for c in coins:
15+
for i in range(c, k+1):
16+
dp[i] = min(dp[i], dp[i-c]+1)
17+
18+
# 정답 출력
19+
if dp[k] == MAX_NUM:
20+
print(-1)
21+
else:
22+
print(dp[k])
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
5+
def bfs(sx, sy, shark_size):
6+
# 방문 배열과 거리 기록
7+
visited = [[-1]*n for _ in range(n)]
8+
visited[sx][sy] = 0
9+
queue = deque([(sx, sy)])
10+
fishes = [] # 먹을 수 있는 물고기 후보들
11+
12+
while queue:
13+
x, y = queue.popleft()
14+
for dx, dy in directions:
15+
nx, ny = x + dx, y + dy
16+
# 새로운 좌표가 공간 내에 있고 아직 방문하지 않은 경우
17+
if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == -1:
18+
# 이동 가능한 칸: 빈 칸이거나, 물고기가 있어도 크기가 shark_size 이하인 경우
19+
if space[nx][ny] <= shark_size:
20+
visited[nx][ny] = visited[x][y] + 1
21+
# 먹을 수 있는 물고기: 값이 0이 아니고 아기 상어 크기보다 작은 경우
22+
if 0 < space[nx][ny] < shark_size:
23+
fishes.append((visited[nx][ny], nx, ny))
24+
queue.append((nx, ny))
25+
if not fishes:
26+
return None # 먹을 수 있는 물고기가 없음
27+
28+
# 문제 조건대로 정렬: 거리, 행, 열, 순
29+
fishes.sort(key=lambda x: (x[0], x[1], x[2]))
30+
return fishes[0] # 가장 적합한 물고기
31+
32+
33+
n = int(input()) # 공간의 크기
34+
space = [] # 공간의 상태
35+
for _ in range(n):
36+
space.append(list(map(int, input().split())))
37+
38+
39+
# 아기상어 위치 구하기
40+
sx, sy = 0, 0
41+
for i in range(n):
42+
for j in range(n):
43+
if space[i][j] == 9:
44+
sx, sy = i, j
45+
space[sx][sy] = 0 # 아기 상어의 시작 위치는 빈 칸(0)으로 처리
46+
47+
# 초기 설정
48+
shark_size = 2 # 아기 상어 초기 크기
49+
eaten = 0 # 먹은 물고기 수
50+
time = 0 # 전체 소요시간
51+
directions = [(-1, 0), (0, -1), (1, 0), (0, 1)]
52+
53+
# 시뮬레이션 수행
54+
while True:
55+
result = bfs(sx, sy, shark_size)
56+
if result is None: # 먹을 수 있는 물고기가 없으면 종료
57+
break
58+
59+
dist, fx, fy = result # 먹을 수 있는 물고기의 거리와 위치
60+
time += dist # 이동 시간 추가
61+
sx, sy = fx, fy # 아기 상어 위치 이동
62+
space[sx][sy] = 0 # 물고기를 먹었으므로 해당 칸을 빈 칸으로 만들기
63+
eaten += 1# 먹은 물고기 수
64+
65+
# 먹은 물고기 수가 현재 아기 상어 크기와 같으면 크기를 1 증가
66+
if eaten == shark_size:
67+
shark_size += 1
68+
eaten = 0
69+
70+
print(time)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# 하노이 함수
2+
def hanoi_f(one, three, n):
3+
if n == 1:
4+
print(one, three)
5+
return
6+
7+
hanoi_f(one, 6 - one - three, n - 1) # 1단계 (1->2)
8+
print(one, three) # 2단계 (마지막원반 1->3)
9+
hanoi_f(6 - one - three, three, n - 1) # 3단계 (2->3)
10+
11+
12+
# 메인
13+
n = int(input())
14+
print(2 ** n - 1)
15+
if n <= 20:
16+
hanoi_f(1, 3, n)

0 commit comments

Comments
 (0)