CodingTest/Baekjoon

[백준/Python] 9506번 : 약수들의 합

2023. 5. 23. 09:00
728x90
시간 제한  메모리 제한 문제 티어 정답 비율
2 초 128 MB
브론즈 I
54.813%

📜 문제

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.

예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.

n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

 

📥입력

입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)

입력의 마지막엔 -1이 주어진다.

 

📤출력

테스트케이스 마다 한줄에 하나씩 출력해야 한다.

n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).

이때, 약수들은 오름차순으로 나열해야 한다.

n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.

 

💡풀이

이 문제는 무한반복문과 for 반복문, 약수 구하는 알고리즘을 알고 있다면 풀 수 있었던 문제였다.
 
-1을 입력받으면 break문을 통해 무한반복문을 탈출하여 프로그램을 종료시키고, -1이 아닌 다른 값이 들어왔으면 약수의 성질(자기 자신을 약수로 나누면 나머지가 0이 되는 것)을 이용하여 조건문을 만들어 해당 약수들을 divisor_list 안에 추가하도록 했다.
 
 
여기서 알아가야 할 점은 바로 for i in range(1, n//2 +1) 이 부분이다. 사실 for i in range(1, n) 해도 결과는 똑같다. 그러나  n의 약수는 자기 자신을 제외하면 n의 절반까지가 모든 약수를 구하므로 n//2 + 1까지만 반복하는게 시간 복잡도도 절반으로 줄이는 효과를 볼 수 있어 빠르게 코드를 돌릴 수 있다는 장점이 있다.
 

내가 작성한 정답코드는 아래와 같다.

import sys

input = sys.stdin.readline

while True:
  n = int(input())
  if n == -1:
    break
  else:
    total = 0
    divisor_list = []
    for i in range(1, n//2 + 1):
      if n % i == 0:
        total += i
        divisor_list.append(i)
    if n == sum(divisor_list):
      print(n, '=', end=' ')
      print(*divisor_list, sep=' + ')
    else:
      print(n, 'is NOT perfect.')

 

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준/Python] 13241번 : 최소공배수  (0) 2023.05.26
[백준/Python] 2501번 : 약수 구하기  (0) 2023.05.24
[백준/Python] 25206번 : 너의 평점은  (0) 2023.05.21
[백준/Python] 10988번 : 팰린드롬인지 확인하기  (0) 2023.05.20
[백준/Python] 10810번 : 공 넣기  (0) 2023.05.19
'CodingTest/Baekjoon' 카테고리의 다른 글
  • [백준/Python] 13241번 : 최소공배수
  • [백준/Python] 2501번 : 약수 구하기
  • [백준/Python] 25206번 : 너의 평점은
  • [백준/Python] 10988번 : 팰린드롬인지 확인하기
JuniTech
JuniTech
프로그래밍을 정복하기 위한 좌충우돌 코린이의 기록
JuniTech
Juni IT Technology
JuniTech
전체
오늘
어제
  • 분류 전체보기 (83)
    • Develop (29)
      • C, C++ (13)
      • Python (9)
      • Java (1)
      • JavaScript (0)
      • Arduino Uno (6)
    • CodingTest (38)
      • Baekjoon (36)
    • Project (0)
    • IT Issue (1)
    • Computer Science (11)
      • 프로그래밍 언어론 (3)
      • Open Source (3)
      • Data Structure (5)
    • Paper (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 🧑‍💻Github
  • 😎Juni의 잡동사니(일상 블로그)
  • 💰Juni의 투자일기(주식 블로그)

공지사항

인기 글

태그

  • LCD
  • 프로그래밍어론
  • 10798
  • 13241
  • 2083번
  • 프어론
  • 10797
  • 10811
  • c++
  • 10812
  • C
  • 프로그래밍 어론
  • 10813
  • 파스트리
  • 문자열
  • 10988
  • 25206
  • 프로그래밍 역사
  • pygame
  • 구문법
  • 10810
  • 27866
  • 아두이노 우노
  • 백준
  • Python
  • Backjoon
  • 11000
  • 포인터
  • 생존시간
  • 파이썬

최근 댓글

최근 글

hELLO · Designed By 정상우.
JuniTech
[백준/Python] 9506번 : 약수들의 합
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.