Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions Hongjoo/백준/과자나눠주기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"""
https://www.acmicpc.net/problem/16401
실버2

# 조건
- 무조건 같은 길이 ㅢ 과자
#문제
- M명의 조카 , N 개의 과자 -> 1명에게 줄 수 잇는 최대길이
- 과자는 길이와 상관 없이 여러조각 나눠질 수 있음+ 하나로 합칠 수 없음 , 길이는 양수
# 유형 :

"""
import sys
m,n=map(int,sys.stdin.readline().split())
snack=list(map(int,sys.stdin.readline().split()))

start=1 #적어도 길이1로 잘라야 함.
end=max(snack) #자르는 길이의 최대는 과자 중 제일 긴 놈

answer=0
while start<=end:
mid=(start+end)//2

cnt=0
for x in snack:
if x<mid: #자르려는 단위보다 과자가 작으면 못 자름.
continue
else: #자르려는 단위보다 크면,
cnt+=x//mid #그 과자를 해당 단위로 나눈 몫만큼 과자 나옴.

if cnt>=m: #cnt가 너무 많으면 길이를 늘려야 함.
start=mid+1
answer=mid
else: #cnt가 너무 적으면 길이를 줄여야 함
end=mid-1

print(answer)

27 changes: 27 additions & 0 deletions Hongjoo/백준/리그오브레전설(small).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""
https://www.acmicpc.net/problem/17271

# 유형 :DP
- 총 N 초 싸우는 동안 가능한 스킬 조합의 수
- A 는 1초 , B는 M 초 준비시간
- 시전중에 다른 스킬 사용 불가 & 스킬을 안쓰는 시간은 없음



"""
#
import sys; input = sys.stdin.readline
MOD = 1000000007

N, M = map(int, input().split())

# i초 때 가능한 경우의 수는 두 가지가 있다.
# i-1초까지 스킬 쓴 상태에서 A 스킬 사용
# i >= M일 때, i-M초까지 스킬 쓴 상태에서 B 스킬 사용
# dp(i) = dp(i-1) + dp(i-M)

dp = [1] * (N + 1)
for i in range(M, N + 1): # M초 미만일 땐 dp[i] = dp[i-1]이기 때문에 무조건 1이다.
dp[i] = (dp[i - 1] + dp[i - M]) % MOD

print(dp[N])
44 changes: 44 additions & 0 deletions Hongjoo/백준/암호만들기.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""
https://www.acmicpc.net/problem/1759

4 6
a t c i s w
['a', 'c', 'i', 's', 't', 'w']
- 문자 C 가지로 서로 다른 L개의 문자로 이뤄진 비번
- 비번은 최소 1개의 모음 , 최소 2개의 자음
- 정렬된 문자열
- goal) 모든 경우의 수

# 1. 문자 정렬 + 모음 . 자음 나눠두기
# 2. 중복 x 일반 조합 ? (Backtraking)
# 중복x , 순서 x , (조합)

"""
L , C = map(int,input().split())
arr = sorted(list(input().split())) # 전체 정렬

# print(f"1 -{arr}")
result = [""] * L
# print(arr)
# 전체 l 경우에서 c 개 조합
def backtracking(c , l , level , idx) :
if level == l :
a = 0 ; b = 0
# print(f"result {result}")
for k in range(l) :
if result[k] in [ "a" , "e" , "i" ,"o" ,"u"]:
a +=1
else :
b += 1
if a >= 1 and b >= 2 :
print("".join(result))

return
for s in range(idx , c) :

result[level] = arr[s]
backtracking(c,l,level+1, s+1)
Comment on lines +24 to +40
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리스트와 기능적으로 다르진 않지만 저는 set으로 모음을 정의해서 썼는데(vowel=set('aeiou')) ch in vowel 식으로 바로 확인할수 있는 점이 편했습니다! (큰 차이는 없지만 참고용으로,,, )

Comment on lines +37 to +40
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문제 풀이를 준비할 때 사실 백트래킹이나 조합으로만 할 수 있다고 생각했는데, 홍주님처럼 DFS만으로도풀이할 수 있다는 것을 알게 되었습니다~~!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사실 얻어걸린거라.., 감사합니다




backtracking(C , L , 0,0)
58 changes: 58 additions & 0 deletions Hongjoo/백준/진우의달여행small.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""
https://www.acmicpc.net/problem/17484

