-
Notifications
You must be signed in to change notification settings - Fork 5
Hongjoo/4월 3주차/5문제 #194
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Hongjoo/4월 3주차/5문제 #194
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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) | ||
|
|
| 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]) |
| 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
+37
to
+40
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 문제 풀이를 준비할 때 사실 백트래킹이나 조합으로만 할 수 있다고 생각했는데, 홍주님처럼 DFS만으로도풀이할 수 있다는 것을 알게 되었습니다~~!
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 사실 얻어걸린거라.., 감사합니다 |
||
|
|
||
|
|
||
|
|
||
| backtracking(C , L , 0,0) | ||
| 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
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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) | ||
| 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]) |
There was a problem hiding this comment.
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 식으로 바로 확인할수 있는 점이 편했습니다! (큰 차이는 없지만 참고용으로,,, )