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 |
Tags
- REST_API
- 운영체제
- javascript
- html
- superstarjypnation
- UI
- useState
- 자바스크립트
- 스택
- CSS
- 코드스테이츠
- 자료구조
- web
- 30daysdowoonchallenge
- 생활코딩
- Til
- React
- 회고
- 백준
- 카카오
- 프로토타입
- 프로그래머스
- level1
- vercel
- UX
- redux
- Next.js
- 큐
- mysemester
- 해시테이블
Archives
- Today
- Total
데굴데굴
[파이썬] 2231번: 분해합 본문
2231번: 분해합
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이
www.acmicpc.net
첫 풀이
n = int(input())
sums = []
for num in range(1, n + 1):
sum = num
s = str(num)
for j in s:
sum += int(j)
if sum == n:
sums.append(num)
if len(sums) == 0:
print(0)
else:
print(min(sums))
처음엔 이렇게 했는데 계속 틀렸다고 나와서 질문게시판을 보며 반례를 찾았다.
로직은 맞았지만 두 번째 for문의 if문에서 들여쓰기를 잘못한 것이 문제였다.
입력이 31일 경우 원래대로라면 0이 나와야 하지만, 위 코드에서는 num=29에서 첫째자리인 2만 더했는데도 생성자로 분류되어 29가 출력된다.
최종 풀이
n = int(input())
sums = []
for num in range(1, n + 1):
sum = num
s = str(num)
for j in s:
sum += int(j)
if sum == n:
sums.append(num)
if len(sums) == 0:
print(0)
else:
print(min(sums))
if문의 들여쓰기를 한 칸 빼내어 다시 돌려보면 바르게 출력된다.
다른 사람의 코드
n = int(input())
result = 0
for i in range(1,n):
lst = list(map(int,str(i)))
result = i+sum(lst)
if result ==n:
print(i)
break;
if i==n:
print(0)
map을 이용해 각 자릿수를 분리하여 숫자로 바꾼 후 리스트에 저장한다.
sum()을 이용하여 자릿수의 합을 한번에 구한다.
이렇게 하면 for문을 한 번만 돌기 때문에 시간복잡도가 O(n)으로 줄어들어 훨씬 빨라진다.
'algorithm > 백준' 카테고리의 다른 글
[파이썬] 9093번: 단어 뒤집기 (0) | 2022.07.10 |
---|---|
[파이썬] 7568번: 덩치 (0) | 2022.07.06 |
[파이썬] 17478번: 재귀함수가 뭔가요? (0) | 2022.07.01 |
[파이썬] 10845번: 큐 (0) | 2022.06.30 |
[파이썬] 9012번: 괄호 (0) | 2022.06.16 |
Comments