SQL & Python Study

[D+15][알고리즘 코드카타 #1] 제곱근 판별, 내림차순 배치, 하샤드 수, 정수 사이의 합, 콜라츠 추측 본문

✏️ STUDY etc./Code Kata

[D+15][알고리즘 코드카타 #1] 제곱근 판별, 내림차순 배치, 하샤드 수, 정수 사이의 합, 콜라츠 추측

김숮엉 2024. 5. 9. 00:21
✒️ Code Kata Index 

문제 1. 제곱근 판별 ★☆☆
문제 2. 내림차순 배치 난이도 ☆☆☆
문제 3. 하샤드 수 ☆☆☆
문제 4. 정수 사이의 합 ★☆☆
문제 5. 콜라츠 추측 ★★★

*별표는 오늘의 제가 느낀 주관적인 난이도 표시예요.  date 2024. 5. 8

문제 1. 정수 제곱근 판별

 

실패한 첫 번째 시도와 풀이과정  

  • for-if문 활용해서 x = n **2 값이 나올 때까지 반복하고 조건에 맞는 값을 반환, 없을 경우 -1을 반환하자! 
  • 위 논릐를 가진 코드는 테스트 풀이에서는 돌아갔으나, 실제 채점에서는 시간초과로 실패함.
  • 그리고 시간 초과가 아니더라도 정수 x 값이 나오지 않을 경우도 있을 것으로 보임.  

 

성공한 두번째 시도와 풀이과정 

  • 값을 찾을 때까지 반복하는 비효율적인 연산은 버리자. 
  • x라는 값을 n의 루트 값으로 먼저 지정해 주자! x = n ** 1/2
  • x 가 양의 정수라고 했으니, if를 통해 x가 정수(int)인 경우에 (x+1)**2  값을 반환하고, 아닌 경우 -1을 반환 
def solution(n):
    x = n ** (1/2) # x 값 지정하기 
    if x == int(x): # x 값이 양의 정수인지 판별하기 
        answer = (int(x) + 1) ** 2
    else: 
        answer = -1
    return answer

 


문제 2. 정수 내림차순으로 배치하기 

 

풀이과정

  • 정수 n을 str()으로 받아 각 자릿수를 담은 리스트를 만들자. *for문을 담은 리스트 컴프리헨션 사용
  • 리스트를 sort()로 정렬하고, reverse()로 역순으로 만들어주자. 
  • 마지막에는 각 자릿수가 아닌 새로운 정수를 리턴해야 함으로, .join()으로 값들을 붙여주기! 

더 디벨롭해볼 수 있는, 새롭게 깨달은 내용 

  • str(n) 자체를 바로 리스트로 받을 수 있다. list(str(n)) 이렇게 하면 리스트 컴프리헨션을 사용할 이유가 없었다...!! 
    최근에 복습한 내용이라 뽕에 차 있었나 ...? 전혀 생각하지 못했다. 다른 사람들의 풀이도 둘러보고 깨달았다.  
  • sort()와 reverse()를 사용하여 역순으로 정리했는데, 같이 사용할 수도 있었다! x.sort(reverse = True) 
def solution(n):
    n_list = [ x for x in str(n) ] # n_list = list(str(n)) 으로 해도 됨. 
    n_list.sort()
    n_list.reverse() # n_list.sort(reverse = True)로 한번에 쓸 수 있음! 
    answer = ''.join(n_list)
    return int(answer)

 


문제 3. 하샤드 수

 

풀이과정

  • 인수 x를 str()로 받아 각 자릿수를 하나씩 쪼개고, 쪼갠 수를 int()로 바꿔 합산한 값을 n으로 지정하자. 
    즉, x의 자릿수의 합을 n으로 지정하자. 
  • x 가 n으로 나누었을 때 나누어 떨어지는 값. 즉, 나머지가 0 일 때는 True를 반환, 아니면 False. 

더 디벨롭해볼 수 있는, 새롭게 깨달은 내용 

  • return은 조건에 부합할 경우 True, 부합하지 않을 경우 False를 반환하기 때문에 
    if를 사용하지 않고 return에 바로 값을 반환할 수 도 있었다. 
    나와 비슷하지만, 단 한 줄로 정리한 다른 사람의 코드를 발견!
    return x % sum(int(n) for n in str(x)) == 0  
def solution(x):
    n = sum(int(x) for x in str(x)) # x의 각 자릿값을 합산한 값 생성 
    answer = True if x % n == 0 else False # 하샤드 여부 판별
    return  answer

문제 4. 두 정수 사이의 합

 

풀이과정 + 문제가 발생했던 부분 해결과정  

  • 리스트 컴프리헨션을 사용해서 a와 b 사이 값을 담은 리스트를 만들고, 리스트의 sum 값을 반환하자! 
  • 신나게 한 줄로 작성했으나 a > b 보다 큰 경우 계산하지 못하고 null 값을 반환하는 문제 발생!
    if 문을 활용하여 a와 b의 대소 관계에 따라 range 범위를 달리 설정하여 리스트를 생성하여 해결!

더 디벨롭해볼 수 있는, 새롭게 깨달은 내용 

  • for문을 돌리지 않고, sum(range(a,b))로 값을 바로 계산할 수도 있었다... 
  • if a > b : a, b = b, a 로 비교하여 자리를 바꾸는 방법도 가능! 이를 통해 큰 값 혹은 작은 값을 먼저 오게끔 설정할 수 있다. 
def solution(a, b):
    if a > b:
        answer = [i for i in range(b, a+1)]
    else :
        answer = [i for i in range(a, b+1)]
    return sum(set(answer))

문제 5. 콜라츠 추측  - while 문 활용

↑개인적으로 너무 어려웠고, 헷갈렸던 문제 ... 자주 들여다보고 복습해 볼 것 같다. 

 

풀이과정

  •  처음엔 짝수인 경우, 홀수인 경우 각각 while 문을 작성했다. if  - while elif - while 이런 형식으로.
    반복문의 조건도 각각 설정해야 해서 각각의 변수를 또 만들고 설정했는데 while의 조건 자체가 잘못되어 계속 오류가 났다!!!!!!!!!! 계속 false가 되는 조건을 설정해 버림. while even == 1 그래서 조건문도 고쳐봤지만, 실행 시간 자체가 오래 걸려서 테스트도 돌아가지 않았다. 
  • 그래서 while 조건을 num != 1 이면 계속 반복하도록 설정하고,
    짝수와 홀수를 내부에서 판별하여 돌아갈 수 있게 작성했다. while - if 이런 구조로. 
  • count가 500번 이상 실행될 경우엔 -1을 반환해 주는 if 문도 while 문 안에 작성! 

코드 작성시 헷갈렸던 부분과 새롭게 깨달은 내용 

  • 똑같은 구문은 홀수, 짝수로 나눈 뒤에 반복시키는 것보다 (if - while, else - while) 반복문 안에서 판별하여 실행될 수 있도록 세팅하는 것이 훨씬 효율적이다. (while - if)
  • if 문을 들여 쓰지 않고 특정 상황에서의 값을 return 하는 방식으로 쓴다면, while 문을 중지하는 역할을 할 수 있다. 
    if count >= 500: return -1
  • // : 몫을 구하는 연산자
def solution(num):
    count = 0
    if num == 1: # 값이 1인 경우엔 0 값 반환
        return 0

    while num != 1: # num이 1이 될 때까지 반복, 조건이 true일 경우 계속 실행됨!! 
        if num % 2 == 0:  
            num //= 2 # 2로 나눈 몫을 num에 저장
        else: 
            num = num * 3 + 1 
        count += 1 # 반복문이 실행될때마다 카운트해야 함으로, if문 안에 들여쓰기 X 
        if count >= 500: # 500번 이상 반복될 경우 반복문을 중지하고 -1 값을 반환
            return -1

    return count