코드카타/알고리즘

[ 코드카타 ] 알고리즘 | 21~27번

da-hong 2025. 6. 15. 21:02

🗓️ 기간: 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를 해준 값을 곱했어도 됐겠다.