오늘 한 일
- 파이썬 문법 심화 1주차 15~19
- 코딩테스트 연습 Level 2 소수찾기
배운 거
itertools
데카르트곱 구하기
from itertools import product
sample1 = ["A", "B", "C", "D", "E"]
sample2 = [1, 2, 3, 4]
a = product(sample1, sample2)
# 행 / 열을 구분하여 프린트 하기 위해 enumerate 사용
for i, v in enumerate(product(sample1, sample2), 1):
print(v, end=" ")
if i % len(sample2) == 0:
print("")
결과
('A', 1) ('A', 2) ('A', 3) ('A', 4)
('B', 1) ('B', 2) ('B', 3) ('B', 4)
('C', 1) ('C', 2) ('C', 3) ('C', 4)
('D', 1) ('D', 2) ('D', 3) ('D', 4)
('E', 1) ('E', 2) ('E', 3) ('E', 4)
순열
👉 permutations
from itertools import permutations
sample = ["A", "B", "C"]
# 원소의 개수가 3개인 순열 출력
for i in permutations(sample, 3):
print(i)
결과
('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')
조합
👉 combinations
from itertools import combinations
sample = ["A", "B", "C"]
# 원소의 개수가 2개인 조합 출력
for i in combinations(sample, 2):
print(i)
결과
('A', 'B')
('A', 'C')
('B', 'C')
중복조합
from itertools import combinations_with_replacement
sample = ["A", "B", "C"]
# 중복을 포함한 원소의 개수가 3개인 조합 출력
for i in combinations_with_replacement(sample, 3):
print(i)
결과
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'A', 'C')
('A', 'B', 'B')
('A', 'B', 'C')
('A', 'C', 'C')
('B', 'B', 'B')
('B', 'B', 'C')
('B', 'C', 'C')
('C', 'C', 'C')
json.loads(r.text)
--> json String을 Dictionary로 바꿔주는 역할
csv 다루기
csv : comma-separated values, 텍스트에 쉼표( , )를 사용해 필드를 구분, .csv 확장자
열때는 파일 열기 했던 거랑 똑같이 하면 됨
쓸 때는 newline=' 옵션을 줘야 공백 라인이 생기지 않음
Decorator
선언되는 함수 위에 @decorator
# 데코레이터는 호출 할 함수를 인자로 받도록 선언합니다.
def decorator(func):
# 호출 할 함수를 감싸는 wrapper 함수를 선언합니다.
def wrapper():
# func.__name__에는 데코레이터를 호출 한 함수의 이름이 들어갑니다.
print(f"{func.__name__} 함수에서 데코레이터 호출")
func()
print(f"{func.__name__} 함수에서 데코레이터 끝")
# wrapper 함수를 리턴합니다.
return wrapper
@decorator
def decorator_func():
print("decorator_func 함수 호출")
decorator_func()
# result output
"""
decorator_func 함수에서 데코레이터 호출
decorator_func 함수 호출
decorator_func 함수에서 데코레이터 끝
"""
👇 데코레이터 예제
# 특정 함수의 실행 시간 구하기
import time
import random
def time_checker(func):
def wrapper():
# 함수가 실행될 때 시간을 저장합니다.
start_time = time.time()
# 함수를 실행합니다.
func()
# 함수가 종료된 후 시간에 실행될 때 시간을 빼 실행 시간을 구합니다.
executed_time = time.time() - start_time
# 실행 시간을 소수점 5자리까지만 출력합니다.
print(f"{func.__name__} 함수의 실행시간 : {executed_time:.05f}s")
return wrapper
@time_checker
def main():
# 함수의 실행 시간을 테스트하기 위해 0.1초 ~ 1초간 sleep 합니다.
time.sleep(random.randint(1, 10) / 10)
for i in range(10):
main()
# result output
"""
main 함수의 실행시간 : 0.80095s
main 함수의 실행시간 : 0.90009s
main 함수의 실행시간 : 1.00027s
main 함수의 실행시간 : 0.20020s
main 함수의 실행시간 : 0.90011s
main 함수의 실행시간 : 0.60041s
main 함수의 실행시간 : 0.30027s
main 함수의 실행시간 : 0.40024s
main 함수의 실행시간 : 0.10026s
main 함수의 실행시간 : 0.50032s
"""
👇 인자가 있는 함수의 데코레이터 예제
# 입력받은 인자에 2를 곱해주기
def double_number(func):
def wrapper(a, b):
# 함수에서 받은 인자에 2를 곱해줍니다.
double_a = a * 2
double_b = b * 2
return func(double_a, double_b)
return wrapper
@double_number
def double_number_add(a, b):
return a + b
def add(a, b):
return a + b
print(double_number_add(5, 10))
print(add(5, 10))
# result output
"""
30
15
"""
코딩테스트 연습
- 소수 찾기
👇문제👇
문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
numbers는 길이 1 이상 7 이하인 문자열입니다.
numbers는 0~9까지 숫자만으로 이루어져 있습니다.
"013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbers | return |
"17" | 3 |
"011" | 2 |
입출력 예 설명
예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.
예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.
11과 011은 같은 숫자로 취급합니다.
1차 시도
우선 소수 판별하는 함수를 만들었다. 👇
#소수 판별하는 함수
def prime(n):
if n==0 or n==1 : # 0이랑 1은 필요가 없다.
return False
for i in range(2,n+1): # 2부터 숫자까지 돌면서
if n%i == 0: # 나누어 떨어지면 제거
return False
return True
그리고 오늘 강의에서 배운 itertools를 이용해 뽑은 숫자들로 가능한 조합을 만들었다. 👇
from itertools import permutations
def solution(number):
answer = 0
sets = []
n_len = len(number) # 입력받은 숫자의 길이
for i in range (1, n_len+1):
sets += permutations(number, i) # 순열 - 길이만큼 모든 문자의 조합 만들기(순서O)
for aset in sets: # 그 조합 중
if prime(aset): # 소수인지 판별
answer += 1 # 소수라면 갯수 세기
return answer
이렇게 해서 신나게 코드 실행을 눌렀는데
으에에에엥
2차 시도
튜플은 더할 수 없다!
하고 생각해보니까 순열 만드는 permutations
함수가 리턴값이 튜플이었다.
이걸 어떻게 하지...
('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
요런 형태로 저장되니까 [ABC, ACB, BAC] 형태의 리스트로 저장되게 하면 될 것 같다.
int값으로 바꿔서 join하면 될 것 같은데 아무리 생각해도 감이 안 와서 열심히 찾아보고 힌트를 얻었다.
''.join(x) 사용해서 조인을 먼저 하고 int로 변환한다. 그리고 map을 사용해서 다시 리스트에 담아준다.
그럼 9번 line이 이렇게 바뀐다. 👇
sets = map(lambda x: int(''.join(x)),sets)
그리고 다시 실행!
왜 모든 결과가 0으로 나오지
왜지
2.5차 시도
그래서 혹시 소수 찾기 함수가 잘못되었나 싶어 따로 실행해봤는데
무조건 False를 리턴하는 병에 걸렸습니다.
그리고 노려보다가 깨달았다. 2부터 n+1까지 돌면 결국 자기 자신으로도 나눠지기 때문에 무조건 False일 수 밖에 없다....
나는 바보다
3차 시도
👇그렇게 바뀐 소수 찾기 함수👇
def prime(n):
if n==0 or n==1 : # 0이랑 1은 필요가 없다.
return False
for i in range(2,n//2+1): # 2부터 숫자까지 돌면서
if n%i == 0: # 나누어 떨어지면 제거
return False
return True
소수찾기는 잘 나오는 거 확인 했고
다시 실행해봤는데
이번엔 되는 거 따로 안 되는 거 따로..
혹시 0이 오는 배열이 문제일까 싶어서 테스트케이스를 추가해서 실행해보니
맞넹
4차시도... 찐막
문제는 중복제거다.
만약 031로 진행하게 되면 '031' 과 '31'이라는 배열이 둘 다 만들어지고, 이를 int형으로 바꾸면 31이라는 숫자가 중복된다.
그래서 0이 들어가면 결과가 더 많아지는 거다.
그래서 수열을 만드는 함수에서 중복제거를 해줘야 한다. map 한 리스트를 set 형으로 바꿔주면
#최종 코드
from itertools import permutations
#소수 판별하는 함수
def prime(n):
if n==0 or n==1 : # 0이랑 1은 필요가 없다.
return False
for i in range(2,n//2+1): # 2부터 숫자까지 돌면서
if n%i == 0: # 나누어 떨어지면 제거
return False
return True
def solution(number):
answer = 0
sets = []
n_len = len(number) # 입력받은 숫자의 길이
for i in range (1, n_len+1):
sets += permutations(number, i) # 순열 - 길이만큼 모든 문자의 조합 만들기(순서O)
sets = set(map(lambda x: int(''.join(x)),sets))
for aset in sets: # 그 조합 중
if prime(aset): # 소수인지 판별
answer += 1 # 소수라면 갯수 세기
return answer
잘 나온당 🥰🥰🥰🥰🥰
야호!
GitHub 댓글