이것이 취업을 위한 테스트다(Python 문법)

LeeKyoungChang·2021년 11월 16일
1
post-thumbnail

이것이 취업을 위한 코딩테스트다.

🎡1. 수 자료형

소수부가 0일 때 0을 생략

a = 5.

실수형 데이터를 표현하는 방식으로 파이썬에서는 e나 E를 이용한 지수 표현 방식을 이용할 수 있다.

1e9 : 1,000,000,000 (10억)

유효숫자e^지수 = 유효숫자 x 10^지수

컴퓨터가 실수를 정확히 표현하지 못한다

round(a,b)

  • a : 실수형 데이터, b : 반올림하고자 하는 위치 - 1

 

1-1) 수 자료형의 연산

나누기 연산 / : 나눠진 결과를 기본적으로 실수형으로 처리한다.

몫 연산 // : 나눈 결과에서 몫

제곱 ** : 제곱

 

🎪2. 리스트 자료형

Python ListC++ STL vector와 유사하다.

2-1) 리스트 초기화
n = 10
a = [0] * n
print(a)
2-2) 리스트의 인덱싱과 슬라이싱

인덱싱 : 인덱스 값을 입력하여 리스트의 특정한 원소에 접근하는 것

n[a:b] : a부터 b-1까지

2-3) 리스트 컴프리헨션

2차원 리스트를 초기화할 때는 반드시 리스트 컴프리헨션을 이용해야 한다.

# 0부터 19에서 홀수만 포함하는 리스트
array = [i for i in range(20) if i % 2 == 1]

# N X M 크기의 2차원 리스트 초기화
n = 2, m = 3
array = [[0] * m for _ in range(n)]
2-4) 리스트 관련 기타 메서드

append()

  • 변수명.append() : 리스트에 원소를 하나 삽입할 때 사용한다. (빅오 1)

sort()

  • 변수명.sort() : 기본 정렬 기능으로 오름차순으로 정렬한다. (빅오 N로그N)
  • 변수명.sort(reverse=True) : 내림차순으로 정렬한다. (빅오 N로그N)

reverse()

  • 변수명.reverse() : 리스트의 원소의 순서를 모두 뒤집어 넣는다. (빅오 N)

insert()

  • insert(삽입할 위치 인덱스, 삽입할 값) : 특정한 인덱스 위치에 원소를 삽입할 때 사용한다. (빅오 N)

count()

  • 변수명.count(특정 값) : 리스트에서 특정한 값을 가지는 데이터 개수를 셀 때 사용한다. (빅오 N)

remove()

  • 변수명.remove(특정 값) : 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거한다. (빅오 N)

remove 특정 원소 하나씩 제거

a = [1,2,3,4,5]
remove_set = {3,5}

# remove_set에 포함되지 않은 값만 저장
result = [i for i in a if i not in remove_set]
print(result)

 

🎁3. 사전 자료형

key()s : key 데이터만 뽑아서 리스트로 이용

values() : 값 데이터만을 뽑아서 리스트로 이용

data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'

# 키 데이터만 담은 리스트
key_list = data.keys()
# 값 데이터만 담은 리스트
value_list = data.values()

 

🎆4. 집합 자료형

중복을 허용하지 않는다.

순서가 없다.

값 데이터만 담게 된다.

시간 복잡도 : 빅오(1)

data = set([1,2,3,4,5])
data = {1,2,3,4,5}
4-1) 집합 자료형의 연산
a = set([1,2,3,4,5])
b = set([3,4,5,6,7])

print(a | b) # 합집합
print(a & b) # 교집합
print(a - b) # 차집합
4-2) 집합 자료형 관련 함수

add() : 하나의 집합 데이터에 값을 추가할 때 사용

update() : 여러 개의 값을 한꺼번에 추가하고자 할 때 사용

remove() : 특정한 값을 제거할 때 사용

이때 시간 복잡도가 빅오(1)이다.

파이썬에서 들여쓰기 : 스페이스 바를 4번 입력하여 작성한다.

