💡 해당 글은 이코테 2021 강의 몰아보기를 보고 개인적으로 정리한 글입니다. 문제 시 삭제하겠습니다!
=> 프로그래밍 대회나 코딩 테스트에서 나올 법한 문제를 시험해 보는 온라인 시스템
해외 사이트
이름 | 주소 |
---|---|
코드포스(Codeforces) | http://www.codeforces.com |
탑코더(TopCoder) | https://www.topcoder.com |
릿코드(LeetCode) | https://leetcode.com |
코드셰프(CODECHEF) | https:///www.codechef.com |
국내 사이트
이름 | 주소 |
---|---|
백준 온라인 저지(BOJ) | https://www.acmicpc.net |
코드업(CodeUp) | https://codeup.kr |
프로그래머스(Programmers) | https://programmers.co.kr |
SW Expert Academy | https://swexpertacademy.com |
파이썬
이 모두 높은 순위를 차지함✔️ 물론 2021 기준이라는 것...
응시생들에게 2~5시간 가량의 시간을 주어 여러 개의 정해진 알고리즘 문제들을 풀도록 함
빈출 유형
↑ 2016 ~ 2019년에 출제되었던 국내외 주요 기업들 공채에 등장한 알고리즘 유형
ex) 연산 횟수가 3N^3 + 5N^2 + 1,000,000
인 알고리즘이라면, O(N^3)
으로 표기됨
- C언어 기준 통상 1~3초 가량의 시간 소요
- Python 기준 통상 5~15초 가량의 시간 소요
(PyPy의 경우 때때로 C언어보다 빠르게 동작할 수 있기 때문에, PyPy를 지원한다면 PyPy로 제출하는 게 시간 복잡도 측면에서 유리할 수 있음)
코딩 테스트 문제에서 시간 제한은 통상 1~5초 가량이라는 점에 유의
- N의 범위가 500인 경우: 시간 복잡도가 `O(N^3)`인 알고리즘을 설계하면 풀이 가능
- N의 범위가 2,000인 경우: 시간 복잡도가 `O(N^2)`인 알고리즘을 설계하면 풀이 가능
- N의 범위가 100,000인 경우: 시간 복잡도가 `O(NlogN)`인 알고리즘을 설계하면 풀이 가능
- N의 범위가 10,000,000인 경우: 시간 복잡도가 `O(N)`인 알고리즘을 설계하면 풀이 가능
import time
start_time = time.time() # 측정 시작
# 프로그램 소스코드
end_time = time.time() # 측정 종료
print("time:", end_time - start_time) # 수행 시간 출력
# 소수부가 0일 때 0을 생략
a = 5.
print(a) # 5.0
# 정수부가 0일 때 0을 생략
a = -.7
print(a) # -0.7
1e9
를 입력하면, 10의 9제곱(1,000,000,000)이 됨# 1,000,000,000의 지수 표현 방식
a = 1e9
print(a) # 1000000000.0
# 752.5
a = 75.25e1
# 3.954
a = 3954e-3
a = 0.3 + 0.6
print(a)
if a == 0.9:
print(True)
else:
print(False)
출력
0.8999999999999999
False
round()
함수를 이용하는 방법이 권장됨round(123.456, 2)
라고 작성함a = 5
b = 3
# 거듭 제곱
print(a ** b) # 125
# 제곱근
print(a ** 0.5) # 2.23606797749979
배열
기능 및 연결 리스트
와 유사한 기능도 제공배열
또는 테이블
로 부르기도 함[]
) 안에 원소를 넣어 초기화하며, 쉼표(,
)로 원소 구분list()
또는 []
를 이용할 수 있음# 크기가 N이고, 모든 값이 0인 1차원 리스트 초기화
n = 10
a = [0] * n
print(a)
:
)을 넣어서 시작 인덱스와 끝 인덱스 설정 가능조건문
과 반복문
을 적용하여 리스트 초기화 가능a = [i for i in range(10)]
print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
array = [i for i in range(20) if i % 2 == 1]
print(array) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
array = [i * i for i in range(1, 10)]
print(array) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
array = [[0] * m for _ in range(n)]
array = [[0] * m] * n
# 그냥 Hello World 5번 출력하는 로직
for _ in range(5):
print("Hello World")
a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5} # 집합 자료형
# remove_list에 포함되지 않은 값만을 저장
result = [o for i in a if i not in remove_set]
print(result)
"
)나 작은따옴표('
) 이용백슬래시(\)
를 사용하면, 큰따옴표나 작은따옴표를 원하는 만큼 포함시킬 수 있음data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'
print(data) # {'사과': 'Apple', '바나나': 'Banana', '코코넛': 'Coconut'}
if '사과' in data:
print("'사과'를 키로 가지는 데이터가 존재합니다.")
keys()
values()
set()
함수 사용a = set([1, 2, 3, 4, 5])
b = set([3, 4, 5, 6, 7])
# 합집합
print(a | b)
# 교집합
print(a & b)
# 차집합
print(a - b)
add()
: 새로운 원소 추가update()
: 새로운 원소 여러 개 추가remove()
: 특정한 값을 가지는 원소 삭제input()
: 한 줄의 문자열을 입력 받는 함수map()
: 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용list(map(int, input().split()))
a, b, c = map(int, input().split())
sys
라이브러리에 정의되어 있는 sys.stdin.readline()
메서드 사용rstrip()
메서드와 함께 사용import sys
# 문자열 입력 받기
data = sys.stdin.readline().rstrip()
print(data)
print()
함수 사용print()
는 기본적으로 출력 이후에 줄 바꿈 수행a = 1
b = 2
print(a, b)
print(7, end=" ")
print(8, end=" ")
answer - 7
print("정답은 " + str(answer) + "입니다.")
1 2
7 8 정답은 7입니다.
f
를 붙여 사용answer = 7
print(f"정답은 {answer}입니다.")
&&
, ||
, !
안 쓰고 and
, or
, not
쓴다는 것 주의pass
키워드 사용score = 85
if score >= 80:
pass # 나중에 작성할 부분
else:
print('성적인 80점 이하입니다.')
score = 85
if score >= 80: result = "Success"
else: result = "Fail"
score = 85
result = "Success" if score >= 80 else "Fail"
x > 0 and x < 20
이렇게 작성해야 하는데 파이썬에서는 그냥 0 < x < 20
으로 작성해도 됨range()
를 주로 사용range(시작 값, 끝 값 + 1)
def 함수명(매개변수):
실행할 소스코드
return 반환 값
global
키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 됨a = 0
def func():
global a
a += 1
for i in range(10):
func()
print(a) # 10
def operator(a, b):
add_var = a + b
subtract_var = a - b
multiply_var = a * b
divide_var = a / b
return add_var, subtract_var, multiply_var, divide_var
a, b, c, d = opeartor(7, 3)
def add(a, b):
return a + b
# 일반적인 add() 메서드 사용
print(add(3, 7))
# 람다 표현식으로 구현한 add() 메서드
print((lambda a, b: a + b)(3, 7))
array = [('홍길동', 50), ('이순신', 32), ('아무개', 74)]
def my_key(x):
return x[1]
print(sorted(array, key=my_key))
print(sorted(array, key=lambda x: x[1]))
list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]
result = map(lambda a, b: a + b, list1, list2)
print(list(result))
# sum()
result = sum([1, 2, 3, 4, 5])
# min(), max()
min_result = min(7, 3, 5, 2)
max_result = max(7, 3, 5, 2)
# eval()
result = eval("(3+5)*7")
eval()
은 사람이 이해할 수 있는 수식 형태의 값을 실제 수 형태로 반환해주는 함수# sorted()
result = sorted([9, 1, 8, 5, 4])
reverse_result = sorted([9, 1, 8, 5, 4], reverse=True)
# sorted() with key
array = [('홍길동', 35), ('이순신', 75), ('아무개', 50)]
result = sorted(array, key=lambda x: x[1], reverse=True)
{'A', 'B', 'C'}
에서 3개를 선택하여 나열하는 경우: ABC
, ACB
, BAC
, BCA
, CAB
, CBA
{'A', 'B', 'C'}
에서 순서를 고려하지 않고 2개를 뽑는 경우: AB
, AC
, BC
순열
from itertools import permutations
data = ['A', 'B', 'C']
result = list(permutations(data, 3))
print(result)
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
조합
from itertools import combinations
data = ['A', 'B', 'C']
result = list(combinations(data, 2))
print(result)
[('A', 'B'), ('A', 'C'), ('B', 'C')]
collections
라이브러리의 Counter
는 등장 횟수를 세는 기능을 제공함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}
import math
# 최소 공배수(LCM)을 구하는 함수
def lcm(a, b):
return a * b // math.gcd(a, b)
a = 21
b = 14
print(math.gcd(21, 14)) # 최대 공약수(GCD) 계산
print(lcm(21, 14)) # 최소 공배수(LCM) 계산
7
42
math
라이브러리의 gcd()
함수 사용하면 되고, 최소 공배수는 그 gcd()
함수를 이용하여 최소 공배수 공식에 따라 함수 작성하면 됨