알고리즘_1week(1)

xlxlshinee·2021년 3월 8일
0

1일차 시작

오늘부터 1일차. 하루하루 한 단원 끝낼 예정이다. 이곳에 필기 겸 출석 체크할 생각이다. 꾸준히.. 해보자!!

6장 문자열 조작

문자열 조작은 코딩테스트에서 매우 빈번히 출제되는 주제다. 언어의 기본 기능을 잘 활용하면 쉽게 풀 수 있다.

1. 유효한 팰린드롬

: 전제조건 - 대소문자를 구분하지 않으며 영문자와 숫자만을 대상으로 한다.
답안

def isPalindrome():
    s = list(input())
    strs = []
    for char in s:
        if char.isalnum(): # isalnum() 빌트인 함수로 영문자, 숫자 판별. 해당하는 문자만 추가.
            strs.append(char.lower()) # 소문자로 변환.

    while len(strs) > 1:
        if strs.pop(0) != strs.pop():
            return False
    return True
        
            
isPalindrome()

처음 답안을 보지 않고 풀었을 때는 이렇게 풀었다.

첫트_나의오답안

def isPalindrome():
    s = list(input())
    S = s.reverse()
    for i in range(len(s)):
        if S[i] == s[i]:
            return true
        else:
            return false
            
isPalindrome()

이건 멍청이 같은 답이다.
내 머리에선 이렇게 생각했다. 일단 input 값을 s로 받고 정렬을 reverse하여 for문을 돌려 전수 조사해 같지 않을 때는 False, 같을 때는 True로 출력하는 것이다. 하지만 여기서 잘못된 점은 reverse에서 오류가 뜨는 것이었다.
reverse 할 때 list로 묶어주고 S = list(reversed(s))로 고쳐야 반대 정렬이 이루어졌다.
일단 문제의 전제 조건도 무시했다. 대소문자를 구분하지 않고 영문자와 숫자만을 대상으로 하기 때문에 여기서는 무작정 다 리스트에 때려넣었다.
그 결과,

"A man, a plan, a canal: Panama"
s = ['"', 'A', ' ', 'm', 'a', 'n', ',', ' ', 'a', ' ', 'p', 'l', 'a', 'n', ',', ' ', 'a', ' ', 'c', 'a', 'n', 'a', 'l', ':', ' ', 'P', 'a', 'n', 'a', 'm', 'a', '"']

S = ['"', 'a', 'm', 'a', 'n', 'a', 'P', ' ', ':', 'l', 'a', 'n', 'a', 'c', ' ', 'a', ' ', ',', 'n', 'a', 'l', 'p', ' ', 'a', ' ', ',', 'n', 'a', 'm', ' ', 'A', '"']

여기서 기호를 빼고 소문자 통일로 만들면 어느 정도 풀 수 있을 것 같아 고쳐 보았다.

나의오답안수습한_답안

def isPalindrome():
    s = list(input())
    strs = []
    for char in s:
        if char.isalnum(): 
            strs.append(char.lower()) 
    S = list(reversed(strs))
    for i in range(len(strs)):
        if S[i] != strs[i]:
            return False
        
    return True
        
    
isPalindrome()

짜릿하다. 성공이당. 역시 나는 for문 처돌이.. 시간복잡도는 어떻게 될지 모르겠지만 맞긴 맞았다. 틀리게 생각하진 않았다! 근데 한 문제를 이렇게 분석해서 하는 것도 공부가 되는 것 맞겠지? 어쨌든 정리하면서 하니 잘 되고 있는 것 같다.

더 효율적인 답안

import re
def ispalindrome():
    s = input()
    s = s.lower()
    s = re.sub('[^a-z0-9]', '', s)
    
    return s == s[::-1]
ispalindrome()

정규표현식을 사용했고 슬라이싱을 통해 불필요한 문자를 필터링했다.
앞의 답안보다 2배 더 속도를 높일 수 있다.

이번 문제에서 기억해야 할 빌트인 함수!

  • isalnum()
    : 영문자와 숫자를 판별하는 함수.
  • lower()
    : 소문자로 변환.

2. 문자열 뒤집기

: 전제 조건 - 입력값은 문자 배열이며, 리턴 없이 리스트 내부를 직접 조작하라.

첫트_나의답안

def reverse_string():
    s = list(input())
    S = list(reversed(s))
    
    print(S)
reverse_string() 

요건 쉽지. 방금 한 것 써먹기. 그래도 이것보다 효율적인 방법이 또 있겠지...?
근데 다를 바가 없다. 그냥 정답이라 생각할까보다.

3. 로그 파일 재정렬

: 전제 조건

  1. 로그의 가장 앞 부분은 식별자.
  2. 문자로 구성된 로그가 숫자 로그보다 앞.
  3. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 경우 식별자 순으로.
  4. 숫자 로그는 입력 순서대로.

이 문제는 이해가 안되는데요... 흠...
1시간 들여다 봤는데 잘 모르겠어서 다음 문제로 넘어간 다음에 다시 와서 풀겠음..

4. 가장 흔한 단어

: 전제 조건
금지된 단어를 제외한 가장 흔히 등장하는 단어를 출력. 대소문자 구분 X, 구두점(마침표, 쉼표 등) 무시.

나의첫트답안

profile
늦더라도 차근 차근 앞으로 걷기

0개의 댓글