[백준] 4673번. 셀프 넘버 (Python)

윤라이트·2024년 2월 6일

백준 코딩테스트

목록 보기
22/25

안녕하세요.
윤로그입니다.


백준 실버 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. 1부터 10000까지의 숫자가 담긴 리스트 만들기
  2. 리스트 없이 반복문을 사용해서 계산하기

첫 번째 방법은 메모리 사용량도 많고 뭔가 비효율적인 것 같아서
두 번째 방법을 생각해보았는데 생각이 안 나서 결국,

첫 번째 방법인 list에 1-10,000까지의 숫자 넣기로 결정.



여기서도 두 가지 방법이 떠올랐음.

  1. 문자열로 만들어서 인덱스로 구하기.
  2. 숫자로 1, 10, 100, 1000의 자리 계산하여 구하기.

문자열로 만드는 건 시간이 오래 걸릴 것 같아서
2번째 방법으로 생각해봤음.





알고리즘

  1. 1부터 10,000까지의 값이 담긴 리스트를 만든다.
  2. for문과 if문을 사용해서 1, 10, 100, 1000의 자리를 계산한 후,
    해당 값이 셀프 넘버가 아니라면 리스트에서 제거한다.
    => 최종적으로 리스트에는 셀프 넘버만 남게 됨.


[백준] 4673번. 셀프 넘버 (Python) ! 자리로 계산 !

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])

계산이 헷갈려서 좀 오래 걸린 듯.
이렇게 풀고 아까 생각했던 첫 번째 방법인 문자열로도 한 번 풀어봄.




[백준] 4673번. 셀프 넘버 (Python) ! 문자열로 계산 !

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])

이 방법이 훨씬 빠르고 쉽게 풀 수 있었음.....ㅋㅋㅋㅋㅋㅋ
뭐 다양한 방법으로 해야 실력이 느는 거지 ~

그래서 난 아래의 방법으로 푸는 것이 좋다고 생각함.




끝 - !
profile
끝까지 가보자9~!!!🔥✨💡

0개의 댓글