1. Reverse String
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s.reverse()
in-place라 reverse()를 사용했지만, slicing(s[:] = s[::-1])이 조금 더 빠르다.
2. Reverse Integer
class Solution:
def reverse(self, x: int) -> int:
if x == 0:
return 0
result = int(str(abs(x))[::-1])
# 32-bit 정수 범위를 넘은 경우 0으로 처리
if result<-2**31 or result>2**31-1:
return 0
# x가 양수면 result도 양수
if x>0:
return result
# x가 음수면 result도 음수
return -1 * result
3. First Unnique Character in a String
class Solution:
def firstUniqChar(self, s: str) -> int:
count = collections.defaultdict(list)
for idx in range(len(s)):
count[s[idx]].append(idx)
for char in s:
if len(count[char]) == 1:
return count[char][0]
return -1
collections.defaultdict(list)를 선언하면 딕셔너리의 기본 값이 empty list가 된다. 즉 바로 append()를 사용할 수 있다.
첫번째 for문은 defaultdict인 count에 s(aka string)의 모든c(aka character)가 어떤 index에 위치해있는지 추가해주는 용도고, 두번째 for문은 s의 원소가 1번 쓰였으면(unique) 답을 return해주는 용도다.
unique character가 없다면 -1을 리턴해준다.
4. Valid Anagram
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return sorted(s) == sorted(t)
Anagram의 정의를 생각하면 쉽게 풀 수 있는 문제다.
같은 원소로 이루어져있으면 anagram이 맞고, 다르면 아니다.
5. Valid Palindrome
class Solution:
def isPalindrome(self, s: str) -> bool:
target = re.sub('[^a-z0-9]', '', s.lower())
return target == target[::-1]
Palindrome은 'aba', 'uuupppuuu'와 같이 앞에서 읽어도, 뒤에서 읽어도 같은 문자열을 말한다.
알파벳 대분자는 소문자로 고려하고, 알파벳 소문자와 숫자(alphanumeric)를 빼고는 없는 것으로 치기때문에 re.sub를 사용해서 조건에 맞게 문자열을 변경해줬다.
그 후 앞뒤로 같은지 비교하기 위해 [::-1]을 사용해서 문자열을 거꾸로 뒤집어줬다.
6. String to Integer (atoi)
class Solution:
def myAtoi(self, s: str) -> int:
s=s.strip()
result = ''
for char in s:
if not result:
if char.isdigit() or char in ['+', '-']:
result=char
else:
break
else:
if char.isdigit():
result+=char
else:
break
# result가 ''거나 '+' 또는 '-'일 경우 0을 return해준다.
# '+' 또는 '-'인 경우의 예시 -> 문자열 입력 s = '+-12'
if not result or result in ['+', '-']:
return 0
# int(result)가아니라 int(float(result))를 한 이유는 아래 이미지 참고
result = int(float(result))
# 32-bit integer 범위를 넘어갈 경우
if result < -2**31:
return -2**31
if result > 2**31-1:
return 2**31-1
return result
7. Implement strStr()
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
try:
return haystack.index(needle)
except:
return -1
8. Count and Say
class Solution:
def countAndSay(self, n: int) -> str:
if n == 1:
return '1'
s = self.countAndSay(n-1)
result = ''
cnt, idx = 1, 1
while idx < len(s)+1:
if idx < len(s) and s[idx] == s[idx-1]:
cnt += 1
else:
result += str(cnt)+s[idx-1]
cnt = 1
idx += 1
return result
n의 결과는 n-1에 의존하므로 재귀를 사용했다.
9. Longest Common Prefix
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ''
answer = ''
flag = True
length = min(map(len, strs))
for idx in range(length):
elem = {str[idx] for str in strs}
if idx == 0 and len(elem) == 1:
answer = elem.pop()
elif len(elem) != 1:
flag = False
elif len(elem) == 1 and flag:
answer += elem.pop()
return answer
공통 접두사를 찾는 문제다.
strs의 원소 중 가장 길이가 가장 짧은 원소의 길이를 사용해서 문제를 풀었다.
'Algorithm > Python' 카테고리의 다른 글
[파이썬/백준 20056] 마법사 상어와 파이어볼 시뮬레이션 (0) | 2021.03.23 |
---|---|
[파이썬/백준 1697] 숨박꼭질 BFS (0) | 2021.03.21 |
[파이썬/백준 2178] 미로 탐색 BFS (0) | 2021.03.21 |
[LeetCode - Top Interview Questions(Easy, Python3)]Array (0) | 2021.03.14 |
[프로그래머스 LV2]이진 변환 반복, 영어 끝말잇기 (0) | 2021.03.09 |