예제1~25 중에서 선별
9. 짝수의 합
정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.
def solution(n):
even=[num for num in range(1,n+1) if num%2==0]
return sum(even)
앞으로 자주 쓰게 될 리스트 컴프리헨션
이렇게 하면 굳이 빈 리스트를 만들고 거기다가 append를 하는 수고를 덜 수 있다.
또한 range(1,n)은 1부터 n-1까지의 범위를 가리키기 때문에, n이하를 표현하기 위해 n+1을 해줬다.
13. 자릿수 더하기
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
13-1 몫과 나머지를 이용한 풀이
def solution(n):
total=0
while n>0:
digit=n%10
total+=digit
n=n//10
return total
total=0을 처음에 해주지 않으면 total이 정의되지 않았다는 오류가 나니 함수 내부에서 total을 정의해줘야 한다.
n%10을 하면 n을 10으로 나눈 나머지 즉, 1의 자리가 된다.
이 일의 자리를 total에 더해서 total을 반환하고,
n은 일의자리를 없애고 업데이트해준다. n=n//10
예를 들어 n=123이면 n//10=12 -> 이제 12가 새로운 n이 된다.
13-2 문자열로 반환 후 다시 정수로 만들어 합하는 방법
def solution(n):
total_sum=sum(int(digit) for digit in str(n))
return total_sum
n=123이라고 하면 str(n)='123'
for digit in srt(n) 을 쓰면 각 문자 '1', '2', '3'에 순서대로 접근하여 위 값을 digit에 저장한다.
이렇게 저장된 digit을 int(digit)으로 정수변환 해주고 합해주면 된다.
16. x만큼의 간격이 있는 n개의 숫자
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
16-1 for in문과 append
def solution(x,n):
x0=x
num=[]
for _ in range(1,n+1):
num.append(x)
x+=x0
return(num)
for _ in 문을 써보고 싶어서 작성해본 코드for _ in은 반복횟수만 정하고 싶을 때 사용한다. 위 코드는 n번동안 행동을 반복하고 있다.이 때 x+=x 라고 하면 x가 계속 업데이트되면서 값이 커지므로 최초의 x를 x0로 따로 지정해야 한다.
16-2 리스트 컴프리헨션
def solution(x,n):
return [x*i for i in range(1,n+1)]
리스트 컴프리헨션을 쓰면 append도 필요없이 한줄로 코드가 끝난다.
문제를 분석해보면 x의 배수를 x부터 n개 뽑아내고 있으므로 위와 같이 코드를 써주면 된다.
생각보다 예시 입출력값을 보면서 어떤걸 만들어내는 코드인지 분석하는 작업도 중요하다.
17. 자연수를 뒤집어 배열로 만들기
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
17-1. 몫과 나머지를 이용한 풀이를 응용
def solution(n):
answer=[]
while n>0:
num=n%10
answer.append(num)
n=n//10
return(answer)
몫과 나머지를 이용하면 뒤에서부터 숫자가 하나씩 나오는 효과가 있다. 하지만 복잡하기도 하고, append가 있는걸 보니 리스트 컴프리핸션으로도 쉽게 해결이 될 것 같다.
17-2 리스트컴프리핸션과 reverse
def solution(n):
num_list=[int(num) for num in str(n)]
num_list.reverse()
return num_list
13-2의 풀이를 참고해서 리스트를 만든 다음
.reverse() 함수로 순서를 뒤집었다. 이 때 inplace=True라서 영원히 배열이 바뀌게 된다.
17-3 리스트컴프리핸션과 슬라이싱
def solution(n):
num_list=[int(num) for num in str(n)][::-1]
return num_list
이렇게 해도 리스트를 뒤집을 수 있다.
[::-1]은 슬라이싱인데, 슬라이싱코드는 기본적으로 [시작점, 끝점, 스텝(진행방향과 간격)] 이다.
보통 스텝은 기본값이 1이라서 앞에서 뒤로 하나씩 진행하려면 생략하곤 한다.
지금은 [: :] 로 전체 리스트를 가져오는데 스텝을 -1로 설정해서 뒤에서부터 하나씩 가져오는걸로 설정했다.
19. 정수 제곱근 판별
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
def solution(n):
for x in range(1,int(n**0.5)+1):
if x**2==n:
return (x+1)**2
else: return -1
여기서 주의할것은 x의 범위를 제한하는 방법과 else의 위치이다.
예를 들어 n=130이라면, 11^2=121, 12^2=144d이므로 x는 12보다는 작을 것이다. 따라서 x의 범위도 1과 12 사이로 제한된다.
이 때 제곱근을 표현하는 방법이 바로 n**0.5 이고, x는 정수라고 했으므로 int로 바꾼 다음 1을 더해서 범위를 정했다.
else는 for문 바깥에 있어야한다. 만약 for문 안에 else를 쓰면 처음 루프를 돌고, 만족하지 않으면 바로 -1을 반환한다.
20. 정수 내림차순으로 배치하기
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
20-1. sort와 join
numbers=[]
def solution(n):
while n>0:
number=n%10
numbers.append(number)
n=n//10
numbers.sort(reverse=True)
answer=''.join(map(str,numbers))
return int(answer)
이전에 자릿수 모두 더하기에서 했던 코드를 조금 응용해서 numbers에 숫자를 리스트로 저장하고,
.sort(reverse=True) 로 내림차순으로 정렬했다.
그리고 join함수를 썼는데, join은 문자열만 합쳐줄 수 있으므로 우선 numbers를 모두 str으로 변환해서 합치고,
마지막에 int로 다시 변환해서 결과를 내줬다.
20-2. sorted와 join
def solution(n):
answer=int(''.join(sorted(str(n), reverse=True)))
return answer
sorted() 를 사용하면 바로 리스트로 반환되는 것을 이용하면, 리스트를 만든 다음 append를 할 필요가 없다.
22. 두 정수 사이의 합
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
제한 조건: a와 b의 대소관계는 정해져있지 않습니다.
22-1. 정직하기 풀이
def solution(a,b):
if a>=b:
return sum(range(b,a+1))
if b>a:
return sum(range(a,b+1))
이렇게 하면 대소관계가 없는 a와 b에서도 동작한다.
sum은 iterable을 받으므로 range도 받을수있다.
22-2. sum안에 다 넣기
def solution(a,b):
return sum(range(min(a,b), max(a,b)+1))
min, max를 써서 좀 더 깔끔하게 처리가능하다.
23. 콜라츠 추측
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.
def solution(n):
count=0
while n!=1 and count<500:
if n%2==0: n=n/2
else: n=3*n+1
count+=1
if count>=500:
return -1
return count
천천히 보면 어렵지 않은데, 만들때 오류가 좀 났었다.
우선 count=0을 준 다음 count+=1로 count를 세는 법은 ai모델 만들때도 자주 나왔던 방법이다.
while에 조건을 두 개 걸어서 두 조건을 모두 만족할때 코드가 동작하게 했고,
return count는 가장 마지막에 써서 while문이 False가 될 때 if문으로 넘어가서 -1을 반환할 수 있게 했다. 순서를 바꾸면 안된다.
24. 서울에서 김서방찾기
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
24-1. enumerate 사용
def solution(seoul):
for index, str in enumerate(seoul):
if str=='Kim':
return f"김서방은 {index}에 있다."
enumerate는 인덱스와 값을 동시에 반환한다.
값이 kim과 일치하는 것의 인덱스를 찾으면 된다.
24-2. 김서방을 찾는 더 간단한 방법 .index()
def solution(seoul):
location=seoul.index('Kim')
return f"김서방은 {location}에 있다."
.index()는 리스트 내부 특정값의 인덱스를 반환한다.
이 때 어떤 값이 리스트에 중복으로 나와도 가장 처음 나온 인덱스만 반환하며, 값이 없으면 에러가 생긴다.
25. 나누어 떨어지는 숫자
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
def solution(arr,divisor):
answer=[num for num in arr if num%divisor==0]
if not answer: answer.append(-1)
return sorted(answer)
여기서 주목할 것은 if not answer: 이 부분
파이썬 문법은 조건문에서 리스트가 비어있으면 false로 반환한다.
list1=[]
list2=[1,2,3]
def isempty():
if list: return "list is not empty"
else: return "list is empty"
이 때 비어있지 않은 리스트는 true가 되어 if문이 작동하고, 빈 리스트이면 false가 되어 else문이 작동한다.
다시 원래 코드로 돌아와서 if not answer: 이 구문은 answer가 빈 리스트(False)일때 if not을 붙여 True로 만들고 append를 실행시키고 있다.
'파이썬' 카테고리의 다른 글
CodeKata-3 (2) | 2024.11.21 |
---|---|
CodeKata-2 (2) | 2024.11.15 |
WIL(2주차) (1) | 2024.10.11 |
random, dataframe (인사이드아웃, 흑백요리사) (2) | 2024.10.11 |
관서별 5대범죄 (파이썬 라이브러리) (2) | 2024.10.10 |