# 문제
- N x M 행렬
1. 이동 방향 - 최하 , 하 , 우하
2. 2번 연속 동일 방향 선택 불가
3. 반드시 달 도착
goal ) 최소 연료


"""
import sys
input = sys.stdin.readline

n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
dp = [[[0] * m for _ in range(n)] for _ in range(3)] # 3차원배열 DP
ans = sys.maxsize # 임의의 큰 값

for z in range(3):
for y in range(m):
dp[z][0][y] = board[0][y] # 초기 DP 초기화

for x in range(1, n):
for y in range(m):
if y == 0:
# 가장 첫 번째 열인 경우
# 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
# 아래 방향(dp[1])의 경우, 오른쪽 위에서 왼쪽 아래 방향으로 진행하는 값만 받을 수 있음
# 대각선 오른쪽 방향(dp[2])의 경우, 오른쪽 위에서 대각선 왼쪽 진행하는 값과 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
# dp[0][x][y] = dp[1][x - 1][y]
dp[1][x][y] = dp[0][x - 1][y + 1]
dp[2][x][y] = min(dp[0][x - 1][y + 1], dp[1][x - 1][y])
elif y == m - 1:
# 가장 마지막 열인 경우
# 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
# 아래 방향(dp[1])의 경우, 왼쪽 위에서 오른쪽 아래 방향으로 진행하는 값만 받을 수 있음
# 대각선 오른쪽 방향(dp[2])의 경우, 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
dp[0][x][y] = min(dp[1][x - 1][y], dp[2][x - 1][y - 1])
dp[1][x][y] = dp[2][x - 1][y - 1]
# dp[2][x][y] = dp[1][x - 1][y]
else:
# 중간 열인 경우
# 대각선 왼쪽 방향(dp[0])의 경우, 바로 위에서 아래 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
# 아래 방향(dp[1])의 경우, 오른쪽 위에서 대각선 왼쪽 방향으로 진행하는 값과 왼쪽 위에서 대각선 오른쪽 방향으로 진행하는 값만 받을 수 있음
# 대각선 오른쪽 방향(dp[2])의 경우, 오른쪽 위에서 대각선 왼쪽 방향으로 진행하는 값과 바로 위에서 아래 방향으로 진행하는 값만 받을 수 있음
dp[0][x][y] = min(dp[1][x - 1][y], dp[2][x - 1][y - 1])
dp[1][x][y] = min(dp[0][x - 1][y + 1], dp[2][x - 1][y - 1])
dp[2][x][y] = min(dp[0][x - 1][y + 1], dp[1][x - 1][y])

for z in range(3): # 원래 자신의 좌표값 더함
dp[z][x][y] += board[x][y]
Comment on lines +25 to +53
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굉장ㅇ히,,,꽤 복잡해 보이는 풀이네요 😵
한주간 꾸준하게 코테 문제 푸신것같은데 너무 수고하셨습니다!!


for z in range(3): # 3차원 배열 중 마지막 행의 최솟값을 찾음
ans = min(ans, min(dp[z][-1]))

print(ans)
33 changes: 33 additions & 0 deletions Hongjoo/백준/포도주시식.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""
https://www.acmicpc.net/problem/2156
# 문제 : 최대한 많은 양의 포도주 섭취
<조건>
1. 선택한 잔의 포두주는 모두 섭취 ,마신 뒤 원상복귀
2. 연속으로 놓여진 3잔 모두 섭취 불가

# 최대문제 -> "DP"

점화식
dp[i] : 현재 i 에서 최대 마실 수 있는 포도주 총합
1. 현재 O , 이전 O , 전전 x :
2. 현재 , 이전 x , 전전 O =
3. 현재 x , 이전 o , 전전 o =
dp[i] = max(cups[i] + cups[i-1] + dp[i-3] , cups[i] + dp[i-2] , dp[i-1])
"""
# 1. 입력변수
N = int(input())
cups = [int(input()) for _ in range(N)]

# 2.
dp = [0]*N

dp[0] = cups[0]
if N >=2 :
dp[1] = sum(cups[0:2])
if N >= 3 :
dp[2] = max(cups[2] + cups[1] , cups[2] + cups[0] , dp[1])
if N >= 4 :
for i in range(3,N):
dp[i] = max(cups[i] + cups[i-1] + dp[i-3] , cups[i] + dp[i-2] , dp[i-1])
# print(dp)
print(dp[-1])