🗓️ 기간: 6/9 ~ 6/15 (4주차)
21. 하샤드 수 (6/9)
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요
def solution(x):
sm = 0
for i in str(x):
sm += int(i)
if x % sm == 0:
return True
else:
return False
for 문으로 x의 자릿수의 합을 구한 다음, if 문을 이용해 하샤드 수의 조건을 만족하면 True를 출력하는 코드를 만들었다. 아래처럼 더 간결하게 한 줄로도 표현 가능하다.
def solution(x):
return x % sum(map(int, str(x))) == 0
return 값으로 조건식 자체를 넣어 결과(True/False)를 반환하도록 반환하면 if문을 쓰지 않아도 된다. 또한, map( ) 함수를 이용해 문자열을 정수로 변환해 iterable 객체로 만든 다음 sum을 해주면 for 문을 사용하지 않고도 각 자릿수의 합을 구할 수 있다.
22. 두 정수 사이의 합 (6/10)
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
def solution(a, b):
if b >= a:
return sum(i for i in range(a,b+1))
else:
return sum(i for i in range(b,a+1))
def solution(a, b):
return sum(range(min(a,b), max(a,b)+1))
min,max 함수를 사용해 if를 안 쓰고도 코드를 더 간단하게 작성할 수 있었다. 다른 사람의 풀이를 보면서 더 간결하고 좋은 코드들을 배울 수 있어서 좋은 것 같다.
23. 콜라츠 추측 (6/11)
콜라츠 추측은 주어진 수가 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(num):
count = 0
while(num != 1):
if num % 2 == 0:
num /= 2
count += 1
else:
num = num * 3 + 1
count += 1
if count == 500:
return -1
return count
def solution(num):
for i in range(501):
if num == 1:
return i
num = num / 2 if num % 2 == 0 else num * 3 + 1
return -1
while문과 for문을 이용해서 각각 코드를 작성해봤다. while문이 작업 횟수를 count하는 게 직관적이긴한데, for문이 훨씬 간결한 것 같다.
24. 서울에서 김서방 찾기 (6/12)
String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.
def solution(seoul):
x = seoul.index('Kim')
return f'김서방은 {x}에 있다'
리스트의 index( ) 메서드를 사용해 "Kim" 값이 가장 먼저 등장하는 위치(인덱스)를 반환한다.
25. 나누어 떨어지는 숫자 배열 (6/13)
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
def solution(arr, divisor):
answer = sorted([ i for i in arr if i % divisor == 0])
return [-1] if len(answer)==0 else answer
26. 음양 더하기 (6/14)
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
def solution(absolutes, signs):
signs = [ 1 if i else -1 for i in signs]
answer = [ x * y for x,y in zip(absolutes, signs)]
return sum(answer)
signs의 불리언 값을 1, -1로 바꾼 다음, 리스트 요소끼리 곱하려고 했는데, TypeError: can't multiply sequence by non-int of type 'list' 오류가 떴다. 오류를 찾아보니 리스트끼리의 곱은 안 되고, 리스트나 문자열은 정수와만 곱할 수 있었다. 따라서 리스트 요소끼리 곱하고 싶은 경우에는 zip( )이라는 내장함수를 사용할 수 있었다. zip은 여러 개의 iterable을 동시에 하나씩 꺼내서 튜플로 묶은 iterator를 생성해준다.
def solution(absolutes, signs):
return sum(a if s else -a for a, s in zip(absolutes, signs))
signs 불리언 값을 1, -1로 굳이 바꾸지 않고 더 간결하게 만들 수도 있다.
27. 핸드폰 번호 가리기 (6/15)
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요. (phone_number는 길이 4 이상, 20이하인 문자열입니다.)
def solution(phone_number):
hide = phone_number[:-4]
num = phone_number[-4::]
answer = '*' * len(hide) + num
return answer
다 풀고 생각해보니 어차피 *의 개수만 알면 되니까 hide 변수를 따로 만들지 않고 그냥 전체 len(phone_number)에서 -4를 해준 값을 곱했어도 됐겠다.
'코드카타 > 알고리즘' 카테고리의 다른 글
[ 코드카타 ] 알고리즘 | 42~48번 (2) | 2025.07.07 |
---|---|
[ 코드카타 ] 알고리즘 | 35~41번 (0) | 2025.06.30 |
[ 코드카타 ] 알고리즘 | 28~34번 (0) | 2025.06.22 |
[ 코드카타 ] 알고리즘 | 14~20번 (0) | 2025.06.08 |
[ 코드카타 ] 알고리즘 | 7~13번 (0) | 2025.06.03 |