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
'✏️ STUDY etc. > Code Kata' 카테고리의 다른 글
[D+23][SQL 코드카타 #1] 입양 시각 구하기(2) - SET문 변수 설정, ROW_NUMBER() OVER() (5) | 2024.05.30 |
---|---|
[D+16][알고리즘 코드카타 #2] 서울에서 김서방 찾기, 나누어 떨어지는 숫자, 음양 더하기, 핸드폰 번호 가리기, 없는 숫자 더하기 (0) | 2024.05.09 |