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

jjiani·2021년 2월 14일
0

SWEA

목록 보기
8/20
post-thumbnail

swea - 문제 링크

T = int(input())
for tc in range(1, T+1):
    # 입력으로 받은 N을
    N = int(input())
    # 소인수 리스트를 만들어서
    num = [2, 3, 5, 7, 11]
    # 나눠진 횟수를 담기위한 빈 리스트 생성
    count = [0, 0, 0, 0, 0]
    # 리스트 num을 돌면서(range로 한 이유는 같은 인덱스에 count리스트에도 횟수를 추가해주기 위해서)
    for n in range(len(num)):
        # 무한루프를 주고
        while True:
            # 만약 N이 num의 n번째 숫자로 나눈 나머지가 0이라면
            if N % num[n] == 0:
                # N은 그 숫자로 나눈 몫으로 바꾸고
                N = N//num[n]
                # count리스트의 같은 인덱스에 값을 +1해줌
                count[n] += 1
            # 나눈 나머지가 0이 아니라면 멈추고 num의 다음 인덱스로 넘어감.
            else:
                break
    # 리스트컴프리핸션을 이용한 출력
    # print('#{}'.format(tc),' '.join([str(_) for _ in count]))
    # map함수는 str을 count의 모든항목에 적용
    print('#{}'.format(tc), ' '.join(map(str, count)))

🔑 문제이름이 '간단한 소인수 분해'인데 누구한테 간단하다는건지 모르겠지만 일단 저는 아닙니다...ㅎ

  • while문을 사용하고 싶어서 소인수리스트와 소인수로 몇번 나누어 졌는지 체크할 count리스트를 소인수 리스트와 같은 크기로 만든 뒤에 리스트의 인덱스가 중요해서 for문에 리스트의 길이를 주었다.
  • while문을 쓴 이유는 내가 while을 잘 못쓰고 있는것 같아 나중에 자유자재로 사용하기 위해 요즘 못하더라도 자꾸 쓰려고 노력중이다!
  • 처음엔 무한루프를 주고 소인수리스트(num)에서 하나 씩 가져와서 나눠보고 나머지가 0이 된다면 그 수는 N의 소인수가 맞으니, count에도 같은 인덱스에 +1씩 추가해준다.
  • 그리고 한번 나눴기에 N을 다시 나누는게 아니고 N을 소인수로 나눈 몫을 다시 나누는 작업을 반복해준다.
  • 결과값이 int를 담은 리스트이기에 한줄로 출력하기 위한 방법은 두가지가 있다.
  • 나눠지지 않는 경우에는 빠져나오기 위해서 break
    💡 리스트 컴프리헨션 -> for문으로 count를 돌면서 값을 str()값으로 변경해서 다시 리스트에 담기.
    💡 map(함수, 반복가능한객체) -> map은 반복가능한 객체를 지정된 함수로 처리해주는 함수이다. (원본 리스트를 변경하지 않고 새 리스트를 생성!)
    💡 join함수 앞에 ' '을 준 이유는 출력이 한칸씩 떨어져서 출력되어야 하므로 빈칸단위로 나누기 위해서 써주었다.
profile
¡Bienvenido a mi velog!🐣

0개의 댓글