알고리즘 2일차(코드카타)

문제 : 버블 배열 숫자를 뒤집어서 출력하기

접근 :

  1. 숫자를 리스트 형태로 만들고 잠시 str 처리해준다. 왜냐면 숫자 자체를 그대로 뒤집을 수 없고 몇 자리가 올 지 몰라 10으로 나눠주기도 애매하기 때문.

1. 숫자를 뒤집는다 :

  • revese 이용 : 가능은 하지만 버블 배열에 위배 되므로 실패

  • for loop : 1번만 해서는 숫자 갯수에 따라 모든 수가 배열이 되지 않는다. (회전되지 않는다.)

  • for loop 2회 반복 : 별그리기와 같이 가로 세로를 함께 루프하여 조건을 갖춘다. 일단 여기까지 숫자가 뒤집힌다.

  • 숫자 뒤집는 방법 : a, b = b, a -> 이 방법이 버블 방법의 핵심.

2. 그러면 그 인덱스의 범위는 ? :

  • 만일 시작을 인덱스 0값부터 주고 바로 시작했다면?(실제로 그랬음) ->
    바뀐 숫자가 계속 바뀌므로 다음과 같이 됨
    1 2 3 4 -> 2 3 4 1(왜 1만???)

그래서 시작을 len값 인덱스-1, 끝을 0, 그리고 하나 씩 줄어야 하므로 공차는 -1로 해준다.

3. 그래서 리턴 값은?

  • 리턴은 join을 이용한다. 맵 형태로 먼저 문자를 맵객체로 묶어준 뒤 조인을 통해 빈칸 없이 다시 엮어준다. 이후 int로 감싸주어 숫자로 만들어준다.

4. 여기서 발생한 문제 : 그렇다면 음수는...??

  • 정수는 음수 0 양수로 나눠진다. 따라서 음수도 또한 이 규칙을 벗어나면 안 되는데 음수는 바로 str로 바꿀 수 없다. 따라서 abs 를 사용해준다.

  • 그러면 abs 된 값은 양의 정수가 되어서 결과도 양의 정수가 되는데?
    -> 이를 방지하고자 이 원리를 쓴다.
    파이썬은 정말 고맙게도 -만 붙여주면 음수가 된다. 따라서 리턴 값에 -를 붙여주어 바꿔준다.

5. 그럼 리턴의 위치는?

UnboundLocalError: local variable 'new_number' referenced before assignment

모든 값이 완성되고 난 에러다. 즉 내가 만든 변수가 함수 밖에 변수를 사용하려 할 때란 뜻이다. 나는 다행히 전역변수를 만든 적이 없으므로 인덴트값을 잘 지정해준다.

6. 결과

def reverse(number):
  if number < 0:
    minus_number = abs(number)
    new_number = list(map(int, str(minus_number)))
    for i in range(len(new_number)-1, 0 , -1):
      for j in range(i):
        if j < j+1:
          new_number[j], new_number[j+1] = new_number[j+1], new_number[j]
    return -(int("".join(map(str, new_number))))

  if number>=0:
    new_number = list(map(int, str(number)))
    for i in range(len(new_number)-1, 0 , -1):
      for j in range(i):
        if j < j+1:
          new_number[j], new_number[j+1] = new_number[j+1], new_number[j]
   
    return int("".join(map(str, new_number)))
  
print(reverse(-1234))

Pass.

7. 새로 배운 것

  • 숫자열 리버스하는 새로운 로직 : 버블
  • abs
  • map 객체로 숫자를 리스트화 시키기
  • join으로 리스트를 문자화 시키기 + int로 그 문자 숫자로 만들기

8. (21.4.30) 획기적으로 줄인 코드

def reverse(number):
  if number < 0:
    new_number = str(number).strip('-')
    return (-int(new_number[::-1]))
  if number >=0:
    new_number = str(number)
    return int(new_number[::-1])

print(reverse(1234))

단순히 0보다 크냐 안 크냐, 정수를 텍스트로 만들 수 있냐 없냐, -를 쓸 수 있냐 없냐만 얼아도 충분히 풀 수 있었다. 약 두 달 전보다 많이 성장했다.

참고 블로그

버블
join
전역변수

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글