입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100, 000)
입력의 마지막엔 -1이 주어진다.
출력
테스트케이스 마다 한줄에 하나씩 출력해야 한다.
n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).
이때, 약수들은 오름차순으로 나열해야 한다.
n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.
풀이
1. 1~n-1의 숫자로 나눠서 나머지가 0이면 약수로 저장하기
2. 해당 약수를 출력하기
# 9506 약수들의 합
# 숫자를 계속 입력받기
while True:
n = int(input())
# -1을 받으면 while문 종료
if n == -1:
break
ans = []
add = 0
# 나누어지면 약수로 배열에 넣어주기
# 자동 오름차순
for i in range(1, n):
if n % i == 0:
ans.append(i)
for i in range(len(ans)):
add += ans[i]
if add != n:
print('{} is NOT perfect.'.format(n))
else:
print('{} ='.format(n),end=' ')
for i in range(len(ans)):
# 마지막 숫자의 뒤에는 + 를 빼주기
if i == len(ans)-1:
print('{}'.format(ans[i]))
else:
print('{} +'.format(ans[i]), end=' ')
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
출력
첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.
# 숫자를 입력받기
N = int(input())
# 출력될 값
ans = 0
# 입력 값부터 0으로 거꾸로 돌면서 입력값에서 빼준다
# 거꾸로 도는 이유는 가장 작은 생성자를 구하기 위해서
# 1에서 부터 돌면 가장 큰 생성자를 출력한다.
for i in range(N, 0,-1):
# 생성자는 입력 받은 수에서 i 만큼을 빼준 수
make_num = N - i
# 생성자 자릿수를 리스트로 생성
make_num_list = list(map(int, str(make_num)))
# print(make_num_list)
make_num_list_add = 0
# 생성된 리스트를 다 더해서 make_num_list 에 넣어줌
for num in make_num_list:
make_num_list_add += num
# print(make_num_list_add)
# 만약 자릿수를 모두 합한 값과 i(입력받은 수에서 빼준 값)이 같다면
if make_num_list_add == i:
# 답은 해당 i 값인 순간의 생성자로 교체
ans = make_num
break
print(ans)
def factorial(num):
ans = num
if num == 0:
return 1
elif num <= 1:
return ans
else:
ans = ans * factorial(num-1)
return ans
N = int(input())
print(factorial(N))
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
출력
상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.
N = int(input())
cnt = 0
while N > 0:
if N % 5 == 0:
N -= 5
cnt += 1
N
elif N % 3 == 0:
N -= 3
cnt += 1
elif N > 5:
N -= 5
cnt += 1
elif N == 3:
cnt += 1
break
else:
cnt = -1
break
print(cnt)
처음에는 '만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.' 이 조건을 못보고 문제가 짱구 게임 난의도라고 생각했는데 저 조건때문에 좀 생각을 많이 해야했다.
18
남은 설탕 수 : 15 봉지 수 :1
남은 설탕 수 : 10 봉지 수 :2
남은 설탕 수 : 5 봉지 수 :3
남은 설탕 수 : 0 봉지 수 :4
4
첫번째 예제를 실행하면 다음과 같은 결과가 나온다.
다른 분들이 푸신걸 보니 다이나믹 프로그래밍이니... 그리디 탐색이니... 하지만 나는 아직 그런걸 봐도 모르겠고...
평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.
이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.
아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.
입력
첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다
출력
각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라
# 2775 부녀회장이 될테야
T = int(input())
for tc in range(T):
k = int(input())
n = int(input())
people = [[0]*(n) for _ in range(k+1)]
i = 1
for height in range(k+1):
for room in range(n):
if height == 0:
people[height][room] = i
i += 1
if room == 0:
people[height][room] = 1
elif height !=0 and room != 0:
people[height][room] = people[height-1][room] + people[height][room-1]
print(people[k][n-1])