오늘은 위코드 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)
을 하면 된다.