일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Kotlin
- 11054
- 홈화면
- permutation
- 11기
- expo
- 코테
- 최소공배수
- Combination
- 순열
- 1260
- 9095
- 11053
- itertools
- 6603
- 나머지
- 파이썬
- 앱
- Python
- lcm
- 백준
- 11057
- Android
- LCS
- 괄호
- 매일11시
- Today
- Total
목록백준 (48)
황소개발자
( 괄호가 레이저를 만난 개수를 세면 되는데, 그리고 ) 와 만나 괄호가 닫힐 때, 지금까지 만난 (레이저 개수 + 1) 을 ans 에 더하면되고, 지금 까지 만난 괄호의 개수를 더 밑에 있는 막대기에게 알려주고 떠나가면 된다. ps = input().strip() ans = 0 stack = [0] for i in range(1, len(ps)): if ps[i] == '(': stack.append(0) elif ps[i] == ')': if stack[-1] == 0: if len(stack) >= 2: stack[-2] += 1 stack.pop() elif stack[-1] != 0: if len(stack) >= 2: stack[-2] += stack[-1] ans += stack[-1] + ..
외적이다. 도형의 넓이 구할 때, 선분이 교차하는지 확인할 때, 도형을 만들 때, 등등 다 쓰인다. dot = [] for i in range(3): dot.append(list(map(int, input().split()))) def ccw(p1, p2, p3): x1, y1 = p1 x2, y2 = p2 x3, y3 = p3 return (x1 * y2 + x2 * y3 + x3 * y1) - (x2 * y1 + x3 * y2 + x1 * y3) result = ccw(dot[0], dot[1], dot[2]) if result > 0: print(1) elif result < 0: print(-1) else: print(0) 요즘 애들은 이제 벡터를 안배운다던데, 참.. 필자 때 딱 행렬이 끊겨서...
마치 이 뭔가 분열되어가며 답을 찾는 이 느낌. n = int(input()) B = list(map(int, input().split())) def go(x, b, A): b.remove(x) A.append(x) least_one = False if not b: return True if x * 2 in b: least_one = True return go(x * 2, b, A) if x % 3 == 0 and x // 3 in b: least_one = True return go(x // 3, b, A) if not least_one: return False for i in range(n): A = [] flag = go(B[i], B.copy(), A) if flag: print(*A) break..
간단간단하다구 원래 기본 BFS는 큐 한개로 구현이 되지. 이거는 시간을 고려해줘야 하기 때문에, (매초마다 1칸씩 없어지는) 큐 두개로 시간과 동기화 시켜줘야 해 ^^ 아래는 흔히 틀리는 반례야 (djm03178 님이 등록해주셨어) 23 5 10000000100010010000000 00011111001111111100100 n, k = map(int, input().split()) lst1 = input() lst2 = input() lst = [lst1, lst2] visited = [[0 for i in range(n)] for _ in range(2)] visited[0][0] = 1 def bfs(): q = [] q2 = [] q2.append([0, 0]) remove = 0 while q..
5 1000 입력했을 때, 11 2 가 나오는가? 안나온다면 중복을 해결하지 못한것이여. 그리고 n == k 일 때, 0 1 이 나와야혀. 코드는 다음과 같네 dp2 로 중복 개수를 헤아렷네. n, k = map(int, input().split()) if n == k: print(0) print(1) exit() dp = [-1] * 150001 dp2 = [1] * 150001 flag = False dist = -1 count = 0 dp[n] = 0 q = [n] q2 = [] while q: now = q.pop(0) if now + 1 = 0: if dp[now - 1] == dp[now] + 1: dp2[now - 1] += dp2[now] elif dp[now - 1] == -1: if n..
올바른 괄호가 되기위해서는 ( * * * * ) * * * * * * 이런식. 이 때, 첫번째 괄호를 1번째, 두번째 괄호를 k 번째라고하자. 그러면 괄호안에 쌓여진 공간의 개수는 k - 2 이고, 오른쪽에 공간의 개수는 n - k 개이다. dp[n] = dp[k - 2] * dp[n - k] (k = 2 ~ n) 이다. import sys input = sys.stdin.readline t = int(input()) lst = [] for _ in range(t): lst.append(int(input())) dp = [0] * 5001 dp[0] = 1 for i in range(2, 5001, 2): for j in range(2, i + 1, 2): dp[i] += (dp[j - 2] * dp[i..
초등학교 4학년.. 0 ~ 20 배열 두개 만들어줘서 번갈아가면서 업데이트해주면 됩니다 수 하나씩 꺼내면서 고려해주는 것이죠. n = int(input()) lst = list(map(int, input().split())) dp1 = [0] * 21 dp2 = [0] * 21 dp1[lst[0]] = 1 for i in range(1, n - 1): for j in range(21): if j + lst[i] = 0: dp2[j - lst[i]] += dp1[j] dp1 = dp2 dp2 = [0] * 21 print(dp1[lst[-1]])
m 크기 배열을 두개 만들어주고 서로 교차해주면서 업데이트 해나가면 된다. n, m 범위도 크지 않기에 가능하다. n, s, m = map(int, input().split()) lst = list(map(int, input().split())) dp1 = [0 for i in range(m + 1)] dp2 = [0 for i in range(m + 1)] dp1[s] = 1 for v in lst: for i in range(m + 1): if dp1[i]: if i + v = 0: dp2[i - v] = 1 dp1 = dp2 dp2 = [0] * (m + 1) ans = -1 for i in range(m, -1, -1): if dp1[i]: ans = i break print(ans)