2월 15, 2022

[CodeKata] reverse 함수

 

문제 


풀이 1.

1
2
3
4
5
6
7
8
def reverse(number):
  # 여기에 코드를 작성해주세요.
  if int(number) > 0:
    numbers = str(number)[::-1]
    return int(numbers)
  elif int(number) <= 0:
    numbers2 = str(-1*number)[::-1]
    return int(numbers2) * -1

int object is not subscriptable.

number[::-1]

이런식으로 작성하니 수도 없이 나왔던 에러다.

subscriptable이란, 기본적으로 객체에 __getitem__() 메소드가 있다는 뜻이다. 다른 말로, 객체가 'container'이기에 다른 object들을 contain(담을) 수 있다는 것이다. string, list , tuple, dicitonaries가 subscriptable 한 아이들이다. 

container이기에 object들을 하나하나 '담기' 때문에, 각 인자들의 인덱싱이 가능하다. 고 직관적으로도 이해했다.

__getitem__() 이 아이는 누구인가. 클래스에 사용될 때, __getitem__() 은 클래스의 instance(객체)들이 [](인덱스 오퍼레이터) 를 사용할 수 있게해준다.

즉 x가 이러한 클래스의 인스턴스일때, x[i] = type(x).__getitem__(x,i) 와 같은 것이다 


'foobar'[3] 이렇게 n 번째 값을 꺼내올 수 있다는 것이다. 

int는 subscriptable하지 않다. 그러니깐 저 에러가 나왔던 것이다.

[::-1] : 이 친구는 슬라이싱이다. [첫번째 값:마지막 값(포함 안됨): step(단계)] 이다. -1은 거꾸로 된 순서로 단계를 지정한 것이다


풀이 2.

1
2
3
4
5
6
7
8
def reverse(number):
  # 여기에 코드를 작성해주세요.
  if int(number) > 0:
    numbers = str(number)[::-1]
    return int(numbers)
  elif int(number) <= 0:
    numbers2 = str(number).replace('-','')
    return int(numbers2[::-1]) * -1

음수인 number를 str로 바꾸고, -부호를 빼준다. 이를 슬라이싱으로 뒤집어주고, -1을 곱해서 음수로 돌려놓는다. 위의 풀이는 -1을 곱해서 양수로 바꿔줬다면, 이 풀이는 문자열로 바꾼 이후, - 기호를 빼놓고 뒤집은 후 나중에 음수로 만들어 준 경우이다.