일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 분할메모리할당
- 리덕스장바구니
- 토이프로젝트
- Redux
- js to ts
- Java
- 기초100제
- react-redux
- 파이썬
- codeup
- C++
- 공부
- memory
- 프로그래머스
- 코드업
- 정렬
- Spring
- error
- 일상
- 자료구조
- 협업
- Operating System
- react
- OS
- 백준
- CPU 스케줄링
- web
- 알고리즘
- 스프링
- 타입스크립트
- Today
- Total
목록Algorithm (180)
감자튀김 공장🍟
✔ 문제 ✔ 풀이 import sys input = sys.stdin.readline n, m = map(int, input().split()) res = [] def dfs(): if len(res) == m: print(' '.join(map(str, res))) return for i in range(1, n+1): res.append(i) dfs() res.pop() dfs() ✔ 설명 15650번과 다르게 for문에서 중복을 확인하는 if문이 삭제되었다. ✔ 후기 당연히.. if문만 지우면 될거라 했는데 if문 뿐만 아니라 dfs() 인자값도 제거했어야 했다... 역시 쉬워보여도 늘 쉽지 않지 (つ﹏
✔ 문제 ✔ 풀이 import sys input = sys.stdin.readline n, m = map(int, input().split()) res = [] def dfs(x): if len(res) == m: print(' '.join(map(str, res))) return for i in range(x, n+1): if i not in res: res.append(i) dfs(i + 1) res.pop() dfs(1) ✔ 설명 재귀함수를 이용해서 풀 수 있다. for문에서 (시작, n+1)까지를 범위로 잡아 dfs를 돌면 된다. ex) dfs(1) > res[1] > dfs(2) > res[1, 2] > dfs(3) > len(res) == 2 이므로 print, return > pop() > ..
✔ 문제 ✔ 풀이 🌱 itertools 없이 풀기 (재귀 사용) import sys input = sys.stdin.readline def perm(arr, n): res = [] if n == 0: return [[]] for i in range(len(arr)): x = arr[i] for j in perm(arr[:i] + arr[i+1:], n-1): res.append([x] + j) return res n, m = map(int, input().split()) arr = [i for i in range(1, n+1)] ans = perm(arr, m) for i in ans: print(*i) ⭐ itertools 사용 from itertools import permutations n, m =..
✔ 문제 ✔ 풀이 import sys input = sys.stdin.readline def t_count(x): ans = 0 while x != 0: x //= 2 ans += x return ans def f_count(x): ans = 0 while x != 0: x //= 5 ans += x return ans n, m = map(int, input().split()) print(min(t_count(n) - t_count(n - m) - t_count(m), f_count(n) - f_count(n-m) - f_count(m))) ✔ 설명 입력 값이 최대 2억까지 들어올 수 있기 때문에 팩토리얼로 문제를 풀게되면 시간초과가 날 수 있다. 끝자리가 0이 나올려면 2x5 쌍이 필요하기 때문에 2,..
✔ 문제 ✔ 풀이 😲 Recursion Error 코드 import sys input = sys.stdin.readline def factorial(x): if x == 1: return x return x * factorial(x-1) n = int(input()) fac = list(map(int, str(factorial(n)))) res = 0 for i in range(len(fac) - 1, -1, -1): if fac[i] == 0: res += 1 else: break print(res) 재귀가 깊어질 때 나는 오류이다 👻 정답 코드 import sys input = sys.stdin.readline def factorial(x): ans = 1 for i in range(1, x+1): ..
✔ 문제 ✔ 풀이 import sys input = sys.stdin.readline t = int(input()) for _ in range(t): n = int(input()) dic = {} for _ in range(n): cloth, category = input().split() if category in dic.keys(): dic[category] += 1 else: dic[category] = 1 res = 1 for key in dic: res *= (dic[key] + 1) print(res - 1) ✔ 설명 조합론 문제이다. 옷의 종류 별로 분류를 하여 (a 종류의 옷 개수 + 1) * (b 종류의 옷 개수 + 1) * ... - 1 (알몸인 경우) 와 같은 식을 세울 수 있다. 딕..
✔ 문제 ✔ 풀이 import sys input = sys.stdin.readline def factorial(x): num = 1 for i in range(1, x+1): num *= i return num t = int(input()) for _ in range(t): n, m = map(int, input().split()) res = factorial(m) // (factorial(n) * factorial(m-n)) print(res) ✔ 후기 뭔가 조합보다 dp가 먼저 생각났는데 아무리 생각해도 어떻게 풀어야할지 모르겠어서 처음부터 다시 생각했다. 조합론 문제기 때문에 nCk로도 풀 수 있었는데 왜 dp가 먼저 떠올랐는지... 하여튼 앞에서 푼 이항 계수 문제들처럼 factorial을 사용해..
✔ 문제 ✔ 풀이 👾 답안1 import sys input = sys.stdin.readline def factorial(x): if x == 0: return 1 return x * factorial(x-1) n, k = map(int, input().split()) print((factorial(n) // (factorial(k) * factorial(n-k))) % 10007) 👻 math 라이브러리 사용 import sys from math import factorial input = sys.stdin.readline n, k = map(int, input().split()) def binomal(n, k): return factorial(n) // factorial(k) // factorial(..
✔ 문제 ✔ 풀이 import sys input = sys.stdin.readline def factorial(x): if x == 0: return 1 return x * factorial(x-1) n, k = map(int, input().split()) print(factorial(n) // (factorial(k) * factorial(n-k))) ✔ 설명 ( n ) ( k ) 는 nCk로 나타낼 수 있다. nCk 공식은 위와 같이 풀 수 있기 때문에 factorial 재귀 함수를 만들어 문제를 풀면 된다.
✔ 문제 ✔ 풀이 import sys import math input = sys.stdin.readline n = int(input()) c = list(map(int, input().split())) for i in range(1, n): x = math.gcd(c[0], c[i]) print('{0}/{1}'.format((c[0] // x), (c[i] // x))) ✔ 설명 c[0]이 분모가 되기 때문에 c[0]과 나머지 c[i]의 최대공약수 x를 구한다. 최대공약수 x로 c[0]과 c[i]를 나눠 나온 몫으로 기약 분수 A/B를 출력하면 된다.