일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 괄호
- 1182
- 6603
- 백준
- 코테
- Python
- expo
- permutation
- 파이썬
- LCS
- 11053
- 앱
- lcm
- 나머지
- 11054
- 코틀린
- itertools
- 11기
- Kotlin
- 매일11시
- 순열
- 11057
- Combination
- 홈화면
- Android
- 안드로이드
- 1260
- 9095
- 최소공배수
- 뒤로가기
- Today
- Total
목록백준 (48)
황소개발자
처음엔 아래 코드와 같이, a b c 의 lcs 는 (a b 의 lcs) 와 (c) 의 lcs 이겠지 생각했으나 틀렸다. def lcs(a, b): dp = [[0 for i in range(len(a) + 1)] for j in range(len(b) + 1)] for i in range(1, len(b) + 1): for j in range(1, len(a) + 1): if a[j - 1] == b[i - 1]: dp[i][j] = dp[i - 1][j - 1] + 1 else: dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) return findit(a, dp) def findit(a, dp): ans = '' now = dp[-1][-1] y = len(dp) - 1 ..
a = input() b = input() dp = [[0 for i in range(len(a) + 1)] for j in range(len(b) + 1)] for i in range(1, len(b) + 1): for j in range(1, len(a) + 1): if a[j - 1] == b[i - 1]: dp[i][j] = dp[i - 1][j - 1] + 1 else: dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) def findit(): ans = '' now = dp[-1][-1] y = len(dp) - 1 x = len(dp[0]) - 1 while now != 0: if dp[y][x - 1] == now - 1 and now - 1 == dp[y - 1..
n = int(input()) def sol(n): if n % 2 != 0: return 0 else: dp = [0] * (n + 1) dp[0] = 1 # 0줄인 경우는 아무것도 안하는 경우 하나이니까 dp[2] = 3 for i in range(4, n + 1): dp[i] = dp[i - 2] * 3 for j in range(i - 4, -1, -2): dp[i] += dp[j] * 2 return dp[n] print(sol(n)) 이런 타일 문제는요~ 길이가 1칸일 때, 생길 수 있는 경우의 수. 길이가 2칸일 때, 길이 1칸 경우의 수와 겹치지 않으며 생길 수 있는 경우의 수. 길이가 3칸일 때, 길이 1~2칸 경우의 수와 겹치지 않으며 생길 수 있는 경우의 수. 길이가 4칸일 때, 길이..
n = int(input()) lst = list(map(int, input().split())) dp_left = [1] * n dp_right = [1] * n for i in range(n): for j in range(i): if lst[j] < lst[i]: if dp_left[i] < dp_left[j] + 1: dp_left[i] = dp_left[j] + 1 for i in range(n - 1, -1, -1): for j in range(n - 1, i, -1): if lst[j] < lst[i]: if dp_right[i] < dp_right[j] + 1: dp_right[i] = dp_right[j] + 1 dp = [dp_left[i] + dp_right[i] for i in ran..
기본적으로 다음과 같은 표를 만드세요 0 A C A Y K P 0 0 0 0 0 0 0 0 C 0 A 0 P 0 C 0 A 0 K 0 그리고 한줄씩 채워 나갑니다. 0 A C A Y K P 0 0 0 0 0 0 0 0 C 0 0 A 0 P 0 C 0 A 0 K 0 위에 테이블에서, C와 A를 비교하면 다르죠? 다르면 max(그 칸의 윗 칸 값, 그 칸의 왼쪽 칸 값) 을 넣어줍니다. 0 A C A Y K P 0 0 0 0 0 0 0 0 C 0 0 1 A 0 P 0 C 0 A 0 K 0 위에 테이블에서, C와 C 같죠? 같으면 (그 칸의 왼쪽 위 대각선 칸 값) 을 넣어줍니다. 이게 답니다. 한줄씩 채워나가면됩니다. a = input() b = input() dp = [[0 for i in range(le..
n = int(input()) dp = [[0 for i in range(10)] for j in range(n)] dp[0] = [1 for i in range(10)] for i in range(1, n): for j in range(10): for k in range(j, 10): dp[i][k] += dp[i - 1][j] print(sum(dp[-1]) % 10007) 우선 dp 배열 만들어주는데, 어떻게 만드냐면 [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]] 이런식으로 쌓이게끔 해서 마지막 배열 합계가 정답입니다. ( % 10007 잊지말구요) 해결 아이..
1 2 3 4 5 6 7 8 9 10 11 12 13 n, k = list(map(int, input().split())) arr = [] for i in range(n): a = int(input()) arr.append(a) count = 0 for i in range(n): count += k // arr[-1-i] k = k % arr[-1-i] print(count) 그리디 알고리즘. 탐욕스럽게 풀자. 동전값이 제일 큰거부터 본다. 동전값이 제일 큰거부터 내고 싶은 거다. 그래야 적게 동전을 적게 낼테니. 그 동전값으로 나눈 몫을 카운트시키고, 동전값으로 나눈 나머지를 다음으로 넘긴다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include using namespace std; // 초기 선언 0으로는 시작할 수 없으니 long dp[10] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}; // 임시 배열을 만들고 계산 후 dp에 업데이트 void update(long* arr){ long tmp[10]; tmp[0] = arr[1]; // dp[0] = dp[1] tmp[9] = arr[8]; // dp[9] = dp[8] for (int i = 1; i n; for (int i = 0; i cs 저 연산 과정 중, tmp[i] = (arr[i - 1] ..