Algorithm | Week 1 - Day 2 : - 와 0을 고려한 reverse

happy tiger·2022년 7월 5일
0

Algorithm

목록 보기
1/4
post-thumbnail

오늘은 위코드 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

생각의 발전

  1. 숫자를 뒤집자 ➣ iterable해야 하나씩 빼서 뒤집는 것이 가능하다! list로 바꾸자! ➣ 숫자를 붙여 int로 형변환하려면 list는 join을 적용한 후 int를 적용해야 한다. 하지만, str은 합치는 과정 없이 바로 int 적용이 가능하다. ➣ str으로 바꾸어 사용하자!
  2. -로 시작하면, 리턴값도 -로 시작해야 한다 ➣ - 로 시작할 때 인덱스로 -를 분리하고 숫자를 reverse하자. 그 후 - 붙이기 ➣ str으로 사용하므로 + 연산자 사용해서 손쉽게 붙이자!
  3. 리턴값이 0으로 시작하면, 0을 어떻게 처리하자(?) ➣ 0으로 끝나면 0을 그냥 삭제하자
    (이렇게 하면 number = 0 일 때 빈 int를 return) ➣ reverse되어 0으로 시작되는 return값은 int 적용시 0은 자동적으로 사라진다.(int('0123) -> 123) 그러므로, 0을 삭제할 필요가 없다..!!!

최종 풀이

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])

+a) 깨달은 것들

  1. list()for문에 사용하기 위해선 iterable해야한다. 즉, 반복이 가능한 객체(list, tuple, set, dict, str)이어야 한다.
    여기서 실수하기 쉬운 부분!(내가 실수한 부분..😂)
    str(문자열)은 반복 가능한 객체가 맞지만, int나 float 등의 숫자 자료형은 반복 가능한 객체가 아니라는 것이다.
  2. reversed와 reverse의 차이점을 다시 한 번 알았다!
    reversed(list1)는 실제 리스트의 값은 변하지 않고, 역순으로 만든 리스트 객체를 반환한다.
    print(reversed(list1))를 하면 객체 자체를 반환하므로, list형태의 반환을 원한다면 print(list(reversed(list1)))으로 해야한다.
    list1.reverse는 실제 리스트를 역순으로 뒤집어 주고, 리턴값은 없다. 그러므로 역순으로 바뀐 list를 출력하려면 그냥 print(list1)을 하면 된다.
profile
호기심·끈기·성장·발전·행복·협력 ٩(๑•̀ㅂ•́)و

0개의 댓글