[5단계] 함수
15596. 정수 N개의 합
▼해설보기
1. sum 함수를 이용한 코드
def solve(a):
return sum(a)
2. for문을 이용한 코드
def solve(a):
total = 0
for x in a:
total += x
return total
1. 작성한 코드에 대한 전체적인 내용
solve(a) 함수는 정수 n개가 주어졌을 때 주어진 정수의 합을 구하는 함수이다.
함수를 생성할 때는 def 예약어를 이용하면 된다. 함수가 실행해야 하는 문장은 들여 쓰기 해서 작성하고 반환하는 값은 return을 이용해서 작성한다. 함수의 이름은 함수의 생성자가 직접 만드는데 이번 문제는 solve( )라는 함수 이름이 주어져서 그대로 사용하였다.
2. sum함수를 이용해서 한줄로 작성 가능하다.
def solve(a):
return sum(a)
문제는 매우 간단하게 풀 수 있다. 여러 개의 정수를 더하는 함수는 sum 함수를 이용하면 되기 때문에 함수가 실행되고 반환하는 문장을 return sum(a)라고 코드를 작성하였다.
4673. 셀프 넘버
▼해설보기
1. list에서 사용할 수 있는 함수를 활용한 코드
numbers = list(range(1, 10_001))
remove_list = [] # 이후에 삭제할 숫자 list
for num in numbers :
for n in str(num):
num += int(n) # 생성자가 있는 숫자
if num <= 10_000: # 10,000보다 작거나 같을 때만,
remove_list.append(num) # append: 리스트에 요소를 추가할 때
for remove_num in set(remove_list) : # set 으로 중복값 제거
numbers.remove(remove_num)
for self_num in numbers : # 생성자가 있는 숫자를 삭제한 리스트
print(self_num)
2. set에서 사용할 수 있는 함수를 활용한 코드
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)
3. 함수 d(n) 이용하기
# 함수 d(n)
def d(n): #생성자 n을 이용해 d(n)을 만드는 수식
n = n + sum(map(int,str(n)))
return n
#셀프 넘버가 아닌 수들(생성자가 있는 수들)이 들어갈 집합
nonselfnum = set()
#nonselfnum 집합에 들어갈 수들 찾아 넣기
for i in range(1,10001):
nonselfnum.add(d(i))
#셀프 넘버들 출력하기
for j in range(1,10001):
if j not in nonselfnum:
print(j)
1. 코드 풀이에 대한 전체적인 내용 정리
이번 문제는 1부터 10,000까지 숫자 중 생성자가 있는 숫자를 제외한 셀프 넘버를 출력하는 문제이다.
문제를 풀 때, 생성자가 있는 숫자의 리스트(또는 집합)를 먼저 생성했고 이후에 1부터 10,000까지의 숫자 범위에서 생성자가 있는 숫자를 빼는 방식으로 풀었다. 코드는 리스트의 특성을 이용한 코드와 집합 자료형을 이용한 코드 두가지 경우를 작성해보았다.
2. 리스트의 특성을 이용한 코드작성
2-1. 생성자가 있는 숫자를 추가할 때
remove_list = [] # 이후에 삭제할 숫자 list
for num in numbers :
for n in str(num):
num += int(n) # 생성자가 있는 숫자
if num <= 10_000: # 10,000보다 작거나 같을 때만,
remove_list.append(num) # append: 리스트에 요소를 추가할 때
numbers는 1~10,000까지의 숫자로 이루어진 리스트이다. 이 리스트에서 숫자를 하나씩 꺼내서 각 자릿수를 분리하고 더한 수를 빈 리스트에 append 함수로 추가하였다. 이 추가한 숫자는 생성자가 있는 숫자로 이후에 1~10,000까지의 숫자 리스트에서 삭제할 숫자들이다.숫자를 분리할 때는 str함수를 이용해서 문자열로 변환을 했는데 그 이유는 숫자 형태로는 각 자릿수를 분리시킬 수 없기 때문이다. 그리고 각 자릿수를 합한 수를 num 변수에 선언하였고 해당 수는 10,000보다 작은 수인 경우에만 빈 리스트에 추가하였다. 아래에서 remove 함수를 이용해서 이 리스트에 있는 원소를 삭제해나갈 때 10,000보다 큰 수가 있으면 ValueError 에러가 발생하기 때문이다.
2-2. remove 함수로 원소를 삭제한다.
for remove_num in set(remove_list) : # set 으로 중복값 제거
numbers.remove(remove_num)
위에서 생성한 생성자가 있는 숫자로 이루어진 리스트(remove_list)는 중복되는 숫자가 있다. 이 숫자를 제거하기 위해서 set 함수를 이용해서 set 자료형으로 변환하였다. 그렇게 되면 수학의 집합과 동일한 성일을 가진 자료형이기 때문에 중복된 요소를 제거할 수 있다. 삭제하는 함수는 remove 함수를 사용하였다.
3. 집합 자료형의 특성을 이용한 코드 작성
3-1. 생성자가 있는 숫자를 추가할 때
remove_set = set() # 생성자가 있는 숫자 set
for num in numbers :
for n in str(num):
num += int(n)
remove_set.add(num) # add: 집합에 요소를 추가할 때
리스트를 사용한 코드와 기본적인 뼈대는 같다. 대신 빈 셋을 생성할 때는 set( ) 함수를 사용해주고 생성자가 있는 숫자를 빈 집합에 추가할 때는 add 함수를 사용해주었다.
3-2. 차집합 연산으로 생성자가 있는 숫자 집합을 빼준다.
self_numbers = numbers - remove_set # set의 '-' 연산자로 차집합을 구함
차집합 연산은 간단하게 한 줄로 표현이 가능하다. 1~10,000까지 숫자로 이루어진 집합에서 생성자가 있는 숫자의 집합을 - 기호로 빼준다.
3-3. 출력할 때는 sorted 함수로 정렬시켜준다.
for self_num in sorted(self_numbers): # sorted 함수로 정렬
print(self_num)
집합 자료형은 중복요소가 들어갈 수 없는 성질 이외에도 순서가 없다는 특징이 있다. 그런데 이번 문제는 셀프 넘버를 1부터 순서대로 출력해야 하기 때문에 sorted 함수를 이용해서 내림차순으로 정렬을 해주었다.
해당 함수의 revers 파라미터 값이 False이기 때문에 오름차순으로 정렬할 때는 revers=True로 지정해서 사용할 수 있다.
1065. 한수
▼해설보기
1. def 함수를 생성한 경우
def hansu(num) :
hansu_cnt = 0
for i in range(1, num+1):
num_list = list(map(int,str(i)))
if i < 100:
hansu_cnt += 1 # 100보다 작으면 모두 한수
elif num_list[0]-num_list[1] == num_list[1]-num_list[2]:
hansu_cnt += 1 # x의 각 자리가 등차수열이면 한수
return hansu_cnt
num = int(input())
print(hansu(num))
2. 함수를 생성하지 않은 경우
num = int(input())
hansu = 0
for i in range(1, num+1):
num_list = list(map(int, str(i)))
if i < 100:
hansu += 1 # 100보다 작으면 모두 한수
elif num_list[0]-num_list[1] == num_list[1]-num_list[2]:
hansu += 1 # x의 각 자리가 등차수열이면 한수
print(hansu)
1. 코드 작성에 대한 전체적인 내용
이번 문제는 랜덤으로 숫자를 입력받으면 1부터 입력받은 숫자까지의 범위 안에서 숫자의 각 자리 숫자가 등차수열을 이루는 수가 몇 개인지를 출력하는 문제이다. def 예약어로 함수를 생성한 코드와 함수를 생성하지 않은 코드 두 가지 경우로 코드를 작성해보았다.
2. 등차수열
숫자와 숫자의 사이의 간격이 동일한 숫자의 나열이다. 이 문제에서 두 자리 숫자는 등차수열인지 비교대상이 없기 때문에 모두 한수이고 세자리 숫자는 각 자리의 숫자 간격이 동일하면 한수이다.
3. 등차수열을 찾는 for문을 작성한다.
for i in range(1, num+1):
num_list = list(map(int, str(i)))
if i < 100:
hansu += 1 # 100보다 작으면 모두 한수
elif num_list[0]-num_list[1] == num_list[1]-num_list[2]:
hansu += 1 # x의 각 자리가 등차수열이면 한수
num변수는 입력 받은 숫자를 선언한 변수이다. 1부터 num까지의 숫자 범위에서 한수를 찾는 문제이기 때문에 range 함수를 이용해서 숫자 범위를 생성했다. 숫자는 해당 숫자를 이루는 각각의 자릿수 숫자를 분리할 수 없다. 그렇기 때문에 for문의 변수 i를 str함수로 문자열로 변환시키고서 각 자릿수를 분리해서 다시 int 타입으로 변환시켰다. 1~99는 모두 한수이다. 그래서 if 조건식으로 변수i가변수 i가 100보다 작은 경우 모두 hansu라는 변수에 숫자를 더하도록 했고 변수 i가 100 이상인 경우 3자리 숫자를 앞의 두 자리의 차이와 뒤의 두 자리의 차이가 같으면 한수이다.