Python 코딩테스트에 유용한 메소드, 함수 정리

코딩 감각을 다시 끌어올리기 위해 코딩테스트 공부를 시작했다. 늘 제일 자신 없고 스트레스 받아 하던 것이 코딩테스트인데, 당장 인터뷰 볼일이 없다고 하더라도 언젠가 이 두려움을 꼭 없애고 싶었다. 알고리즘 공부는 시작하고, 포기하기를 수십번도 반복했지만 그래도 집에 사놓은 책 한권은 꼭 완독해보고 싶었다. 수준을 급하게 올려야하는 목표가 있는 것이 아니기에 천천히… 오래 오래… 공부할 것😊ㅎㅎㅎ

책에서 문제 풀기에 앞서 프로그래머스 코딩테스트 입문(Lv 0) 100제로 일단 시작하는 것을 권하기에, 지난 한달간 100제를 모두 풀었다. 그 과정에서 필요했던 Python 메소드와 함수를 정리해본다.

최소 공배수, 최소 공약수

import math

def solution(numer1, denom1, numer2, denom2):
    b = denom1 * denom2
    a = (numer1 * denom2) + (numer2 * denom1)
    
    gcd=math.gcd(a,b)
    a = a // gcd
    b = b // gcd
    
    answer = [a, b]
    return answer
  • math.gcd 최대공약수
  • math.lcd 최소공배수

기약분수

from fractions

def solution(denum1, num1, denum2, num2):
    answer = fractions.Fraction(denum1, num1) + fractions.Fraction(denum2, num2)
    return [answer.numerator, answer.denominator]
  • fractions.Fraction
  • Fraction.numerator 분자, Fraction.denominator 분모

리스트의 개수 세기

ls = [1, 2, 1, 1, 1, 1]
import collections
cnt = collections.Counter(ls)
print(cnt)
print(cnt.most_common(1))

>>>
Counter({1: 5, 2: 1})
[(1, 5)]
  • collections.Counter

약수 구하기

