[SWEA-d2]1945. 간단한 소인수분해 - python

iamjinseo·2022년 10월 26일
0

문제풀이-Python

목록 보기
121/134

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pl0Q6ANQDFAUq

문제 설명

숫자 N은 아래와 같다.

N=2a x 3b x 5c x 7d x 11e

N이 주어질 때 a, b, c, d, e 를 출력하라.

[제약 사항]

N은 2 이상 10,000,000 이하이다.

[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 번째 줄에 N 이 주어진다.

[출력]

출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

입력

10  
6791400
1646400
1425600
8575
185625
6480
1185408
6561
25
330750

출력

#1 3 2 2 3 1
#2 6 1 2 3 0
#3 6 4 2 0 1
#4 0 0 2 3 0
#5 0 3 4 0 1
#6 4 4 1 0 0
#7 7 3 0 3 0
#8 0 8 0 0 0
#9 0 0 2 0 0
#10 1 3 3 2 0

풀이

def facto(n):  # 소인수분해
    res = {2:0, 3:0, 5:0, 7:0, 11:0}
    d = 2
    while d <= n:  # 약수가 n이하일때까지
        # 숫자가 18이면 2로 한 번 나누고 3으로 두 번 나눔
        # 숫자가 20이면 2로 두 번 나누고 5로 한 번 나눔
        if n % d == 0:  # 현재 약수로 나눠지면
            res[d]+=1  # 현재 약수 추가
            n /= d  # 숫자 나누기
        else:
            d += 1  # 약수 증가 (4로 나누어질 염려를 안해도 되는게, d가 2일 때 나눗셈 끝남)
    return res

t = int(input())
for i in range(t):
    print(f"#{i+1}", end=' ')
    num_facto = facto(int(input()))
    print(*num_facto.values())

facto부분은 소인수분해(Factorization)파트로 주석을 보면 이해할 수 있다.
res는 사실 그러면 안되긴 한데 문제에서 소인수를 11까지만 주었으므로 소인수를 카운트하는 res에도 11까지만 담기도록 했다ㅎ

결과


아니 SWEA를 오늘 d1부터 쭉 풀고있는데 어째 내가 풀기만 하면 실행시간이 길게 나온다...
d1 풀 때 어떤 분은 엄청 짧고 빠르게 잘하셨길래 코드 보고 그대로 복붙해서 실행했더니 내껀 100ms대임ㅠ stop 억까!!!❗❗❗🚫🚫🚫

profile
일단 뭐라도 해보는 중

0개의 댓글