일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 타임어택
- 리트코드
- SQL 고득점 Kit
- 2주 프로젝트
- 자바스크립트
- 코어 자바스크립트
- 리덕스
- 알고리즘
- 타입스크립트 올인원
- 제로초
- 렛츠기릿 자바스크립트
- 회고
- 손에 익히며 배우는 네트워크 첫걸음
- 정재남
- python
- 타입스크립트
- 4주 프로젝트
- 파이썬
- 백준
- LeetCode
- 프로그래머스
- codestates
- 리액트
- js
- 코드스테이츠
- programmers
- 토익
- Async
- javascript
- til
- Today
- Total
Jerry
[leetcode][파이썬]Palindrome Number #002 본문
https://leetcode.com/problems/palindrome-number/description/
팰린드롬이란, 간단히 말하면 거꾸로 읽어도 원래대로 읽는 것과 같은 문자열을 의미한다.
풀이#1 - 자릿수 파악 + loop 판별
class Solution:
def isPalindrome(self, x: int) -> bool:
isMinus = False
if (x < 0):
isMinus = True
arr = []
temp = x
digit = 0
if x < 0: return False
while temp > 0:
arr.append(temp % 10)
temp //= 10
digit += 1
if digit <= 1: return True
if isMinus: arr[0] *= -1
for i in range(0, len(arr)):
if arr[i] != arr[len(arr) - i - 1]: return False
return True
처음 위 문제를 풀어냈을 때 코드이다.
1. 주어진 수가 음수인지 판별
2. 음수 일 경우, False 반환
3. 그렇지 않을 경우, loop문으로 주어진 수의 자릿수(digit) 파악 및 각 자릿수를 배열에 추가
4. 만약, 자릿수(digit)가 1자리 이하일 경우 True 반환
5. 만약, 음수일 경우 분별을 위하여 배열 첫번째 요소에 -1를 곱함
6. 마지막으로, 각 자릿수를 담은 배열을 순환하여 양 옆 수들을 비교해줌
풀긴 풀었는데, 장황해보여 여러모로 고칠 부분이 있어 보였다.
풀이#1 코드 정리
class Solution:
def isPalindrome(self, x: int) -> bool:
isMinus = False
if (x < 0):
isMinus = True
return False
arr = []
digit = 0
while x > 0:
arr.append(x % 10)
x //= 10
digit += 1
if digit <= 1: return True
for i in range(len(arr)):
if arr[i] != arr[len(arr) - i - 1]: return False
return True
나름 불필요한 코드들을 제거 했지만, 로직 자체 문제인지 여전히 장황해보였다.
풀이#2 - 주어진 수 뒤집어 판별
class Solution:
def isPalindrome(self, x: int) -> bool:
if (x < 0 or (x % 10 == 0 and x != 0)): return False
revertedNum = 0
while x > revertedNum:
revertedNum = revertedNum * 10 + (x % 10);
x //= 10
return x == revertedNum or x == revertedNum // 10
정답으로 제시된 코드이다.
1. 주어진 수(x)가 0 미만 또는 마지막 자리가 0인데 x가 0이 아닌 경우, False 반환
- 숫자 x가 0이 아니면서 마지막 자리가 0인 경우 팰린드롬이 될 수 없음
ex) 10의 경우 x % 10 == 0 조건은 통과하지만 x != 0 조건은 통과 못 함
- 즉, 이 조건은 0에 국한되는 조건임을 알 수 있다. 다른 어떤 숫자도 마지막 자리가 0이면서 팰린드롬이 될 수 없다.
2. 루프에서, 주어진 수 x의 절반을 뒤집어서 revertedNum에 저장
3. 주어진 수 x와 revertedNum가 동일한지 판별
- revertedNum가 홀수인 경우, 가운데 숫자 버리기 위해 10으로 나눔
풀이#3 - string으로 형변환
class Solution:
def isPalindrome(self, x: int) -> bool:
return str(x) == str(x)[::-1]
1. string으로 형변환한 x와 문자열 뒤집기은 x를 비교
- str(x)[::-1]은 슬라이싱 기법을 사용해, 문자열을 -1 스텝으로 문자열 끝(end)에서 시작(start)까지 역순으로 문자를 가져옴
알게 된 점
이번 문제를 통해 문자열 또는 숫자를 뒤집는 방법을 2개를 알 수 있었다.
주어진 경우가 숫자일 경우, 문자열일 경우 둘다.
풀이#2의 뒤집기 부분은 어느정도 이해했다고 하지만 100% 습득은 아닌 거 같다.
앞으로도 익숙해질 때까지 풀어봐야겠다.
# 풀이 2의 뒤집기 부분
revertedNum = 0
while x > revertedNum:
revertedNum = revertedNum * 10 + (x % 10);
x //= 10
'Problem Solving > Algorithm 문제 풀기' 카테고리의 다른 글
[leetcode][파이썬]Longest Common Prefix #004 (0) | 2024.05.21 |
---|---|
[leetcode][파이썬]Roman to Integer #003 (0) | 2024.05.20 |
[leetcode] [파이썬]Two Sum #001 (0) | 2024.05.18 |
[day23][leetcode] 151. Reverse Words in a String (0) | 2024.03.07 |
[day23][leetcode] 557. Reverse Words in a String III (0) | 2024.03.07 |