4-3) 논리 연산자

X and Y : X와 Y가 모두 참일 때 참이다.

X or Y : X와 Y 중에 하나만 참이어도 참이다.

not X : X가 거짓(False)일 때 참이다.

4-4) 파이썬의 기타 연산자

X in 리스트 : 리스트 안에 X가 들어가 있을 때 참이다.

X not in 문자열 : 문자열 안에 X가 들어가 있지 않을 때 참이다.

4-5) 아무것도 처리하고 싶지 않을 때

pass문을 이용한다.

 

🎟5. 반복문

for 변수 in 리스트:

​ 실행할 소스코드

 

global 키워드 : 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 된다.

람다 표현식

함수를 매우 간단하게 작성하여 적용할 수 있다.

람다식은 파이썬의 정렬 라이브러리를 사용할 때, 정렬 기준(Key)을 설정할 때에도 자주 사용된다.

def add(a, b):
	return a + b

# 일반적인 add() 메서드 사용
print(add(3, 7))

# 람다 표현식으로 구현한 add() 메서드
print((lambda a, b: a + b)(3, 7))

 

🛍6. 입출력

input() : 한 줄의 문자열을 입력 받도록 해준다.

list(map(int, input().split())) : 여러 개의 데이터를 입력받을 때 데이터가 공백으로 구분되는 경우, 입력받은 문자열을 띄어쓰기로 구분하여 각각 정수 자료형의 데이터로 저장하는 코드, 공백 혹은 줄 바꿈을 기준으로 데이터를 구분할 때 많이 사용

input(): 입력받은 문자열을

split() : 공백으로 나눈 리스트로 바꾼 뒤

map(int, ) : 해당 리스트의 모든 원소에 int() 함수를 적용한다.

list() : 최종적으로 그 결과를 list()로 다시 바꿈으로써 입력받은 문자열을 띄어쓰기로 구분하여 각각 숫자 자료형으로 저장하게 되는 것이다.

int(input()) : 줄 바꿈일 때 사용

n = int(input())
data = list(map(int, input().split()))

data.sort(reverse = True)
print(data)

 

입력을 최대한 빠르게 받아야 하는 경우

sys 라이브러리 : 파이썬의 sys 라이브러리에 정의되어 있는 sys.stdin.readline() 함수를 이용한다, sys 라이브러리는 input() 함수와 같이 한 줄씩 입력받기 위해 사용한다.

import sys
data = sys.stdin.readline().rstrip()

sys 라이브러리를 사용할 때는 한 줄 입력을 받고 나서 rstrip() 함수를 꼭 호출해야 한다.

readline() : 입력시 엔터가 줄 바꿈 기호로 입력

rstrip() : 공백 문자를 제거

 

print()

,로 구분할 경우 : 각 변수가 띄어쓰기로 구분되어 출력

연산자(+)를 이용할 시 : 문자열과 수를 함께 출력해야 되는 경우

  • 수 같은 경우 문자열 자료형으로 변경해야 한다.
  • 콤마(,)를 기준으로 구분하여 출력한다.
  • Python 3.6 이상의 버전부터, f-string을 이용하면 단순히 중괄호({}) 안에 변수를 넣음으로써, 자료형의 변환 없이도 바꾸지 않고도 간단히 문자열과 정수를 함께 넣을 수 있다.
answer = 7

print("정답은 "+str(answer)+"입니다.")
print("정답은 ", answer, "입니다.")
print(f"정답은 {answer}입니다.")

 

⚽7. 주요 라이브러의 문법과 유의점

표준 라이브러리 : 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리이다.

파이썬 라이브러리

1) 내장 함수

print(), input()과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함하고 있는 기본 내장 라이브러리이다. 파이썬 프로그램을 작성할 때 없어서는 안 되는 필수적인 기능을 포함하고 있다.

sum() : 리스트와 같은 iterable 객체가 입력으로 주어졌을 때, 모든 원소의 합을 반환

min() : 파라미터가 2개 이상 들어왔을 때 가장 작은 값을 반환

