ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 파이썬 문제 해결 전략 (2)
    내일배움캠프/Python 2024. 7. 10. 20:37

     

     

    어제 오늘 파이썬 코딩 문제만 50문제 넘게 풀었습니다.

    분명 lv.0인데도 생각보다 배울점이 많았습니다.

     

     

     


     

     

     대소문자 판별하기

     

    isupper(): 알파벳이 대문자면 True를 출력합니다.

    islower(): 알파벳이 소문자면 True를 출력합니다.

     

    의 문법을 가지고 있습니다.

     

    특징

     

    1. 문자열에 숫자, 기호 그리고 공백이 있어도 판별해줍니다.

    2. 괄호 안에 어떤 인수도 넣으면 안됩니다.

     

    https://www.geeksforgeeks.org/isupper-islower-lower-upper-python-applications/

     

    isupper(), islower(), lower(), upper() in Python and their applications - GeeksforGeeks

    A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

    www.geeksforgeeks.org

     

     

    위 글을 참고했습니다.

     

     

    이중 for문을 레전드급으로 잘 사용함

     

     return [i for i in arr for j in range(i)]

     

    이 코드는 arr에 있는 i가 i번 반복해서 리스트에 추가하는 리스트 컴프리헨션입니다.

    전혀 생각지도 못했던 방법이라 가져왔습니다..

     

     

    짝수/홀수 항마다 조건을 걸어주기

     

    def solution(arr, n):
        N=len(arr)
        if N%2:
            for i in range(0,N,2): arr[i]+=n
        else:
            for i in range(1,N,2): arr[i]+=n
        return arr

     

    반복 가능한 객체의 길이 짝수와 홀수일 때의 경우로 나눠줍니다.

    그 다음에 range의 시작점과 스텝을 조정해줘서

    객체의 길이가 짝수일 때는 짝수 항만 더해주고

    홀수일 때는 홀수 항만 더해줬습니다.

     

    저도 이 방법을 시도했었으나 오류가 발생하여

    더 복잡한 식으로 풀게 되었습니다..

     

    무슨 오류였는지 기억이 안나는데...

    앞으로는 어떤 오류가 발생했는지도 적고

    어떻게 해결해야하는지 적어봐야겠습니다.

     

     

    딕셔너리에 임시로 값을 넣기

     

    def solution(s):
        answer = []
        dic = dict()
        for i in range(len(s)):
            if s[i] not in dic:
                answer.append(-1)
            else:
                answer.append(i - dic[s[i]])
            dic[s[i]] = i
        return answer

     

    이렇게 하면 처음 보는 값은 딕셔너리에 값을 넣게 되고

    다시 보는 값은 딕셔너리에서 저장된 값을 불러오게 됩니다.

     

    개인적으로 자료형을 이용할 때 주로 리스트를 이용하는데

    리스트로 작성하면 복잡한 것을

    딕셔너리를 사용하여 이렇게 간단하게 작성할 수 있었음에

    감탄했습니다.

     

     

    반복 가능 객체에서 인덱스와 문자를 같이 뽑는 법

     

    def solution(strArr):
        return [s.lower() if i % 2 == 0 else s.upper() for i, s in enumerate(strArr)]

     

    인덱스를 추출하는데 range보다 enumerate를 사용하라는 글이 있었는데

    가독성이 좋고, OutofIndex 오류를 방지할 수 있고, 인덱스 시작 번호를 조정할 수 있기 때문이라고 합니다.

     

    시간 복잡도, 공간 복잡도에서 이득이 있어서 그런 건 아니니

    본인이 편한대로 작성해도 될 듯합니다.

     

     

    문자열 내에 특정 문자열이 있는지..

     

    return 1 if pat in mystring else 0

     

    이 코드는 대소문자를 구분하여 문자열 내에 특정 문자열이 있는지 판단해줍니다.

    즉 대문자와 소문자를 다르게 인식한다는 것입니다.

     

    pat 안에 든 문자열이 mystring의 문자열에 포함되는 문제가 자주 보입니다.

    이걸 쓸 때마다 헷갈려서 잊지 않기 위해 작성했습니다.

     

     

    문자 형태인 숫자 계산식을 수행하는 법

     

    c = eval("abs(-28)”)

     

    이 식은 정상적으로 수행되어 c=28이 됩니다.

    하지만 다음과 같은 경우에는 제대로 연산이 실행되지 않습니다.

     

    a = '10'
    b = '18'
    c = eval(a+b)

     

    이 때 c값으로 28이 출력되는 게 아니라

    1018로 출력이 됩니다..

     

    즉, eval에 변수를 할당해서 계산하면

    의도하지 않은 결과가 생길 수 있습니다.

     

    def solution(num_list):
        s=sum(num_list)**2
        m=eval('*'.join([str(n) for n in num_list]))
        return 1 if s>m else 0

     

    eval을 훌륭하게 사용한 예시 코드입니다.

    이 코드는 num_list에 들어있는 숫자를 모두 곱하는 것인데

    join을 통해 각 숫자를 '*'로 연결해주고

    eval을 사용하여 곱셈이 되도록 했습니다..

     

    이거보고 가슴이 웅장해졌습니다..

     

    단 eval함수는 보안의 관점에서 주의해야할 점이 있는데

    이 함수가 임의의 코드(악성 코드)도 실행할 수 있다는 점을 역이용해서

    데이터를 유출할 수 있다는 것입니다.

     

    데이터 분석가는 데이터를 이용하여 분석하는 것도 중요하지만

    데이터를 안전하게 하는 것도 중요하지 않을까요?

     

     

    zip함수에서 튜플 받기

     

    def solution(my_strings, parts):
        answer = ''
        for s, (x, y) in zip(my_strings, parts):
            answer += s[x:y+1]
        return answer

     

    이런 식으로 parts가 튜플이면 (x, y)로 받아도 됩니다..

    이럴 수도 있구나해서 가져왔습니다..

     

     

    ord와 chr

     

    ord에 문자를 넣으면 해당 문자의 유니코드 정수를 반환합니다.

    chr에 숫자를 넣으면 해당 숫자의 유니코드 문자를 반환합니다.

     

    def caesar(s, n):
        s = list(s)
        for i in range(len(s)):
            if s[i].isupper():
                s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
            elif s[i].islower():
                s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))

        return "".join(s)

     

    유니코드 정수에 숫자를 더하면 더한만큼 뒤로 밀립니다.

    알파벳 순서랑 똑같기 때문에 가능한 것인데요

    앞으로 고난이도 문제를 풀 때 유용하다고 생각하여 가져왔습니다.

     

     

    find 함수

     

    string.find(찾을 문자, 시작 Index, 끝 Index)의 문법을 가지고 있습니다.

    찾는 문자를 string의 index로 출력합니다.

     

    시작과 끝 index를 지정할 수 있다는 점과

    만약에 찾는 문자가 존재 하지 않으면 -1 반환한다는 점에서

    많은 곳에서 응용할 수 있을 것 같습니다!!

     

     

Designed by Tistory.