안녕하세요.
윤로그입니다.
백준 실버 5 문제입니다.


문제 분석
- 셀프 넘버란 정확히 무엇인가?
-> 10 이하의 숫자는 1 + 1 => 2, 5 + 5 => 10 •••
여기서 헷갈리는 것은, 2 -> 4 -> 8-> 이렇게 더함으로 나온 숫자만을 계산하는 것이 아니였음. 숫자 전부를 계산하는 것.
즉, 1부터 10,000까지 전부!!!! 4567 -> 4567 + 4 + 5 + 6 + 7 => 4589
그래서, 이렇게 해서 나온 숫자가 "아닌" 모든 수를셀프 넘버라고 말함.
1+1 -> 2,
2+2 -> 4, •••
여기서 3이 나오지 않으니 셀프 넘버임.
난 처음에 두 가지 방법이 떠올랐음.
- 1부터 10000까지의 숫자가 담긴 리스트 만들기
- 리스트 없이 반복문을 사용해서 계산하기
첫 번째 방법은 메모리 사용량도 많고 뭔가 비효율적인 것 같아서
두 번째 방법을 생각해보았는데 생각이 안 나서 결국,
첫 번째 방법인 list에 1-10,000까지의 숫자 넣기로 결정.
여기서도 두 가지 방법이 떠올랐음.
- 문자열로 만들어서 인덱스로 구하기.
- 숫자로 1, 10, 100, 1000의 자리 계산하여 구하기.
문자열로 만드는 건 시간이 오래 걸릴 것 같아서
2번째 방법으로 생각해봤음.
알고리즘
- 1부터 10,000까지의 값이 담긴 리스트를 만든다.
- for문과 if문을 사용해서 1, 10, 100, 1000의 자리를 계산한 후,
해당 값이 셀프 넘버가 아니라면 리스트에서 제거한다.
=> 최종적으로 리스트에는 셀프 넘버만 남게 됨.
number = []
for i in range(10000) : # 1-10,000 값 넣기
number.append(i)
for i in range(len(number)) :
if i < 10 : # 1의 자리 계산
seq = i + i
number.remove(seq)
elif i < 100 : # 10의 자리 계산
seq = i + ((i - (i % 10)) / 10) + (i % 10)
if seq in number :
number.remove(seq)
elif i < 1000 : # 100의 자리 계산
seq = i + ((i - (i % 100)) / 100) + (((i % 100) - (i % 10)) / 10) + (i % 10)
if seq in number :
number.remove(seq)
elif i < 10000 : # 1000의 자리 계산
seq = i + ((i - (i % 1000)) / 1000) + (((i % 1000) - (i % 100)) / 100) + (((i % 100) - (i % 10)) / 10) + (i % 10)
if seq in number :
number.remove(seq)
for i in range(len(number)) : # 셀프 넘버 출력
print(number[i])
계산이 헷갈려서 좀 오래 걸린 듯.
이렇게 풀고 아까 생각했던 첫 번째 방법인 문자열로도 한 번 풀어봄.
number = []
for i in range(10000) : # 1-10,000 값 넣기
number.append(i)
for i in range(len(number)) :
num = str(i)
if i < 10 :
number.remove(int(num[0]) + int(num[0]))
elif i < 100 :
seq = i + int(num[0]) + int(num[1])
if seq in number :
number.remove(seq)
elif i < 1000 :
seq = i + int(num[0]) + int(num[1]) + int(num[2])
if seq in number :
number.remove(seq)
elif i < 10000 :
seq = i + int(num[0]) + int(num[1]) + int(num[2]) + int(num[3])
if seq in number :
number.remove(seq)
for i in range(len(number)) :
print(number[i])
이 방법이 훨씬 빠르고 쉽게 풀 수 있었음.....ㅋㅋㅋㅋㅋㅋ
뭐 다양한 방법으로 해야 실력이 느는 거지 ~
그래서 난 아래의 방법으로 푸는 것이 좋다고 생각함.