max() : 파라미터가 2개 이상 들어왔을 때 가장 큰 값을 반환

eval() : 수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과를 반환

sorted() : iterable 객체가 들어왔을 때, 정렬된 결과를 반환

  • sorted([1,2,3,4], reverse = True) # 내림차순으로 정렬
  • result = sorted([('홍길동', 35), ('이순신', 75), ('아무개', 50)], key = lambda x : x[1], reverse = True)
  • data = [9,1,2,3,4] data.sort() # 정렬됨
2) itertools

파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리이다. 순열과 조합 라이브러리를 제공한다.

permutations

  • 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산해준다.
  • 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.
from itertools import permutations

data = ['A','B','C'] # 데이터 준비
result = list(permutations(data, 3)) # 모든 순열 구하기

print(result)
# [('A','B','C'),('A','C','B'), ~ , ('C','B','A')]

combinations

  • 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산한다.
  • 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.
from itertools import combinationsdata = ['A','B','C'] # 데이터 준비result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합 구하기print(result)

product

  • permutations와 같이 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산한다.
  • 다만 원소를 중복하여 뽑는다.
  • product 객체를 초기화할 때는 뽑고자 하는 데이터의 수를 repeat 속성값으로 넣어준다.
from itertools import product

data = ['A','B','C'] # 데이터 준비
result = list(product(data, repeat=2)) # 2개를 봅는 모든 순열 구하기(중복 허용)

print(result)
[('A','A'),('A','B'),('A','C'),('B','A'), ~ ,('C','C')]

combinations_with_replacement

  • combinations와 같이 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산한다.
  • 원소를 중복해서 뽑는다.
  • 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용해야 한다.
from itertools import combinations_with_replacement

data = ['A','B','C']  # 데이터 준비
result = list(combinations_with_replacement(data,2)) # 2개를 뽑는 모든 조합 구하기(중복 허용)

print(result)

# 결과
[('A','A'),('A','B'),('A','C'),('B','B'),('B','C'),('C','C')]
3) heapq
  • 힙(Heap) 기능을 제공하는 라이브러리이다. 우선순위 큐 기능을 구현하기 위해 사용한다.

  • 다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용한다.

  • 최소 힙으로 구성되어 있으므로 단순히 원소를 힙에 전부 넣었다가 빼는 것만으로도 시간복잡도 빅오(NlogN)에 오름차순 정렬이 완료된다.

  • 보통 최소 힙 자료구조의 최상단 원소는 '가장 작은' 원소이기 때문이다.

import heapq

def heapsort(iterable):
    h = []
    result = []
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, value)
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
        result.append(heapq.heappop(h))
result = heapsort([1,3,5,7,9,2,4,6,8,0])
print(result)

# 결과
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

import heapq


def solution(food_times, k):
    if sum(food_times) <= k:
        return - 1

    q = []
    for i in range(len(food_times)):
        # (음식 시간, 음식 번호) 형태로 우선순위 큐에 삽입
        heapq.heappush(q, (food_times[i], i + 1))


    print(q[0][0])   # 1
    print(q[0][1])   # 3
    print(q[1][0])   # 9
    print(q[1][1])   # 1
    print(heapq.heappop(q)[0])   # 1
    print(heapq.heappop(q)[0])   # 2
    print(heapq.heappop(q)[0])   # 9


solution([9,2,1],5)
        
        
        
import heapq


def solution(food_times, k):
    if sum(food_times) <= k:
        return - 1

    print(food_times)
    p = []
    for i in range(len(food_times)):
        # (음식 시간, 음식 번호) 형태로 우선순위 큐에 삽입
        heapq.heappush(p, -food_times[i])

    for i in range(len(food_times)):
        # (음식 시간, 음식 번호) 형태로 우선순위 큐에 삽입
        print(heapq.heappop(p), end =' ')

solution([4,5,3,1,2],5)

# 결과
# -5 -4 -3 -2 -1

파이썬에서는 최대 힙을 제공하지 않는다.

