일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ADD
- git config global
- git commit
- local repository 생성
- github
- 정규식
- 함수
- Push
- git
- 1330
- 1
- 백준
- boostcamp #aI tech #주간리뷰
- GitHub 설치
- Reset
- 파이썬
- 수정사항업데이트
- remote repository 생성
- Restore
- amend
- regExr
- STAGE
- Baekjoon
- python
- 15596
- commit
- git push
- 두수비교하기
- Today
- Total
Très bien
BAEKJOON 4673 - Self Number 본문
셀프 넘버
◎ Problem Definition
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
◎ Implementation
1. Problem Type
- Implementation, Brute Force (실버 5)
2. Problem Analysis
양의 정수 n에 대해서 생성자 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자.
- d(n) : n + n의 각 자리수 (n : int, n>0)
- 51의 생성자 : 39 (∵ 39 + 3 + 9 = 51)
- 101의 생성자 : 91, 100 (∵ 91 + 9 + 1 = 101; 100 + 1 = 101)
셀프 넘버 : 생성자가 없는 숫자
- 1000보다 작은 셀프 넘버 : 총 13개 (1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97)
3. Solution_1 (☆초기 접근)
Brute Force하게 접근했다. dictionary 형태로 check 변수를 선언하고 {index, 0}으로 초기화한다. 1부터 순차적으로 생성자를 계산하여 check의 value값을 1로 변경한다. 각 숫자의 자리수는 <10 이면 한 자리수, <100이면 두 자리수, <1000이면 세 자리수 의 방법으로 구분했으며, %와 // 연산을 통해 각 자리수 숫자를 추출했다. → 이 부분은 조금 더 세련되게 구현하고 싶다.마지막으로 check의 value값을 한 번씩 검색하여 '0'의 값을 갖는 항목의 key 값을 출력한다.
▶ 완성 코드
# BAEKJUN 4673 - Self Number
# Python Code
# Type : Brute Force, Implementation
# Date : Jan. 10. 2022
# written by LemonSoda
N = 10000
check = {}
for i in range(1, N+1):
check[i] = 0
for i in range(1, N+1):
if i < 10 and i+i < (N+2):
check[i+i] = 1
elif i < 100 :
tmp = 0
tmp = i + i%10 + i//10
if tmp < N+2:
check[tmp] = 1
elif i < 1000 :
tmp = 0
tmp = i + i//100 + (i%100)//10 + i%10
if tmp < N+2:
check[tmp] = 1
elif i < 10000 :
tmp = 0
tmp = i + i//1000 + (i%1000)//100 + (i%100)//10 + i%10
if tmp < N+2:
check[tmp] = 1
for i in range(1, N+1):
if check[i] == 0:
print(i)
▶ 성능
4. Solution_2 (★공개된 다른 코드 참조)
▶ Reference
4673 백준 셀프 넘버 [파이썬]
① set 키워드를 사용하여 1부터 10000까지 natural_num(전체 자연수) 변수 생성 ② 생성자를 담을 변수(ge...
blog.naver.com
▶ 완성 코드
string으로 변환하여 한 자리씩 숫자를 읽어오는 방법을 사용했다. 코드가 훨씬 깔끔해졌다. 단, 형변환 반복으로 수행시간이 길어진 것 같다. set을 이용하여 차를 구하고 sorted 시킨 부분도 정말 깔끔하다.
# BAEKJUN 4673 - Self Number
# Python Code
# Type : Brute Force, Implementation
# Date : Jan. 10. 2022
# Reference : https://blog.naver.com/rnvl27/222607208027
# written by LemonSoda
N = 10001
num = set(range(1,N+1)) # 자연수 set
new = set() # 생성자
for i in range(1, N+1):
for j in str(i): # 정수 i를 string list로 변환하여 자리수 만큼 반복
i += int(j)
new.add(i)
check = sorted(num - new)
for i in check:
print(i)
▶ 성능
◎ Results
- dictionary, set, tuple 등 다양한 자료구조 형태에 익숙해져서 상황별로 적합한 자료형을 선택하도록 하자.
- 반복항을 제거할 때는 set을 사용하면 간편하다.
- str 데이터의 list 구조를 활용하면 때로는 쉽게 접근할 수 있다. string과 친해지면 사용할 수 있는 func의 자유도가 높아진다.
-
- 코딩 능
'Coding > Algorithm' 카테고리의 다른 글
Baekjoon 9020 - 골드바흐의 추측 (Python) (0) | 2022.02.21 |
---|---|
BAEKJOON 11653 - 소인수분해 (0) | 2022.02.20 |
BAEKJOON 1978 - 소수 찾기 (0) | 2022.02.17 |
SWEA 4112 - 이상한 피라미드 탐험 (0) | 2022.02.04 |
BAEKJOON 1330 - 두 수 비교하기 (0) | 2022.01.08 |