문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/120852
내 답안
def solution(n):
answer = []
i = 2
while i <= n:
if n % i == 0:
answer.append(i)
n /= i
else:
i += 1
return (sorted(list(set(answer))))
풀이 정리
- 고민하다 결국 풀지 못해 구글링 찬스를 사용했다.ㅠㅠ
- 처음에 고민했던 방법
- n까지의 소수를 먼저 뽑아낸다.
- 소수로 나누어 떨어지는 숫자를 배열에 담는다.
- 중복값을 제거한다.. 라고 생각하는 로직을 짰었는데 이렇게 하면 너무 많은 오래걸리게 된다.
- 구글링을 통해서 좋은 방법을 찾아냈고, 조금 변경해보았다.
- 2부터 시작하기때문에 나누어떨어지는지를 확인하고, 떨어지면 answer배열에 추가해준다. 그리고 그때 n값을 나누어줘야한다! 또한 나누어떨어지지 않는 경우에는 i값을 증가시켜주면서 나누어떨어지는 값을 찾아내는 것이다.
- 마지막에 중복값을 제거하기 위해서는 set을 사용했는데, return이 list형이기 때문에 list(set(answer))형태로 돌려주었는데 에러가 4개가났다. 뭔지 몰라서 고민하다보니 오름차순으로 정렬이 필요한 조건이 있던 것을 확인하지 못했었다.
- 앞에 sorted를 붙여주니 모든 테스트케이스가 알맞게 동작했다.
다른풀이
while i <= n:
if n % i == 0:
if i not in answer:
answer.append(i)
n /= i
else:
i += 1
- set을 말고도 그냥 if i not in answer:이라는 조건문을 사용하여 순서대로 차곡차곡 쌓이도록 정렬도가능했다! 기억하자