codekata 2. 숫자 뒤집기

rahula·2021년 6월 22일
0

algorithm

목록 보기
2/9

reverse 함수에 정수인 숫자를 인자로 받습니다. 그 숫자를 뒤집어서 return해주세요.

문제 파악

요구사항 : 숫자의 순서를 뒤집어라.

제한사항 : 음수의 경우에는 뒤집어진 결과에서도 -가 맨 앞에 와야 한다. 또한 0이 맨 앞에 올 경우엔 0이 생략된다.

인풋 : 숫자

아웃풋 : 순서가 뒤집어진 숫자

반복문을 써야 하나?
0이 생략된다는 부분은 string 타입을 int타입으로 변환할 때 자동으로 해결.

내가 생각한 방식

  1. 우선 int타입에서는 순서를 바꾸는 방법을 모른다. 따라서 str함수를 이용해서 string으로 변환한다.
  2. range를 반대로 뒤집은 다음, 반복문을 실행한다.
  3. 빈 string변수에 차곡차곡 추가한다.
  4. 음수일 경우엔 맨 앞의 문자(-)를 맨 뒤로 붙인다.
  5. int함수로 앞에 붙는 0은 자동으로 해결된다.

첫번째 방법 : 반복문과 reversed함수

range 함수에 세번째 인자값으로 -1을 넣는 식으로 반대방향으로 할 수 있지만, 새로 배운 reversed함수를 써봤다.

문자열을 담을 변수(여기선 result)를 만들고, 반복문 안에서 순서대로 넣는다.

def reverse(number):
    if number < 0:
        str_num = str(number)[1:] + str(number)[0]
    else:
        str_num = str(number)
    result = ""
    for c in reversed(str_num):
        result += c
    return int(result) 

두번째 방법 : 슬라이싱

슬라이싱 기법을 생각 못했다. 음수의 경우에는 -기호를 전체 string에서 슬라이싱한 뒤, 마지막에 int함수의 결과값에 음수로 만들어줬다.

def reverse(number):
    sign = 1
    if number < 0:
        sign = -1
        number = number * -1
    result = int(str(number)[::-1]) * sign
    return result

세번째 방법 : 슬라이싱과 abs함수

두번째 방법과 비슷하지만, 절댓값을 내뱉는abs함수를 이용해서 음수든 양수든 똑같이 들어갈 수 있게 됐고, 조건문을 깔끔하게 만들었다.

def reverse(number):
    result = str(abs(number))[::-1]
    if number < 0:
        result * -1
    return result

네번째 방법 : 나머지 성질 이용

string타입으로 변환하지 않고도, 반복문과 연산자만을 이용해서 푸는 방법이 있었다. 숫자의 나머지 연산자(%)와 나눗셈 연산자(//)를 이용하는 것.

반복이 될 때마다 result에는 기존의 result에 10을 곱한 값, 즉 기존값을 한 자리 올려주고, number의 10 나머지를 더한다. 그렇게 되면 숫자안에서만 숫자들을 뒤집을 수 있다.

def reverse(number):
    sign = 0
    if number < 0:
        sign = -1
        number = number * -1
    else:
        sign = -1

    result = 0
    while number != 0:
        result = result * 10 + (number % 10)
        number = number // 10

    return result * sign

다섯번째 방법 : 나머지 성질과 abs함수

네번째 방법과 사실 같지만, 코드를 더 짧게 하려고 abs함수를 써봤다.

def reverse(number):
    result = 0
    abs_num = abs(number)
    while abs_num != 0:
        result = result * 10 + (abs_num % 10)
        abs_num = abs_num // 10
    if number < 0:
        result *= -1
    return result

생각과 질문

  1. 기존의 생각에 갇혀있었던 것 같다. 반복문을 무조건 하나 써야한다고 생각했다. 그래서 여러 사람들이 문제를 푸는 방식들을 귀담아 듣는게 중요하다. 접근방식.
  2. 파이썬의 내장함수들을 더 알아봐야겠다. reversedabs함수.
profile
백엔드 지망 대학생

0개의 댓글