[백준] 4673번 - 셀프 넘버 (파이썬)

2022. 6. 10. 22:42·🎲 알고리즘 공부/백준

📝 문제

출력 예시

 

https://www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

 

 

🎨 풀이

💡 성공 코드

arr = []

def selfnumber(num):
    n = num
    
    while (n < 10000):
        tmp = sum(list(map(int,str(n))))
        n = n + tmp
        
        if n in arr :
            return 0
        else : arr.append(n)
    return 0

def main():
    for num in range(1,10000):
        if num in arr:
            continue
        selfnumber(num)
        
        if num not in arr :
            print(num)

main()

> 코드 길지만 은근 쉽다. (실행 순서에 따라 작성했습니다)

 

1. arr을 전역변수로 선언한다. 

2. main을 실행시킨다.

< main >  

   3. 1부터 10000까지 for문을 돌린다. 

---------------- for문 ------------------

   4. 만약 그 숫자가 arr에 이미 있다면 continue 시킨다.

     - 최대한 시간 줄이기 위해 노력한 부분1 (쓸데없는 반복 줄임)

   5. 그렇지 않다면 selfnumber 함수에 그 수를 넣어준다.

 

<selfnumber>

   6. 일단 전달받은 숫자를 n에 넣어둔다.

 ----------------- while문 ------------------

   7. n을 한글자씩 나눠서 list에 나눠담은 후, 합계를 구해서 tmp에 넣는다. (int 형태)    ex) n = 13 => [1,3] => tmp = 4

   8. n += tmp 를 해준다.

   9. 만약 n이 arr에 이미 있다면 이 selfnumber 함수를 return 해준다. (끝낸다)

     - 이미 n이 있다는 건 앞으로 돌 while 문이 쓸모없다는 뜻임. 왜냐면 같은 작업을 반복할거니까!! 다 이미 했던 거 굳이 안하게 중간에서 끊어주는 것임.

   10. n이 arr에 없다면 arr에 넣어주고 다시 while문을 돈다.

 ----------------- while문 끝------------------

   11. arr에 없는 숫자라면 print 해준다.

---------------- for문 끝------------------

 

 

😣 실패 코드

arr = []

def selfnumber(num):
    if num in arr:
        return 0
    else :
        n = num
        while (n < 10000):
            tmp = sum(list(map(int,str(n))))
            n = n + tmp
            arr.append(n)
        return 0

def main():
    for num in range(1,10000):
        selfnumber(num)

    for i in range(1,10000):
        if i not in arr :
            print(i)


main()

> 시간 초과. 문제는 main에 for문이 두개라서 아무래도 시간이 느려지는 것 같아서 두 번째 for문을 지웠다. 슬쩍 첫번째랑 결합시켰다. 하지만 결과는 밑의 코드와 같다 ^_^

 

arr = []

def selfnumber(num):
    n = num
    while (n < 10000):
        tmp = sum(list(map(int,str(n))))
        n = n + tmp
        arr.append(n)
    return 0

def main():
    for num in range(1,10000):
        if num in arr:
            continue
        selfnumber(num)
        if num not in arr :
            print(num)

main()

> 시간초과. selfnumber에 이 숫자가 arr에 있는지 체크하는 부분을 main으로 옮김 & 두 번째 for문 삭제했는데 또.. 시간초과가 떴다. 이후에는 성공코드처럼 while문 중간중간 체크 해주니까 잘 통과가 되었다~ 

​끝~

 

⭐ 느낀점

 

> 살짝 오늘 못풀수도 있겠다는 생각이 들었는데, 통과하니까 기분이 너무 좋았다 ㅎ_ㅎ 잘했다~

 

 

 

'🎲 알고리즘 공부 > 백준' 카테고리의 다른 글

[백준] 11654번 - 아스키 코드 (파이썬)  (0) 2022.06.12
[백준] 1065번 - 한수 (파이썬)  (0) 2022.06.11
[백준] 15596번 - 정수 N개의 합 (파이썬)  (0) 2022.06.09
[백준] 4344번 - 평균은 넘겠지 (파이썬)  (0) 2022.06.08
[백준] 8958번 - OX퀴즈 (파이썬)  (0) 2022.06.07
'🎲 알고리즘 공부/백준' 카테고리의 다른 글
  • [백준] 11654번 - 아스키 코드 (파이썬)
  • [백준] 1065번 - 한수 (파이썬)
  • [백준] 15596번 - 정수 N개의 합 (파이썬)
  • [백준] 4344번 - 평균은 넘겠지 (파이썬)
듬듬
듬듬
  • 듬듬
    두드림
    듬듬
  • 전체
    오늘
    어제
    • 분류 전체보기 (280)
      • 📑 신입일기 (35)
      • 🍪 Web (1)
        • angular (1)
        • JavaScript (0)
      • 🧩 Node.js 공부 (2)
      • 🎲 알고리즘 공부 (192)
        • 프로그래머스 (76)
        • 백준 (96)
        • 코드업 (19)
      • 🎨 Tistory Customizing (1)
      • 💌 일상 (12)
        • 일상 (5)
        • 기록 (7)
      • 📜 자격증 (2)
        • 정보처리기사 (2)
      • 📗 spring boot 공부 (9)
      • 학교 공부 (20)
        • ICT 개론 (14)
        • 리눅스 (6)
      • ChatGPT 랑 놀기 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    폰켓몬
    찬양추천
    카카오
    프로그래머스
    코테
    파이썬
    코민이
    BOJ
    신입일기
    50문답
    스프링부트
    스프링 부트
    티스토리챌린지
    피보나치수
    오버워치
    정처기
    컨텐더스
    코린이
    행렬덧셈
    til
    일기
    정보처리기사
    연습문제
    오블완
    백준
    6월 목표
    충무로
    codeup
    코드업
    nodejs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
듬듬
[백준] 4673번 - 셀프 넘버 (파이썬)
상단으로

티스토리툴바