일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- java #자바 #생활코딩
- css #웹 #생활코딩
- 투포인터
- 백준 #알고리즘 #파이썬 #코딩테스트
- 다익스트라
- 백준 #파이썬 #알고리즘 #코딩테스트
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- java #자바
- css #생활코딩 #웹
- BFS
- java #자바 #동빈나
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- 파이썬 #백준 #알고리즘 #코딩테스트
- Dijkstra
- 백트랙킹
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- 백준
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 다이나믹프로그래밍
- 프로그래머스
- 파이썬
- 알고리즘
- 자바 #java
- dp
- 코딩테스트
- react #리액트 #동빈나
- 재귀
- DFS
- java #자바 #나동빈
- PYTHON
Archives
- Today
- Total
커리까지
더해서 n이 되는 자연수 집합 구하기 파이썬 본문
728x90
SMALL
- 최근 코딩테스트를 보면서 이러한 유형의 문제가 나왔었는데 알 것 같으면서 구현을 못해서 못풀었다.
- 그래서 앞으로 같은 유형의 문제가 등장하면 꼭 풀겠다고 다짐하며 찾아보았다.
- 합분해의 경우의 수를 구하는 알고리즘은 있었는데 내가 원하는 알고리즘이 없었다. 내가 원했던건 n이 되는 집합을 구하고 싶었기 때문이다.
- 겨우 찾은 알고리즘은 자바로 되어 있어서 해당 코드를 파이썬으로 변경하였다.
소스코드
import sys
input = sys.stdin.readline
def solution(n):
number = [n]
answer = []
while True:
answer.append(number.copy())
temp = number.pop()
if temp != 1:
number.append(temp - 1)
number.append(1)
else:
sum = 2
for _ in range(len(number)):
if number and number[-1] == 1:
sum += 1
number.pop()
if not number:
break
pivot = number.pop() - 1
number.append(pivot)
while sum > pivot:
number.append(pivot)
sum -= pivot
number.append(sum)
return answer
n = 5
print(solution(5))
>
[[5], [4, 1], [3, 2], [3, 1, 1], [2, 2, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]]
- 우선 n을 저장하고 내림차순으로 1씩 빼면서 구한다.
- 마지막에 더한 숫자가 1인지 아닌지로 먼저 구분 한 후 나머지를 저장한다.
- 참고블로그
- 여기에 자세한 설명이 있다. 이 블로그에 있는 코드를 파이썬으로 변경하였다.
- 앞으로 비슷한 유형이 나오면 이 코드를 사용해야 겠다.
728x90
LIST
'알고리즘 > 이론' 카테고리의 다른 글
4강: 파이썬 문법 - 리스트 자료형 (0) | 2021.01.05 |
---|---|
3강: 파이썬 문법 - 수 자료형 (0) | 2021.01.04 |
2강: 알고리즘 성능 평가 (0) | 2021.01.02 |
1강: 코딩 테스트 개요 및 출제 경향 (0) | 2021.01.01 |