15596
문제 | 정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성하시오. 작성해야 하는 함수는 다음과 같다.
|
답 | 1) def solve(a): num = 0 for i in a: num += i return num 2) def solve(a): return sum(a) |
input으로 받아와야되나 이것저것 시도해보다가 런타임에러 잔뜩 때려맞아따..
이걸 원한거였구나!!
4673
문제 | 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다. 33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ... n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다. 생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97 10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오. |
입력 | 입력은 없다. |
출력 | 10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다. |
답 | numbers = set(range(1, 10001)) no_self = set() for i in numbers: i = i + sum(map(int, str(i))) no_self .add(i) for j in numbers: if j not in no_self: print(j) |
문제에 있는 셀프넘버도 이해가 안갔다..!!!
1+1 = 2 니까 1은 2의 생성자가 아닌가... 나와 같은 생각을 하신분을 구글링하다가 찾게되었따
https://bincoding.tistory.com/11
4673) 6. 함수 : 셀프 넘버(Self Number)
문제 https://www.acmicpc.net/problem/4673 4673번: 셀프 넘버 문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자...
bincoding.tistory.com
이분이 쓴걸 보니 셀프넘버 싹 이해가 됐다! 감사합니당~!~!!
numbers = set(range(1, 10001))
no_self = set()
for i in numbers:
i = i + sum(map(int, str(i)))
no_self .add(i)
for j in numbers:
if j not in no_self:
print(j)
그래서 나는 1 ~ 10000 에서 셀프넘버가 아닌 숫자를 빼줄 생각이다.
중복이 허용되면 안되니까 set으로 해보자!
셀프넘버가 아닌 수를 어떻게 구할지 고민을 해봤다.
하나하나씩 해봤다.
1 + 1 = 2
2 + 2 = 4
...
10 + 1 + 0 = 11
11 + 1 + 1 = 13
...
51 + 5 + 1 = 57
52 + 5 + 2 + 59
...
9968 + 9 + 9 + 6 + 8 = 10000
9969 + 9 + 9 + 6 + 9 = 10002(X)
9970 + 9 + 9 + 7 + 0 = 9995
9971 + 9 + 9 + 7 + 1 = 9997
9972 + 9 + 9 + 7 + 2 = 9999
...
10000 + 1 + 0 + 0 + 0 + 0 = 10001
1부터 10000까지 어떤수의 생성자라고 하고 계산해서 나온 수들을
no_self = set() 에 넣어주자 no_self 에 담긴 수가 10000보다 커도
1~10000이 담긴 numbers에서 no_self를 뺄거라 괜찮다!
그러면 저 계산을 어떻게 할것인가...
i = i + sum(map(int,str(i)))로 해서 i의 각 자리수의 값을 구했다.
no_self 에 추가하고,
다시 for문을 돌리면서 찍어주는데
numbers를 찍어주는데 no_self는 빼고 찍어줘야되니까
if j not in no_self:로 찍어주자!
어려웠어서 다른분의 코드를 봤다!
numbers = set(range(1, 10000))
remove_set = set() # 생성자가 있는 숫자 set
for num in numbers :
for n in str(num):
num += int(n)
remove_set.add(num) # add: 집합에 요소를 추가할 때
self_numbers = numbers - remove_set # set의 '-' 연산자로 차집합을 구함
for self_num in sorted(self_numbers): # sorted 함수로 정렬
print(self_num)
sum(map(int, str(i)))이 부분을
for num in numbers:
for n in str(num):
num += int(n) 으로 작성하셨다!
그리고 마지막에 sorted 로 정렬도 하셨다. 정렬 생각도 못했다..!!!
1065
문제 | 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. |
입력 | 첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다. |
출력 | 첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다. |
답 | import sys num = int(sys.stdin.readline()) han_num = 0 for i in range(1, num+1): num_list = list(map(int, str(i))) if i < 100: han_num += 1 elif num_list[0]-num_list[1] == num_list[1]-num_list[2]: han_num += 1 print(han_num) |
각 자리의 수를 구하는부분이 윗 문제랑 비슷했다!
어려운듯 하면서도 쉽고, 쉬운듯 하면서도 어려웠다!
먼저 num에 값을 받고
한수를 받아야 하니까 han_num = 0을 주고
num까지 돌려야 하니까 range를 (1 , num+1)까지 돌리자!
100보다 작으면 다 한수다!
두자리수는 각 자리수의 차가 1개밖에 없으므로 비교대상이 없고,
한자리수는 아예 비교 대상이 없다! 이렇게 비교대상이 없을 경우에는 한수로 쳐준다!
그리고 3자리 수 일때는
각 차가 같으면 한수를 1 높여주면 되는부분!! ㅎㅎ
'알고리즘 > 백준' 카테고리의 다른 글
문자열(1152, 2908, 5622, 2941, 1316) (1) | 2022.09.11 |
---|---|
문자열(11654, 11720, 10809, 2675, 1157) (0) | 2022.09.10 |
1차원 배열(10818, 2562, 3052, 1546, 8958, 4344) (0) | 2022.09.06 |
반복문(2438, 2439, 10871, 10952, 10951, 1110) (0) | 2022.09.05 |
반복문(2739, 10950, 8393, 25304, 15552, 11021, 11022) (0) | 2022.09.03 |
댓글