def getMyDivisor(n):

    divisorsList = []

    for i in range(1, int(n**(1/2)) + 1):
        if (n % i == 0):
            divisorsList.append(i) 
            if ( (i**2) != n) : 
                # N=A*B일 때, A==B일 수 있기 때문에(eg.25=5*5) 중복 방지
                divisorsList.append(n // i)

    divisorsList.sort()
    
    return divisorsList
  • n**(1/2) 제곱근
    • math.sqrt(n) 대체 가능

소수 찾기

import math
def is_primenum(x):
    for i in range(2, int(math.sqrt(x) + 1)):
        if x % i == 0:
            return False
    return True
  • 1과 자기자신을 제외한 약수가 존재하는지 확인하려면, 약수들은 대칭적으로 짝을 이루기 때문에 자기자신의 제곱근(루트)까지만 확인
    • N = A * B (A, B 짝을 이룸)
  • 합성수: 소수가 아닌 수

소인수 찾기

def solution(n):
    answer = []
    d = 2
    while d <= n:
        if n % d == 0:
            n /= d
            if d not in answer:
                answer.append(d)
        else:
            d += 1
    return answer
  • 소인수분해: 어떤 수를 소수들의 곱으로 표현

순열과 조합

from itertools import *

dataset = ['A', 'B', 'C']

    printList = list(permutations(dataset, 2))
    print(printList)
    
    # 결과값
    # [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]

dataset = ['A', 'B', 'C']

    printList = list(product(dataset, repeat = 2))
    print(printList)

    # 결과값
    # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]

dataset = ['A', 'B', 'C']

    printList = list(combinations(dataset, 2))
    print(printList)
    
    # 결과값
    # [('A', 'B'), ('A', 'C'), ('B', 'C')]

dataset = ['A', 'B', 'C']

    printList = list(combinations_with_replacement(dataset, 2))
    print(printList)


    # 결과값
    # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
  • itertools.permutations
    • 순열: 순서는 있으나 중복 없는 모든 경우의 수
  • itertools.product
    • 중복 순열: 중복을 허용하는 순열
  • itertools.combinations
    • 조합: 순서 상관 없는 경우의 수
  • itertools.combinations_with_replacement
    • 중복 조합: 중복 포함, 순서를 고려하지 않는 경우

조합과 팩토리얼(숫자 리턴)

import math

# 조합
balls = 5
share = 2
def solution(balls, share):
    return math.comb(balls, share)

# 팩토리얼
math.factorial(balls)
  • math.comb 조합
  • math.factorial 팩토리얼

문자열의 숫자 판별

  • .isdigit()
    • 숫자, 지수까지
  • .isdecimal()
    • 0~9사이의 숫자로만 이루어진, 1234 ⇒ True
  • .isnumeric()
    • 숫자, 분수, 지수까지

*소숫점과 음수는 전부 취급 안하므로, replace 후에 사용해야 함

float의 정수 판별

  • float(x).is_integer()

절대값

  • abs

대소문자 관련

def solution(my_string):
    answer = ''
    for s in my_string:
        if s.isupper():
            answer += s.lower()
        else:
            answer += s.upper()
    return answer

집합

집합 연산

>>> a = {1, 2, 3, 4}
>>> b = {3, 4, 5, 6}
>>> a | b
{1, 2, 3, 4, 5, 6}
>>> set.union(a, b)
{1, 2, 3, 4, 5, 6}

>>> a & b
{3, 4}
>>> set.intersection(a, b)
{3, 4}

>>> a - b
{1, 2}
>>> set.difference(a, b)
{1, 2}

>>> a ^ b
{1, 2, 5, 6}
>>> set.symmetric_difference(a, b)
{1, 2, 5, 6}
  • ^ 연산자는 대칭차집합(symmetric difference)을 구하며 XOR 연산자 ^를 사용
  • 대칭차집합은 XOR 연산자의 특성을 그대로 따르는데 XOR은 서로 다르면 참, 따라서 집합에서는 두 집합 중 겹치지 않는 요소만 포함

집합의 update 연산

>>> a = {1, 2, 3, 4}
>>> a |= {5}
>>> a
{1, 2, 3, 4, 5}
>>> a = {1, 2, 3, 4}
>>> a.update({5})
>>> a
{1, 2, 3, 4, 5}

>>> a = {1, 2, 3, 4}
>>> a &= {0, 1, 2, 3, 4}
>>> a
{1, 2, 3, 4}
>>> a = {1, 2, 3, 4}
>>> a.intersection_update({0, 1, 2, 3, 4})
>>> a
{1, 2, 3, 4}

>>> a = {1, 2, 3, 4}
>>> a -= {3}
>>> a
{1, 2, 4}
>>> a = {1, 2, 3, 4}
>>> a.difference_update({3})
>>> a
{1, 2, 4}

>>> a = {1, 2, 3, 4}
>>> a ^= {3, 4, 5, 6}
>>> a
{1, 2, 5, 6}
>>> a = {1, 2, 3, 4}
>>> a.symmetric_difference_update({3, 4, 5, 6})
>>> a
{1, 2, 5, 6}

부분집합

>>> a = {1, 2, 3, 4}
>>> a <= {1, 2, 3, 4}
True
>>> a.issubset({1, 2, 3, 4, 5})
True

>>> a = {1, 2, 3, 4}
>>> a < {1, 2, 3, 4, 5}
True

상위집합

>>> a = {1, 2, 3, 4}
>>> a >= {1, 2, 3, 4}
True
>>> a.issuperset({1, 2, 3, 4})
True

>>> a = {1, 2, 3, 4}
>>> a > {1, 2, 3}
True

>>> a = {1, 2, 3, 4}
>>> a == {1, 2, 3, 4}
True
>>> a == {4, 2, 1, 3}
True

집합 겹치는 요소

>>> a = {1, 2, 3, 4}
>>> a.isdisjoint({5, 6, 7, 8})       # 겹치는 요소가 없음
True
>>> a.isdisjoint({3, 4, 5, 6})    # a와 3, 4가 겹침
False

sort, sorted의 key 활용

def solution(numlist, n):
    answer = sorted(numlist, key = lambda x:(abs(x-n), n-x))
    return answer
  • key의 값으로는 function이 와야 함
    • e.g. array.sort(key = lambda x:x[0])
    • e.g. array.sort(key=lambda x:len(x))
    • n가지 요건이 있을 경우 튜플로 묶어서 여러 개를 써주면 됨

몫, 나머지 동시에 구하기

  • div, mod = divmod(n, 10)

이진수

def solution(bin1, bin2):
    a = int(bin1, 2)
    b = int(bin2, 2)
    answer = bin(a+b)
    return answer.replace("0b", "")

Leave a Reply

Your email address will not be published. Required fields are marked *