728x90

백준 단계별로 풀어보기 - 함수 문제 3개 python으로 풀기


15596 - 정수 N개의 합

※ Python 2, Python 3, PyPy, PyPy3: def solve(a: list) -> inta:

합을 구해야 하는 정수 n개가 저장되어 있는 리스트 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)리턴값: a에 포함되어 있는 정수 n개의 합 (정수)

코드를 제출하기 위한 페이지로 넘어가면 기본적으로 위와같은 코드들이 작성되어있다. 여기서 함수 이름과 입력값 a는 그대로 두고 나머지를 작성하여 원하는 결과를 내도록 코드를 짜면된다.

def solve(a):
    return sum(a)

풀이 : 리스트를 입력받고 리스트 내에 있는 요소들의 합을 출력해주는 것이 목표이다. 별다른 내용 없이 리턴값으로 sum함수를 사용하여 바로 계산한 뒤 반환하여준다.


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보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

self_num = []
no_self_num = []
for i in range(10000):
    exp = (i + 1) + sum(map(int, str(i + 1)))
    if exp not in no_self_num: no_self_num.append(exp)

for k in range(10000):
    if (k + 1) not in no_self_num: self_num.append(k + 1)
for e in self_num:
    print(e)

풀이 : 우선 n의 범위를 1~10000 까지로 설정한 뒤 모든 n에 대한 d(n)값을 계산한다. 계산 값을 no_self_num에 저장하면서 이이 존재하는 숫자일 경우 중복 저장이 되지 않도록한다. 그 후에는 다시 1~10000까지 for문을 돌리면서 no_self_num 리스트 내에 존재하지않는 숫자들만 따로 저장한 뒤 출력하여준다. 백준 숏코딩을 보면 set()을 사용하는데 set함수를 공부해서 더 짧고 좋은 코드를 만들어볼 수 있도록 계속 공부해야겠다.


1065 - 한수

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 

N = int(input())

def solve(a):
  value = 0
  if a >= 1000:
    a,b,c,d = map(int, str(a))
    if ((d - c) == (c - b) == (b - a)): value = 1
  else:
    a,b,c = map(int, str(a))
    if ((c - b) == (b - a)): value = 1
  return value

if N < 100: print(N)
else:
  result = 99
  for i in range(100, N + 1):
    result += solve(i)
  print(result)

풀이 : 맨처음에 범위 N을 입력받는다. 그 다음에는 함수 solve를 정의해준다. solve는 입력되는 수가 한수인지 아닌지를 구분하여 한수일 경우 1을 아닐경우 0을 반환하여준다. N이 100보다 작을경우 모든 수가 한수이기때문에 입력된 수를 반환하여준다. 그 외의 경우에는 1~99 + 범위내의 한수의 개수를 출력한다.

참고로 한수의 정의는 코드를 보면 알겠지만 예를 들어 123이 입력되었을 경우 각 자리수가 1, 2, 3이다. 즉, 공차가 1인 등차수열이다. 다른 예로는 543또는 531 처럼 공차가 -인 경우도 생각해야한다.

'코딩 공부 > 파이썬' 카테고리의 다른 글

백준 문자열 풀이 - 2  (0) 2022.01.24
백준 문자열 문제풀이 - 1  (0) 2022.01.20
백준 1차원 배열 문제풀이  (0) 2022.01.17
백준 While문 문제풀이  (0) 2022.01.14
백준 for문 문제풀이-2  (0) 2022.01.13

+ Recent posts