일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- permutation
- 11057
- LCS
- 앱
- 매일11시
- 나머지
- lcm
- 9095
- Python
- 11054
- Combination
- 6603
- Android
- 괄호
- 최소공배수
- 홈화면
- 백준
- 11053
- Kotlin
- 1182
- 안드로이드
- expo
- 뒤로가기
- itertools
- 1260
- 코틀린
- 파이썬
- 순열
- 11기
- 코테
- Today
- Total
목록전체 글 (181)
황소개발자
아직 난 멍청이다 N과 M 그렇게 풀어놓고 이걸 생각하지 못하다니 재귀에서 for 1~10 돌리면 모든 케이스 체크 가능하다. 중복 안되려면 check 배열 만들어서 T F 해주면된다 레바스님의 풀이이다. n = int(input()) op = input().split() c = [False] * 10 mx, mn = "", "" def possible(i, j, k): if k == '': return i > j return True def solve(cnt, s): global mx, mn if cnt == n + 1: if not len(mn): mn = s else: mx = s return for i in range(10): if not c[i]: if cnt == 0 or possible(s[..
식은 n이 120일 때 1 * (10 - 1) + 2 * (100 - 10) + 3 * (120 - 100 + 1) 이런식. 구현하면 다음과 같다 n = int(input()) length = len(str(n)) ans = 0 for i in range(1, length): ans += i * (pow(10, i) - pow(10, i - 1)) ans += length * (n - pow(10, length - 1) + 1) print(ans)
10 다음엔 0이 아니라 1이다. 그래서 x - 1, y - 1 해주고 x - 1 부터 시작하는데, M 씩 증가시켜가면서 N, y 만족하는 수를 찾아주는 거다. 찾았으면 + 1 해줘서 그 수를 기록한다 못찾았으면 -1이 그대로 나갈 것이다. import sys input = sys.stdin.readline t = int(input()) for _ in range(t): M, N, x, y = map(int, input().split()) x, y = x - 1, y - 1 ans = -1 for i in range(x, M * N + 1, M): if i % N == y: ans = i + 1 break print(ans)
예외처리를 좀 해줘야하는 문제이다. bgoodsamari님이 반례 모음을 올려주셨다. https://www.acmicpc.net/board/view/46120 위 링크에 반례들이 모여있다. n = int(input()) m = int(input()) ms = [] if m != 0: ms = list(input().split()) ans = 999999999 length = 0 for i in range(1000000): broken = False for s in str(i): if s in ms: broken = True if broken: pass else: if ans > abs(n - i): ans = abs(n - i) length = len(str(i)) ans = min(ans + lengt..
불가능이란 노력하지 않는 자의 변명이다 n, k = map(int, input().split()) dp = [[0 for i in range(k + 1)] for j in range(n + 1)] dp[0][0] = 1 for i in range(1, n + 1): for j in range(1, k + 1): for t in range(i + 1): dp[i][j] += dp[i - t][j - 1] dp[i][j] %= 1000000000 print(sum(dp[n]) % 1000000000)
확실히 min 함수보다 if 문 걸어줘서 해주는게 빠른가봄;; import sys N = int(sys.stdin.readline()) dp = [0] * 100001 for i in range(1, N + 1): dp[i] = i for j in range(1, i): if (j * j) > i: break if dp[i] > dp[i - j * j] + 1: dp[i] = dp[i - j * j] + 1 print(dp[N])
차원이 갈리는 다이나믹 유형 n = int(input()) lst = list(map(int, input().split())) dp = [[0, 0] for i in range(n)] dp[0] = [lst[0], -999999999] for i in range(1, n): dp[i][0] = max(dp[i - 1][0] + lst[i], lst[i]) dp[i][1] = max(dp[i - 1][0], dp[i - 1][1] + lst[i]) ans = -999999999 for i in range(n): ans = max(ans, max(dp[i])) print(ans)
수열이 한개라면 그 수열이 최대값이다. 그 수열 한개에 한개가 새로 오른쪽으로 들어온다. 그러면 연속합의 최대는 그 첫 번째 값 혼자거나, 두번째값 혼자거나, 첫번째 값이 들어간 연속최대값과 두번째값을 합친 값이거나 => max(dp[1], dp[2]) 인데 dp[2] = max(lst[2], dp[1] + lst[2]) -- (편의상 설명은 첫번째 == 1, 두번째 == 2 로 하겠다. 코드 구현은 인덱스로 했다.) 세번째 수가 오른쪽으로 새로 들어온다. 그러면 최대는 첫 번째 값이 포함된 연속된 최대값이거나, 두 번째 값이 포함된 연속된 최대값이거나, 세 번째 값 혼자거나, 두 번째 값이 포함된 연속된 최대값 + 세 번째 값이거나 => max(dp[1], dp[2], dp[3]) 인데 dp[3] = ..