원소의 부호를 임시로 변경하는 방식을 사용

import heapq

def heapsort(iterable):
    h = []
    result = []
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, -value)
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)):
        result.append(-heappq.heappop(h))
    return result
result = heapsort([1,3,5,7,9,2,4,6,8,0])
print(result)

# 결과
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    
4) bisect
  • 이진 탐색(Binary Search) 기능을 제공하는 라이브러리이다.
  • 정렬된 배열에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다.
  • bisect_left(a, x) : 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
  • bisect_right(a, x) : 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
from bisect import bisect_left, bisect_right

a = [1,2,4,4,8]
x = 4

print(bisect_left(a,x))
print(bisect_right(a,x))

# 결과
# 2
# 4

count_by_range(a, left_value, right_value)

  • 정렬된 리스트에서 값이 [left_value, right_value]에 속하는 데이터의 개수를 반환한다.
  • 원소의 값이 x라고 할 때, left_value <= x <= right_value인 원소의 개수를 빅오(logN)으로 빠르게 계산할 수 있다.
from bisect import bisect_left, bisect_right

# 값이 [left_value, right_value]인 데이터의 개수를 반환하는 함수
def count_by_range(a, left_value, right_value):
    right_index = bisect_right(a, right_value)
    left_index = bisect_left(a, left_Value)
    return right_index - left_index

# 리스트 선언
a = [1, 2, 3, 3, 3, 3, 4, 4, 8, 9]

# 값이 4인 데이터 개수 출력
print(count_by_range(a,4,4))

# 값이 [-1, 3] 범위에 있는 데이터 개수 출력
print(count_by_range(a, -1, 3))

# 결과
# 2
# 6
5) collections
  • 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리이다.

  • 파이썬에서는 deque를 사용해 큐를 구현한다.

  • deque

    • 시간 복잡도가 좋다.
    • 인덱싱, 슬라이싱 등의 기능은 사용할 수 없다.
    • 연속적으로 나열된 데이터의 시작 부분이나 끝부분에 데이터를 삽입하거나 삭제할 때는 매우 효과적으로 사용될 수 있다.
    • 스택이나 큐의 기능을 모두 포함한다고도 볼 수 있기 때문에 스택 혹은 큐 자료구조의 대용으로 사용될 수 있다.
    • popleft() : 첫 번째 원소를 제거
    • pop() : 마지막 원소를 제거
    • appendleft(x) : 첫 번째 인덱스에 원소 x를 삽입
    • append(x) : 마지막 인덱스에 원소를 삽입
from collections import deque

data = deque([2,3,4])
data.appendleft(1)
data.append(5)

print(data)
print(list(data)) # 리스트 자료형으로 변환

# 결과
# deque([1,2,3,4,5])
# [1,2,3,4,5]
  • Counter
    • 등장 횟수를 세는 기능을 제공한다.
    • iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.
    • 원소별 등장 횟수를 세는 기능이 필요할 때 짧은 소스코드로 이를 구현할 수 있다.
from collections import Counter

counter = Counter(['red','blue','red','green','blue','blue'])

print(counter['blue']) # 'blue'가 등장한 횟수 출력
print(counter['green']) # 'green'이 등장한 횟수 출력
print(dict(counter)) # 사전 자료형으로 변환

# 결과
# 3
# 1
# {'red': 2, 'blue': 3, 'green': 1}
6) math
  • 필수적인 수학적 기능을 제공하는 라이브러이다. 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 메서드부터 파이(pi)와 같은 상수를 포함하고 있다.
import math

print(math.factorial(5)) # 5 팩토리얼을 출력

# 결과
# 120

print(math.sqrt(7)) # 7의 제곱근을 출력

# 결과
# 2.6457513110645907

print(math.gcd(21, 14)) # 최대 공약수

# 결과
# 7

print(math.pi) # 파이(pi) 출력
print(math.e) # 자연상수 e 출력

# 결과
# 3.141592653589793
# 2.718281828459045

 

 


참고 자료

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글

관련 채용 정보