본문 바로가기
알고리즘/CodeUp PS

[CodeUp][Python] 1290번 : 대금 만들기

by 빛밤하늘 2021. 9. 25.
반응형

밑의 링크는 CodeUp에서의 문제 링크입니다.

문제는 링크를 통해서 직접 봐주시길 바랍니다.

 

대금 만들기

최고의 대금을 만들 수 있는 대나무가 발견되었다. 이 대나무를 최고의 악기로 만들기 위해서는 대나무를 자를 때, 다음과 같은 조건을 만족해야 한다. 대나무의 원래의 길이를 $n$이라고 할 때,

codeup.kr

 

 

 

주의해야 할 점

1. readline과 int나 float를 사용하는 입력 방식

readline을 사용해서 입력할 때는 맨 끝에 \n이 붙어서 입력됩니다.

하지만, 입력한 값을 int나 float으로 처리해 정수, 실수형으로 만들어 줄 때는 

굳이 \n을 떼기 위해 rstrip을 사용할 필요가 없습니다.

숫자 형태를 만들어줄 때 자동으로 사라집니다.

num = int(sys.stdin.readline())

 

 

예제 설명

1. 첫 번째 예제

- 입력

10

 

- 출력

3

 

- 설명

입력한 대나무의 길이 n은 10입니다.

좋은 소리를 내는 서로 다른 대나무 조각의 수는 n의 약수 중 자기 자신을 뺀 개수입니다.

10의 약수는 1, 2, 5, 10이므로 자기 자신인 10을 뺀 개수는 3입니다.

따라서 3을 출력합니다.

 

 

생각한 풀이 과정

대나무의 원래 길이인 n을 입력합니다.

좋은 소리를 내는 서로 다른 대나무 조각의 수는 대나무의 원래 길이인 n의 약수 중

자기 자신 n만 뺀 진약수들의 수입니다.

이 진약수들의 수를 저장할 변수 daegeum_cnt를 선언하고 0으로 초기화합니다.

진약수의 개수를 구하기 위해 필요한 1부터 반복해볼 끝인 n의 제곱근의 정수 부분에 1을 더한 값을

변수 limit에 저장합니다.

 

1부터 limit -1 값까지 반복해봅니다.

16의 약수 중 4처럼 현재 숫자가 n의 약수 중 제곱근인 약수라면

즉, n을 현재 숫자로 나누었을 때 나머지가 0이고, 현재 숫자와 n을 현재 숫자로 나눈 값이 같다면

daegeum_cnt에 1을 더합니다.

현재 숫자가 제곱근이 아닌 약수라면 즉, n을 현재 숫자로 나누었을 때 나머지가 0이라면

daegeum_cnt에 2를 더합니다.

 

n의 약수 중 n 자기 자신은 개수에서 뺀 진약수의 개수를 구하는 것이므로

daegeum_cnt의 값에 1을 빼고 출력합니다.

 

 

제출한 파이썬 코드

# readline을 사용하기 위해 import합니다.
from sys import stdin


# 대나무의 원래 길이인 n을 입력합니다.
# int형으로 변환합니다.
n = int(stdin.readline())
# 좋은 소리를 내는 서로 다른 대나무 조각의 수를 저장할 변수를 선언합니다.
# 0으로 초기화합니다.
daegeum_cnt = 0
# n의 제곱근의 정수 부분에 1을 더한 값을 저장한 변수를 선언합니다.
limit = int(n ** 0.5) + 1

# 좋은 소리를 내는 서로 다른 대나무 조각의 수는 n의 약수 개수에서 n 자기 자신만 뺀 개수입니다.
# 1부터 limit - 1 값까지 반복해봅니다.
for divisor in range(1, limit):
    # 16의 약수 중 4처럼 n의 약수 중 제곱근인 약수인 경우입니다. 
    # n을 현재 숫자로 나누었을 때 나머지가 0이며, 현재 숫자와 n을 현재 숫자로 나누었을 때 몫이 같다면
    if n % divisor == 0 and divisor == n // divisor:
        # daegeum_cnt에 1을 더합니다.
        daegeum_cnt += 1
    # n의 약수 중 제곱근이 아닌 약수인 경우입니다.
    # n을 현재 숫자로 나누었을 때 나머지가 0이라면
    elif n % divisor == 0:
        # daegeum_cnt에 2를 더합니다.
        daegeum_cnt += 2

# n의 약수 중 n 자기 자신은 개수에서 빼야하므로 daegeum_cnt에 1을 뺀 값을 출력합니다.
print(daegeum_cnt - 1)

 

 

제출 결과

CodeUp 1290번 : 대금 만들기에서 코드 제출 결과
CodeUp 1290번 : 대금 만들기에서 코드 제출 결과

 

 

느낀 점

저는 이 문제를 처음 풀 때 대나무의 원래 길이 n에서

잘라서 만들 수 있는 좋은 소리를 내는 서로 다른 대나무의 조각의 수를 구하는 방법을 착각했습니다.

약수를 구하면 되는 것은 문제에서도 나와 있는데, 작은 약수들부터 하나씩 더해서

n보다 작은 최댓값일 때의 약수 개수를 구해야되는 줄 알았습니다.

 

그런데 다시 보니 단순히 약수들 중에서 자기 자신인 n만 뺀 진약수의 개수를 구하는 것이었습니다.

계속 잘못된 풀이 결과만 떠서 어떻게 풀어야하지 고민하고 있었는데

생각했던 것보다 오히려 단순한 문제여서 약간 허탈했습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

※ 공감 버튼과 구독 버튼도 잊지 말고 꾹 눌러주시면 감사하겠습니다~👍👍

반응형

댓글