3 minute read

알아두면 좋은 Python3 내장 함수

>> a = [1,14,19,21,5,3]

>> a.insert(2,77)
a = [1,14,77,19,21,5,3]

>> a.index(19)
3

>> a.remove(21)
a = [1,14,77,19,5,3]

>> a.append(404)
a = [1,14,77,19,5,3,404]

>> a.pop()
a = [1,14,77,19,5,3]

## 정렬

>> newlist = sorted(a)
a = [1,14,77,19,5,3]
newlist = [1, 3, 5, 14, 19, 77]

>> a.sort()
a = [1, 3, 5, 14, 19, 77]

>> revlist = sorted(a,reverse = True)
revlist = [77, 19, 14, 5, 3, 1]

>> strlist = ['my', 'name', 'is', 'obo']
>> strlist = sorted(strlist, key=lambda s: len(s))
strlist = ['my', 'is', 'obo', 'name']


>> strlist = sorted(strlist, key=lambda s: len(s) , reverse = True)
strlist =['name', 'obo', 'my', 'is']

>> L = [ {'name' : 'pencil', 'score' : 99}, {'name' : 'book', 'score' : 70}]
>> L.sort(key = lambda x : x['name'])
L = [{'name': 'book', 'score': 70}, {'name': 'pencil', 'score': 99}]

이분 탐색

  • 정렬된 리스트에서 상수 x 의 인덱스를 알아내려고한다. 이때 탐색하는 부분리스트의 중간값이 x 보다 작으면/크면 중간 값 이전/이후 부분 배열을 버리는 것(탐색하지 않는것)을 이용한다.

  • 코드는 다음과 같다.

def solution(L, x):
    answer = 0
    row = 0
    high = len(L)-1
    while(row <= high and high < len(L)):
        middle = (row + high) // 2
        if( L[middle] == x):
            return middle
        elif(L[middle] < x):
            row = middle +1
        else:
            high = middle - 1
    return -1

재귀 알고리즘

  • 재귀 알고리즘을 사용해서 조합 (n개의 서로 다른 원소에서 m를 택하는 경우의 수)을 구해보자.
C(n,m) = n! / (m! * (n-m)!)
C(n,m) = C(n-1,m) + C(n-1, m-1)
-> 특정한 하나의 원소 입장에서 볼 때, 이 원소를 포함하는 경우와 그렇지 않은 경우를 따로 계산해서 더한다.

이분 탐색 알고리즘 재귀 버전

def solution(L, x, l, u):
    if (u < l or len(L) <= u):
        return -1
    mid = (l + u) // 2
    if x == L[mid]:
        return mid
    elif x < L[mid]:
        return solution(L, x, l, mid-1)

    else:
        return solution(L, x, mid+1, u)

연결 리스트

class Node:

    def __init__(self, item):
        self.data = item
        self.next = None


class LinkedList:

    def __init__(self):
        self.nodeCount = 0
        self.head = None
        self.tail = None


    def getAt(self, pos):
        if pos < 1 or pos > self.nodeCount:
            return None

        i = 1
        curr = self.head
        while i < pos:
            curr = curr.next
            i += 1

        return curr


    def insertAt(self, pos, newNode):
        if pos < 1 or pos > self.nodeCount + 1:
            return False

        if pos == 1:
            newNode.next = self.head
            self.head = newNode

        else:
            if pos == self.nodeCount + 1:
                prev = self.tail
            else:
                prev = self.getAt(pos - 1)
            newNode.next = prev.next
            prev.next = newNode

        if pos == self.nodeCount + 1:
            self.tail = newNode

        self.nodeCount += 1
        return True


    def popAt(self, pos):
        data = 0
        if self.nodeCount == 0 or pos < 1 or pos > self.nodeCount:
            raise IndexError
        
        if self.nodeCount == 1:
            data = self.head.data
            self.head = None
            self.tail = None
        elif pos == 1:
            data = self.head.data
            self.head = self.head.next
        else:
            prev = self.getAt(pos-1)
            curr = self.getAt(pos)
            data = curr.data
            if pos == self.nodeCount: #tail
                self.tail = prev
                self.tail.next = None
            else:
                prev.next = curr.next
        self.nodeCount -= 1
        return data


    def traverse(self):
        result = []
        curr = self.head
        while curr is not None:
            result.append(curr.data)
            curr = curr.next
        return result


def solution(x):
    return 0

Level 2 연습문제

문제 설명 Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 빨간색으로 칠해져 있고 가장 끝쪽의 모서리 한 줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.

Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다. 빨간색 격자의 수 red는 1 이상 2,000,000 이하인 자연수입니다. 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 
brown	red	return
10	2	[4, 3]
8	1	[3, 3]
24	24	[8, 6]

문제 풀이

  • red + brown 값의 약수를 구한다.
def solution(brown, red):
    answer = []
    total = brown + red
    comm_list = []
    for i in range(2,total//2):
        if(total % i == 0):
            brown_row = total // i
            brown_col = i
            brown_total = 2*brown_row + 2 * brown_col - 4
            # print( "brown : ", brown_row , brown_col,"red : ",brown_row - 2 ,brown_col -2)
            if(brown_total == brown):
                red_row = brown_row - 2
                red_col = brown_col -2
                red_total = red_row * red_col
                if(red_total == red):
                    return [brown_row , brown_col]
    return answer