티스토리 뷰
반응형
🧩 파이썬 문제풀이: 소인수분해 (백준 11653)
안녕하세요! 오늘은 백준 알고리즘 문제 중 하나인 11653번 소인수분해 문제를 직접 풀어본 경험을 바탕으로, 내가 어떻게 문제를 이해하고, 접근하고, 구현했는지 단계별로 정리해보겠습니다.
📌 문제 요약
정수N
이 주어졌을 때, 이를 소인수분해한 결과를 한 줄에 하나씩 출력하는 문제입니다.조건:
N
이 1인 경우에는 아무것도 출력하지 않음- 그 외에는 소수로만 구성된 인수를 오름차순으로 한 줄에 하나씩 출력
💭 내가 문제를 풀기 전에 했던 생각들
1️⃣ "소인수분해"가 뭐지?
처음에 "소인수분해"라는 단어 자체가 헷갈렸습니다.그래서 이런 식으로 스스로 질문을 던지며 접근했습니다:
- 소인수분해란? → 어떤 수를 소수의 곱으로 나누는 것
- 소수란? → 1과 자기 자신만을 약수로 가지는 수
- 약수는 어떻게 구하지? → 어떤 수
n
을k
로 나눴을 때n % k == 0
이면k
는n
의 약수
2부터 시작해서num
이 나눠떨어질 때마다 출력하고, 나누고,
안 나눠지면k
를 하나씩 올리자!
✅ 내가 처음 작성한 코드
# 입력받기
num = int(input())
while num > 1:
k = 2
while k <= num:
if num % k == 0:
print(k)
num = num / k
else:
k = k + 1
🔍 코드 설명
num > 1
인 동안 계속 나눕니다.- 매번 2부터 시작해서
k <= num
인 동안 나눠질 수 있는k
를 찾습니다. num % k == 0
이면k
는 소인수 → 출력하고num
을k
로 나눕니다.- 나눠지지 않으면
k += 1
로 다음 후보를 확인합니다.
🔎 실행 예시
입력:
72
출력:
2
2
2
3
3
72 = 2 × 2 × 2 × 3 × 3
⚠ 개선할 점 (피드백)
사용자님의 코드도 정확히 동작하지만, 몇 가지 개선 포인트가 있습니다.📌 1. 매번 k
를 2부터 다시 시작할 필요는 없음
현재 코드는 num > 1
인 동안 계속 k = 2
부터 다시 시작합니다.이럴 필요 없이,
k
는 한 번만 초기화하면 됩니다.즉, 바깥
while
문은 필요 없습니다.
📌 2. 나눌 때는 //
를 써야 함
지금은 num = num / k
→ 이건 실수형(float)이 됩니다.정수만 다뤄야 하므로
//
연산자를 써야 합니다.
📌 3. 시간 효율 개선 가능
이 문제에서는 제한 범위가1 ≤ N ≤ 10,000,000
이기 때문에sqrt(N)
까지만 반복해도 충분히 빨리 동작합니다.하지만 여기서는 단순한 코드로 이해를 먼저 하고, 효율 개선은 나중에 공부해도 좋습니다.
✨ 개선된 코드 (깔끔한 버전)
n = int(input())
k = 2
while n > 1:
if n % k == 0:
print(k)
n //= k
else:
k += 1
변경 사항 요약:
k
를 함수 밖에서 한 번만 정의- 나눗셈을 정수 나눗셈
//
로 변경
📚 핵심 개념 요약
C++ 코드
#include <iostream>
using namespace std;
int main(void)
{
int N;
cin >> N;
while (N > 1)
{
int k = 2;
while (k <= N)
{
if (N % k == 0)
{
cout << k << endl;
N = N / k;
}
else
{
k++;
}
}
}
return 0;
}
✅ 마무리
이 문제를 풀면서 느낀 점은:쉬워 보이는 문제도 개념부터 정확히 이해하고,
작동 원리를 단계별로 생각하면서 구현해야 더 잘 풀린다!
반응형
'백준 스터디' 카테고리의 다른 글
색종이 넓이 계산 백준 2563, C++ (0) | 2025.06.01 |
---|---|
🧩 백준 1018번 - 체스판 다시 칠하기. 파이썬 (0) | 2025.05.30 |
백준 1018 체스판 다시 칠하기 C++ (1) | 2025.05.30 |
백준 2798 블랙잭 파이썬, C++ (0) | 2025.05.29 |
백준 10798 세로읽기 파이썬 문제풀이, C++ (0) | 2025.05.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그리디
- 인접 행렬
- 알고리즘 문제풀이
- c언어
- 객체지향
- Python
- dfs
- c++알고리즘
- 브루트포스
- 파이썬코딩
- 그리디알고리즘
- DP
- 코딩 테스트
- 프로그래밍
- 문제풀이
- 문제 풀이
- 동적 계획법
- 백준
- python 알고리즘
- 코딩테스트
- 알고리즘기초
- 그래프 탐색
- 코딩
- 알고리즘문제풀이
- 알고리즘
- C++ 알고리즘
- 동적계획법
- 문자열처리
- 파이썬
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형