1. 유효한 펠린드롬

  • 나의 문제풀이
def isPalindrome(a):
    a = a.lower()
    b = []
    for i in range(len(a)):
        if a[i].isalnum():
            b.append(a[i])

    c = b[::-1]

    if b == c:
        print("true")
    else:
        print("false")


isPalindrome("race a car")
  • 데크 자료형을 이용한 최적화.
  • deque를 명시적으로 선언하면 속도를 더 높일 수 있다.
from typing import Deque


def isPalindrome(s):
    # 자료형 데크로 선언
    strs: Deque = collections.deque()

    for char in s:
        if char.isalnum():
            strs.append(char.lower())

    # 프로그램의 성능을 위해 하나씩 검수하여 false가 나오는 경우의 성능을 높이자.
    while len(strs) > 1:
        if strs.popleft() != strs.pop():
            print("false")
            return False

    print("true")

isPalindrome("A man, a plan, a canal: Panama")
  • 슬라이싱 사용 (best👍)
import re
def isPalindrome(s):
    s = s.lower()
    # 정규식으로 불필요한 문자 필터링
    s = re.sub('[^a-z0-9]', '', s)

    if s == s[::-1]:
        print("true")
    else:
        print("false")
isPalindrome("A man, a plan, a canal: Panama")

2. 문자열 뒤집기

  • 나의 문제 풀이
def reverseString(s):
    reverse_s = s[::-1]
    print(reverse_s)

s = ["h", "e", "l", "l", "o"]
reverseString(s)
  • 투 포인터를 활용한 swap
def reverseString(s):
    left, right = 0, len(s) - 1
    while left < right:
        s[left], s[right] = s[right], s[left]
        left += 1
        right -= 1

    print(s)
s = ["h", "e", "l", "l", "o"]
  • 파이썬다운 방식 (best👍)
def reverseString(s):
    s.reverse()
    print(s)
s = ["h", "e", "l", "l", "o"]
reverseString(s)

3. 가장 흔한 단어

  • 하나의 풀이
  • 정규화, collections.Counter를 활용해 빈도수 저장.
import re

def mostCommonWord(s, banned):
    words = [word for word in re.sub(r'[^\w]', ' ', s) # 정규식에서 w는 단어 문자를 뜻하며, ^은 not을 의미. 따라서 단어 문자가 아닌 모든 문자를 공백으로 치환.
             .lower().split() # 기호들을 지웠고, 문자를 소문자로 통일하고 split으로 나누어 저장.
                if word not in banned] # 리스트 조건절에는 banned에 포함되지 않은 단어만을 words에 저장.

    counts = collections.Counter(words) # counter를 통해 각 단어의 빈도수를 저장한다.
    # 위 counts 결과: Counter({'ball': 2, 'bob': 1, 'a': 1, 'the': 1, 'flew': 1, 'far': 1, 'after': 1, 'it': 1, 'was': 1})
    print(counts.most_common(1)[0][0]) # 가장 흔히 등장하는 단어 첫 번쨰 값을 most_common(1)로 추출, 이는 [('ball', 2)]로 출력, [0][0]을 붙여 ball만 나오게 한다.


s = "Bob hit a ball, the hit BALL flew far after it was hit."
banned = ['hit']
mostCommonWord(s, banned)

4. 그룹 애너그램

  • 하나의 풀이
  • collections 라이브러리 불러와 defaultdict 활용.
import collections

def groupAnagram(s):
    anagrams = collections.defaultdict(list) # 존재하지 않는 키를 삽입하려할 경우 keyerror가 발생하므로 에러가 나지 않도록 다음과 같이 항상 디폴트를 생성하는 defaultdict() 선언.

    for word in s:
        anagrams[''.join(sorted(word))].append(word) # 문자열을 잘 정렬하여 결과를 리스트 형태로 리턴, join으로 합쳐 키로 사용하는 딕셔너리로 구성, 에너그램끼리는 같은 키를 갖게 되고 여기에 append하는 형태가 된다.
        #키/값 해시 테이블


    print(anagrams.values())

s = ["eat", "tea", "tan", "ate", "nat", "bat"]
groupAnagram(s)
profile
늦더라도 차근 차근 앞으로 걷기

0개의 댓글