Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코테
- 그리디
- 스택자료구조
- Express
- CSS
- 블챌
- 자료구조
- 구현
- 그리디알고리즘
- DP
- 알고리즘
- DFS
- react
- 코딩테스트실력진단
- BFS
- django
- DFS기초
- 파이썬
- react-query
- socket.io
- DFS활용
- 스택
- 백준
- 완전탐색
- 코드트리
- JS
- 코딩테스트
- 문자열
- 백준알고리즘
- 재귀
Archives
- Today
- Total
꾸준하게 거북이처럼
백준 2231번 - 분해합 : 브루트 포스 알고리즘 본문
2231번: 분해합
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이
www.acmicpc.net
나의 풀이:
216보다 작은 수 부터 시작해서 분해합을 구하고 그 합이 216과 같은지 확인하는 방법을 선택했다.
브루트 포스 알고리즘이다보니 모든 경우를 조사하기 때문에 이 방법을 선택했다.
하지만 어느 정도 숫자에 도달하면 216이 될 수 없기 때문에 (예를 들어 215,,200 천천히 분해합을 보다 100이나 더 작은수까지 가면)일일이 분해합을 끝까지 1이 될 때까지 구하면 효율성이 떨어진다.
입력값의 생성자의 최소를 가늠해서 반복문을 break해야 시간복잡도가 좀 더 좋아질 것이다. 나는 적어도 n // 2 값까지 검사하면 충분한 범위에서 생성자를 찾을 수 있을 거라 생각했다.
코드
def cal(x):
sum = x
while x > 0:
sum += x % 10
x = x // 10
return sum
if __name__ == "__main__":
n = int(input())
temp = n
ans = 0
while True:
temp -= 1
res = cal(temp)
if res == n:
ans = temp
elif temp < n // 2:
break
print(ans)
'Algorithm 문제 & 공부 > 구현' 카테고리의 다른 글
백준 12933번 파이썬 - 오리문제 (0) | 2022.10.01 |
---|---|
백준 1018.py 체스판 칠하기 (0) | 2022.07.07 |
백준 4948번 파이썬 (0) | 2022.07.04 |
파이썬 알고리즘 구현 for문 거꾸로 반복 (0) | 2022.05.20 |
파이썬 집합 - set (0) | 2022.05.17 |
Comments