[문제와 사고과정]
문제
reverse 함수에 정수인 숫자를 인자로 받습니다.
그 숫자를 뒤집어서 return해주세요.
x: 숫자
return: 뒤집어진 숫자를 반환!예들 들어,
x: 1234
return: 4321x: -1234
return: -4321x: 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가지 이다.
- 양의 정수 일 때,
- 음의 정수일 때,
- 끝자리가 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 |