
오늘은 위코드 3주차!!
어제(월)요일부터 코드카타가 시작했다.
Django를 하면서 Replit처럼 알고리즘 문제가 그리웠었는데, 때마침 시작한 코드카타..!😙
첫 날(Week1-Day1)문제는 비교적 쉬운 편이라, 포스팅을 하지 않았지만
오늘의 코드카타는 다양한 깨달음을 주었기에 기억하고자 포스팅하려한다.
reverse 함수에 정수인 숫자를 인자로 받습니다.
그 숫자를 뒤집어서 return해주세요.
x: 숫자
return: 뒤집어진 숫자를 반환!
예들 들어,x: 1234 return: 4321 -------------------- x: -1234 return: -4321 -------------------- x: 1230 return: 321
코드카타 짝인 정훈님과 효율적인 코드를 위해 계속 시도하였고 두 가지 풀이를 성공하였다.
그리고 마지막으로, 다른 동기분들의 풀이를 참고하여 가장 효율적인 풀이를 찾아 시도해보았다.
극 비효율에서 시작하여 극 효율로 가는 생각의 흐름을 살펴보자!
우리가 처음에 집중했던 것은 세가지였다.
1. 숫자를 뒤집자 ➣ iterable해야 하나씩 빼서 뒤집는 것이 가능하다! list로 바꾸자!
2. -로 시작하면, 리턴값도 -로 시작해야 한다 ➣ - 로 시작할 때 인덱스로 -를 분리하고 숫자를 reverse하자. 그 후 - 붙이기.
3. 리턴값이 0으로 시작하면, 0을 어떻게 처리하자(?) ➣ 0으로 끝나면 0을 그냥 삭제하자
(이렇게 하면 number = 0 일 때 빈 int를 return)
def reverse(number):
if number == 0:
return 0
# reverse, 첫 시작이 - 인지 모두 고려해야하므로
# iterable하게 number를 바꾸어야 함. -> list 사용
list1 = [num for num in str(number)]
if list1[0] == '-' and list1[-1] == '0':
list_rev = list(reversed(list1[1:-1])) # -와 0을 제외하고 숫자 reverse
list_rev.insert(0,'-') # - 붙이기
elif list1[-1] == '0':
list_rev = list(reversed(list1[:-1]))
elif list1[0] == '-':
list_rev = list(reversed(list1[1:]))
list_rev.insert(0,'-') # - 붙이기
else:
list_rev = list(reversed(list[:]))
# list를 join으로 붙여 int로 형변환
mynum = int(''.join(list_rev))
return mynum
def reverse(number):
# list를 int로 만드려면 join, int 함수 모두 필요
# str은 바로 int로 형변환 가능 -> str 사용
st_num = str(number)
if st_num[0] == '-':
return int('-' + st_num[1:][::-1])
else:
return int(st_num[::-1])
list()나 for문에 사용하기 위해선 iterable해야한다. 즉, 반복이 가능한 객체(list, tuple, set, dict, str)이어야 한다.reversed(list1)는 실제 리스트의 값은 변하지 않고, 역순으로 만든 리스트 객체를 반환한다.print(reversed(list1))를 하면 객체 자체를 반환하므로, list형태의 반환을 원한다면 print(list(reversed(list1)))으로 해야한다.list1.reverse는 실제 리스트를 역순으로 뒤집어 주고, 리턴값은 없다. 그러므로 역순으로 바뀐 list를 출력하려면 그냥 print(list1)을 하면 된다.