낭만개발자
낭만개발 낭개
낭만개발자
전체 방문자
오늘
어제
  • 분류 전체보기 (55)
    • Web) HTML & CSS (5)
    • Web) HTTP (2)
    • 언어) Java (2)
    • 언어) Python (6)
    • 언어) PHP (1)
    • Linux (2)
    • 데이터 관리) Pandas (4)
    • Algorithms (13)
    • 개발자 역량 (4)
    • 프로젝트 (11)
      • Django 초기 프로젝트 (1)
      • CatCoDog _ 반려동물 식품 판매 사이트 (9)
      • MEGABOXU_메가박수 (0)
      • 개인 홈서버 프로젝트 (1)
    • 문제와 사고 (3)
    • ETC (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Leetcode
  • 파이썬 기초
  • django setting
  • 파이썬 기본
  • 리눅스
  • catcodog
  • css basic
  • Merge Sorted Array
  • Java
  • 장고 초기 세팅
  • css 포지션
  • Number Of Island
  • 파이썬 자료형
  • python
  • 파이썬 숫자형
  • python basic
  • leetcode88
  • WEB
  • algorithm
  • rainbow table
  • JWT 웹
  • python operator
  • dp
  • 오늘의 문제
  • css 위치변경
  • css
  • css 기본
  • Unique Paths
  • 파이썬
  • 웹개발

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
낭만개발자

낭만개발 낭개

[20220510] 주어진 정수 뒤집기
문제와 사고

[20220510] 주어진 정수 뒤집기

2022. 5. 14. 15:52
반응형

[문제와 사고과정]

​

​

문제

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

x: 숫자
return: 뒤집어진 숫자를 반환!

예들 들어,
x: 1234
return: 4321

x: -1234
return: -4321

x: 1230
return: 321

​

사고 과정 & 풀이

​
​
​
step1) slicing을 이용하여 양의 정수 뒤집기
​

문제에서는 음의 정수까지 교려하고 있지만, 전체적인 프레임을 위해 양의 정수를 뒤집는 함수를 작성해보았다.
​

문자열을 뒤집는 slicing 기법을 활용하면, 자료형 변환을 통해 쉽게 접근할 수 있었다.

​

def reverse(number):
    str_reverse = str(number)[::-1]
    return int(str_reverse)

​
정수형을 슬라이싱할 수는 없기에, 우선 정수형으로 주어진 number을 문자열형으로 형변환해준 후,
슬라이싱을 통해 주어진 숫자를 역순 정렬해주었다.​


위와 같이 성공적으로 출력되는 것을 볼 수 있다.
​


step2) 음의 정수일 때 고려
​
이제 문제에서 요구한대로 음의 정수일 때는 음의 기호를 제외한 나머지 숫자들을 역순 정렬해주어야 한다.
​
슬라이싱 기법을 이용해, 맨 처음으로 오는 음의 기호를 제외하고 나머지 숫자들을 제어해 주면 될 것 같았다.
​
우선, len함수를 이용하여 number의 자릿수를 파악한 후,
두번째 숫자부터 마지막 숫자까지를 역순으로 정렬하는 방향으로 접근해봤다.


(후에 조금 더 간단한 slicing 기법을 이용해 len함수를 쓰지 않아도 된다는 것을 깨달았다.)
​

def reverse(number):    
    k = len(str(number))     # number의 길이를 구해서 number가 몇자리 숫자인지 파악하기
    answer = str(number)[k:0:-1]     # number의 끝자리와 첫자리의 위칫값을 이용해 역순정렬하기!
    return -1 * int(answer)     # 역순정렬한 문자열을 정수형으로 바꾸어 -1을 곱한 후 출력!

​
슬라이싱을 하려면, 마지막 문자의 (후에 문자열로 형변환할 것이기에, '숫자'라는 워딩보다는 '문자'라는 워딩을 사용했다.) 위치값을 알아야하고, 


이는 결국 number의 총 길이를 알면 해결될 문제이기에,

 

요소의 길이를 구하는 len 함수를 이용하여 number의 마지막 문자의 위칫값을 구했다.

 

숫자형은 슬라이싱이 불가능하므로, 문자열형으로 형변환을 해준 후, number의 마지막 자리와 첫 자리의 위칫값을 이용하여 역순으로 정렬을 해주었다.

이를 다시 -1을 곱하여 출력을 해야 하므로, 문자열로 형변환한 number을 다시 정수형으로 형변환시켜주고, -1을 곱하여 출력하게 하였다.



그 결과, 의도대로 위처럼 잘 출력하는 것을 볼 수 있다.



step3) 조건문을 활용하여 문제의 요구 맞추기

문제에서 요구하는 조건의 경우의 수는 3가지 이다.


  1. 양의 정수 일 때,
  2. 음의 정수일 때,
  3. 끝자리가 0인 정수일 때.
    

이 중 1번, 2번은 앞서 해결하였고, 3번을 해결하려고 하던 찰나,
내가 작성한 함수의 최종 출력값은 '정수형'이라는 것이 떠올랐다.



다른 함수를 고려하지 않고, step 1에서 작성한 함수만으로도 이는 충분히 만족할 수 있는 조건이었다.
0으로 끝나는 문자열을 역순정렬하고, 정수형으로 형변환하였다면, 0으로 시작하는 정수가 되고, 이때의 0은 자동으로 생략되기에,,

따라서 최종적으로 조건문을 활용해서 다음과 같은 완성된 함수를 만들 수 있었다.


def reverse(number):
        if str(number)[0] == "-":   #첫번째 자리가 "-"일 때. 즉, 음수일 때
            k = len(str(number))     
            answer = str(number)[k:0:-1]
            return -1 * int(answer)
        else:                      #음수가 아닌 모든 경우
            answer = str(number)[::-1]
            return int(answer)




다른 풀이(슬라이싱  기법  활용)


첫 번째 풀이에서 음수인 경우를 구할 때, number의 총 길이를 구해서 몇자리 수인지 구하는 것 말고 다른 방법이 있을지 생각해보았다.

그런데 슬라이싱에서 시작 위치, 끝 위치를 나타내는 표현은 '공백'으로 나타낸다는 사실이 떠올랐다.

따라서, 굳이 len함수를 이용해서 총 길이를 구할 필요 없이, 다음과 같은 방법으로 함수를 만들 수 있었다.


def reverse(number):
  # 여기에 코드를 작성해주세요.
  if str(number)[0] == "-":
    answer = str(number)[:0:-1]   #슬라이싱 기법을 이용하여 맨 끝자리 위치를 자동으로 입력
    return -1 * int(answer)
  else: 
    answer = str(number)[::-1]
    return int(answer)



기본적인 슬라이싱의 활용이므로, 코드의 가독성 측면에서도 충분히 의미 전달력이 좋은 코드인 것 같다.

반응형
저작자표시

'문제와 사고' 카테고리의 다른 글

[프로그래머스] 달리기 경주(#java #HashMap #swap)  (0) 2023.05.03
[20220509] 더해서 특정 수가 나오는 index 배열  (0) 2022.05.09
    낭만개발자
    낭만개발자
    좋아하는 것들을 가까이 하자. 행복의 다른 이름이다.

    티스토리툴바