당신은 주제를 찾고 있습니까 “파이썬 코딩 테스트 – [코테준비] N시간만에 끝내는 Python 코딩테스트(2018-2021년) 풀영상“? 다음 카테고리의 웹사이트 you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 제주코딩베이스캠프 이(가) 작성한 기사에는 조회수 6,008회 및 좋아요 168개 개의 좋아요가 있습니다.
파이썬 코딩 테스트 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 [코테준비] N시간만에 끝내는 Python 코딩테스트(2018-2021년) 풀영상 – 파이썬 코딩 테스트 주제에 대한 세부정보를 참조하세요
🙋♂️ 인프런 30% 할인 쿠폰받아가세요!💚(선착순 10명) 🙋♀️
– 눈떠보니 코딩 테스트 전날(https://inf.run/VUhm) : 2918-34133f076969
– 중급자를 위한 1 minute, 스낵 파이썬(https://inf.run/eWa4) : 2927-57b2ea44903f
쿠폰 적용 방법은 아래링크를 참고해주세요!
https://www.inflearn.com/notices/23389
이 쿠폰은 유튜브 시청자 여러분들을 위해 준비했어요.
영상을 시청해주셔서 항상 감사드립니다🙇
=================================================================
안녕하세요! 제주코딩베이스캠프입니다.
\”N시간만에 끝내는 Python 코딩테스트\” 2018년~2021년 카카오 코딩테스트 문제 해설 풀영상입니다!
📌 사용한 주피터 노트북 다운받기 : https://github.com/paullabkorea/kakaocodingtest
혹시 강의 내용이 어렵다면, 간단한 알고리즘 풀이와 메서드 정리가 담겨있는 초급자를 위한 \”눈떠보니 코딩테스트 전날\” 강의를 추천드립니다!
📌 강의 링크 : https://inf.run/ZjsV
영상이 도움이 되셨다면 좋아요와 구독, 알람설정 부탁드립니다. 🙇♂️
✔ 타임라인
0:00 [#1] 주의사항과 워밍업
11:24 [#2] 2018 카카오 코딩 테스트 1번
19:23 [#3] 2018 카카오 코딩 테스트 2번
34:20 [#4] 2018 카카오 코딩 테스트 3번
43:54 [#5] 2018 카카오 코딩 테스트 4번
54:50 [#6] 2018 카카오 코딩 테스트 5번
1:11:31 [#7] 2018 카카오 코딩 테스트 6번
1:26:24 [#8] 2019 카카오 코딩 테스트 1번
1:35:58 [#9] 2019 카카오 코딩 테스트 2번
1:44:07 [#10] 2019 카카오 코딩 테스트 3번
2:00:25 [#11] 2019 카카오 코딩 테스트 4번
2:16:35 [#12] 2020 카카오 코딩 테스트 1번
2:29:38 [#13] 2020 카카오 코딩 테스트 4번
2:59:29 [#14] 2021 카카오 코딩 테스트 1번
3:08:27 [#15] 2021 카카오 코딩 테스트 2번
파이썬 코딩 테스트 주제에 대한 자세한 내용은 여기를 참조하세요.
#1 Python 코딩테스트 대비 여러 Tip 정리 – With Data
이 포스트는 위의 영상을 보고 제가 필요하다고 생각된 부분을 정리한 포스팅 입니다. – 실수형 데이터의 경우, 컴퓨터 특성상 4바이트나 8바이트로 …
Source: hkim-data.tistory.com
Date Published: 7/10/2022
View: 1627
[Python] 코딩테스트에 필요한 파이썬 문법 정리 – SeongbinDB
자료형. 수 자료형. 정수형. 실수형. #소수부가 0일 때 0을 생략 a = 5. # 5.0 # 10억의 지수 표현 방식 (최단 경로문제에서 자주 사용) a = 1e9 …
Source: seongbindb.tistory.com
Date Published: 2/20/2022
View: 2728
Python 코딩테스트 대비 문법들 정리
Python 코딩테스트 대비 문법들 정리. dev-Jun 2021. 8. 17. 21:59. 매번 알고리즘 문제를 풀 때, 필요한 개념을 그때그때 구글에 검색하는 식으로 여태까지 풀었 …
Source: junsangkwon.tistory.com
Date Published: 8/9/2021
View: 8004
파이썬 문법 정리 for 코딩 테스트 – velog
이것이 취업을 위한 코딩 테스트다 with 파이썬. 나만을 위한 파이썬 문법 정리. 수의 지수 표현. a = 1e9 // 1,000,000,000 a = 75.25e1 // 752.5 a …
Source: velog.io
Date Published: 2/23/2021
View: 5541
[Python/문제풀이] 파이썬을 무기로, 코딩테스트 광탈을 면하자!
코딩테스트 때문에 아픈 당신에게 프로그래머스가 발라주는 구급약! 스터디 참여할 시간은 없고, 테스트 준비는 급할 때 최고의 선택. Best Practice 를 실시간으로 보고,
Source: school.programmers.co.kr
Date Published: 5/17/2021
View: 3923
코딩테스트 대비 공부방법 (파이썬) – 개발로그
그리고 댓글로 코딩테스트 혹은 비전공자 프로그래밍 공부 방법에 대해 물어보시는 분이 … 가 뭔지도 모를 때 무작정 파이썬 수업부터 들었다.
Source: in0-pro.tistory.com
Date Published: 1/15/2022
View: 9301
코딩테스트를 위한 python 문법 – takeU
코딩테스트를 위한 python 문법 코테 언어를 고민하다 파이썬으로 정착하기로 생각하면서 필요한 문법 정리 출처: 이코테 숫자 자료형 ( Number ) …
Source: takeu.tistory.com
Date Published: 9/28/2022
View: 4424
[이것이 코딩 테스트다] 1. 코딩 테스트 출제 경향 분석 및 파이썬 …
채점용 서버에서는 Python이 1초에 2천만번 정도의 연산만 처리할 수 있다고 가정하고 문제를 접해야함; 코딩 테스트 문제에서 시간제한은 통상 1 ~ 5 …
Source: freedeveloper.tistory.com
Date Published: 9/16/2021
View: 7938
파이썬 알고리즘 문제풀이 (코딩테스트 대비) – 인프런 | 강의
파이썬을 이용한 코딩테스트 문제풀이를 합니다., – 강의 소개 | 인프런…
Source: www.inflearn.com
Date Published: 9/7/2022
View: 7687
주제와 관련된 이미지 파이썬 코딩 테스트
주제와 관련된 더 많은 사진을 참조하십시오 [코테준비] N시간만에 끝내는 Python 코딩테스트(2018-2021년) 풀영상. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 파이썬 코딩 테스트
- Author: 제주코딩베이스캠프
- Views: 조회수 6,008회
- Likes: 좋아요 168개
- Date Published: 2021. 6. 7.
- Video Url link: https://www.youtube.com/watch?v=orf9ailzXvI
#1 Python 코딩테스트 대비 여러 Tip 정리
https://www.youtube.com/watch?v=m-9pAwq1o3w&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=2
이 포스트는 위의 영상을 보고 제가 필요하다고 생각된 부분을 정리한 포스팅 입니다.
– 실수형 데이터의 경우, 컴퓨터 특성상 4바이트나 8바이트로 실수를 표현하기 때문에 근사치를 표현하여 정확하게 떨어지지 않는 경우가 많다.
– 따라서 round() 함수를 사용해서 소수점 반올림을 하는 방법이 권장된다.
a = 123.456 print(round(a, 2)) # 123.46
리스트를 초기화 할 때 리스트 컴프리헨션을 활용해서 초기화 하면 편함
# 1차원 리스트 array = [0]*3 # [0,0,0] # 2차원 리스트 N * M N, M = 3,5 array = [[0]*M for _ in range(N)] # [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] # 잘못된 예시 array= [[0]*M]*N # 위의 경우와 값은 동일하나 내부적으로 M*[0]의 리스트(임의의 주소값을 갖는 객체로 인식함) # 를 N의 길이만큼 참조하여 복사된 주소값을 가지게 됨
– 자주 사용하는 리스트 관련 함수 시간복잡도.
remove 함수는 특정한 값을 갖는 원소를 하나만 제거 한다. 모든 원소를 제거 하고 싶다면 아래와 같은 방법을 사용하자.
a =[1,2,3,4,5,5,5] remove_set = {3,5} result = [i for i in a if i not in remove_set] print(result) # [1,2,4]
– 문자열은 특정한 인덱스의 값을 변경할 수 없다.(immutable)
– 튜플은 ( ) 를 사용하고 값을 변경할 수 없다.(immutable)
– 튜플은 리스트에 비해 공간 효율적임.
튜플을 사용하면 좋은 예
1. 서로 다른 성질의 데이터를 묶을 때
2. 데이터의 나열을 해싱의 키 값으로 사용할 때
3. 리스트보다 메모리를 효율적으로 사용해야 할 때
– dict는 O(1) 시간 복잡도를 가짐.
key 만 원할 때 keys
value만 원할 때 values
– 집합 자료형
– 모든 작업에서 O(1)
– set( ) 함수 이용하거나 { } 이용
– 중복 X 순서 X
집합 자료형 연산
a = set([1,2,3,4,5]) b = set([3,4,5,6,7]) # 합집합 print(a | b) # {1,2,3,4,5,6,7} # 교집합 print(a & b) # {3,4,5} # 차집합 print(a – b) # {1,2}
집합 자료형 함수
data = set([1,2,3]) print(data) # {1,2,3} # 원소 추가 data.add(4) print(data) {1,2,3,4} # 원소 여러 개 추가 data.update([5,6]) print(data) {1,2,3,4,5,6} # 특정 값 갖는 원소 삭제 data.remove(6) print(data) {1,2,3,4,5} # 없는 값 remove 할 시 에러 발생 data.remove(7)
– 입력 받기
a = input() # 문자열 형태로 입력 됨 b = int(input()) # int 형태로 변환 c = list(map(int, input().split())) # 공백을 기준으로 a, b ,c = map(int, input().split()) # 입력이 3개로 주어진 경우 # 빠른 입력 받기 import sys data = sys.stdin.readline().rstrip() print(data)
유용한 표준 라이브러리
–
– 자주 사용 되는 내장함수
result = sum([1,2,3,4,5]) print(result) # 15 min_result = min(7,3,5,2) min_result = max(7,3,5,2) print(min_result , max_result) # 2 7 result = eval(“(3+5)*7″) print(reuslt) # 56
# sorted() result = sorted([9,1,8,5,4]) reverse_result = sorted([9,1,8,5,4],reverse=True) print(result) # [1,4,5,8,9] print(reverse_result) # [9,8,5,4,1] # sorted() with key array = [(‘홍길동’, 35), (‘이순신’, 75), (‘아무개’, 50)] result = sorted(array, key=lambda x: x[1], reverse=True) print(result) # [(‘이순신’, 75), (‘아무개’, 50), (‘홍길동’, 35)]
천만 , 1억 단위를 넘어갔을 경우 시간 초과 판정 날 경우가 많다.
#[(‘A’, ‘A’), (‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘A’), (‘B’, ‘B’), (‘B’, ‘C’), (‘C’, ‘A’), (‘C’, ‘B’), (‘C’, ‘C’)] #[(‘A’, ‘A’), (‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘B’), (‘B’, ‘C’), (‘C’, ‘C’)]
Counter 객체를 활용하여 내부 원소 등장 횟수 구하기
from collections import Counter counter = Counter([‘red’,’blue’,’red’,’green’,’blue’,’blue’]) print(counter[‘blue’]) print(counter[‘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(a,b)) print(lcm(a,b)) ”’ 7 42 ”’
재귀 사용시
import sys sys.setrecursionlimit(10 ** 6)
[Python] 코딩테스트에 필요한 파이썬 문법 정리
반응형
자료형
수 자료형
정수형
실수형
#소수부가 0일 때 0을 생략 a = 5. # 5.0 # 10억의 지수 표현 방식 (최단 경로문제에서 자주 사용) a = 1e9 # 100000000.0 # 컴퓨터는 2진수 체계이기 때문에 실수 덧셈을 정확히 하지 못한다. 보통 5째 자리에서 반올림 하면된다. a = 0.3 + 0.6 print(rount(a,4))
수 자료형의 연산
a = 7 b = 3 # 나누기 a / b # 나머지 a % b # 몫 a // b # 거듭 연산자 a ** b # a의 b승
리스트 자료형
리스트 초기화
a = [1,2,3,4,5,6,7,8,9] print(a) print(a[4]) # 빈 리스트 선언 방법 a = list() a = [] # 크기가 N이고 모든 값이 0인 1차원 리스트 초기화 n = 10 a = [0] * n # [0,0,0,0,0,0,0,0,0,0]
리스트 인덱싱과 슬라이싱
인덱싱
인덱스 값을 입력하여 리스트의 특정한 원소의 접근하는 것을 인덱싱이라 한다.
파이썬의 인덱스값은 양,음 정수를 모두 사용할 수 있으며 음의 정수를 넣으면 원소를 거꾸로 탐색한다.
슬라이싱
리스트의 연속적인 위치를 갖는 원소들을 가져와야 할 때 사용
a = [1,2,3,4,5,6,7,8,9] a[-1] # 9 a[-3] # 7 a[1:4] # [2,3,4]
리스트 컴프리헨션
리스트를 초기화하는 방법 중 하나이다
대괄호안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다.
2차원 리스트를 초기화할 때 매우 효과적으로 사용된다.
리스트 컴프리헨션과 일반소스코드 비교
# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트 array = [i for i in range(20) if i % 2 == 1] array = [] for i in range(20) if i % 2 == 1: array.append(i)
# 1부터 9까지의 수의 제곱 값을 포함하는 리스트 array = [i*i for i in range(1,10)]
# N * M 크기의 2차원 리스트 초기화 n = 3 m = 4 array = [[0] * m for _ in range(n) ] # [[0,0,0,0],[0,0,0,0], [0,0,0,0]]
언더바(_)의 역할
특정 크기의 2차원 리스트를 초기화 할 때는 반드시 리스트 컴프리헨션을 사용
# N * M 크기의 2차원 리스트 초기화(잘못된 방법) n = 3 m = 4 array = [[0] * m] * n # [[0,0,0,0],[0,0,0,0], [0,0,0,0]] array[1][1] = 5 # [[0,5,0,0],[0,5,0,0], [0,5,0,0]] # 내부적으로 3개의 리스트가 모두 동일한 객체에 대한 3개의 레퍼런스로 인식되기 때문
리스트 관련 기타 메서드
append() O(1)
sort()
reverse()
insert() O(N)
count()
remove() O(N)
a = [1,4,3] # 리스트에 원소 삽입 a.append(2) # 오름차순 정렬 a.sort() # 내림차순 정렬 a.sort(reverse = True) # 리스트 원소 뒤집기 a.reverse() # 특정 인덱스에 데이터 추가 a.insert(2,3) # 인덱스2에 3추가 # 특정 값인 데이터 개수 세기 a.count(3) # 특정 값 데이터 삭제 (인덱스가 낮은 것 하나) a.remove(1)
특정한 값을 갖는 원소 삭제하려면?
# 시간복잡도를 고려해서 remove는 사용하지 않는 것을 추천 a = [1,2,3,4,5,5,5] remove_set = {3,5} # remove_set에 포함되지 않은 값만을 저장 result = [i for i in a if i not in remove_set] # [1,2,4]
문자열 자료형
문자열 초기화
data = ‘Hellow World’ data = “Don’t you know \”Python\”?” print(data) # Don’t you know “Python”?
문자열 연산
a = “Hello” b = “World” a + ” ” + b # Hello World a * 3 # HelloHelloHello # 파이썬 문자열은 내부적으로 리스트와 같이 처리 (인덱싱,슬라이싱) 사용 가능 a = “ABCDEF” a[2:4] #CD
튜플 자료형
튜플은 한 번 선언된 값을 변경할 수 없다.
리스트는 대괄호[] 를 이용하지만 , 튜플은 소괄호 ()를 이용한다
그래프 알고리즘을 구현할 때 자주사용 다익스트라 최단 경로 알고리즘 (우선순위큐 사용) (비용,노드번호) 형태로 튜플을 묶어서 관리한다.
a = (1, 2, 3, 4) a[2] = 7 # TypeError
사전 자료형
사전 자료형 소개
key와 value의 쌍을 데이터로 가지는 자료형
튜플 자료형이 사전자료형의 키로 사용되는 경우 (Q 22 블록이동하기)
사전 자료형에 특정한 원소가 있는 지 검사할 때는 ‘원소 in 사전’의 형태를 사용할 수 있다. 리스트나 튜플에 대해서도 사용할 수 있는 문법
data = dict() data[‘사과’] = ‘Apple’ data[‘바나나’] = ‘Banana’ data[‘코코넛’] = ‘Coconut’ # {‘사과’: ‘Apple’, ‘바나나’: ‘Banana’, ‘코코넛’: ‘Coconut’} if ‘사과’ in data: print(“‘사과’를 키로 가지는 데이터가 존재합니다.”)
사전 자료형 관련 함수
키 데이터만 뽑아서 리스트로 이용할 때는 keys()함수
값 데이터만을 뽑아서 리스트로 이용할 때는 values() 함수를 이용한다.
data = dict() data[‘사과’] = ‘Apple’ data[‘바나나’] = ‘Banana’ data[‘코코넛’] = ‘Coconut’ # 키 데이터만 담은 리스트 key_list = data.keys() value_list = data.values() for key in key_list: print(data[key]) # Apple Banana Coconut
집합 자료형(Set)
집합 자료형 소개
중복을 허용하지 않는다
순서가 없다
특정한 데이터가 이미 등장한 적이 있는지 여부를 체크할 때 효과적이다.
# 집합 자료형 초기화 방법 data = set([1,1,2,3,4,4,5]) data = {1,2,3,4,5}
집합 자료형의 연산
합집합, 교집합, 차집합 연산이 있다.
# 집합 자료형 초기화 방법 a = set([1,2,3,4,5]) b = {3,4,5,6,7} a | b # 합집합 {1,2,3,4,5,6,7} a & b # 교집합 {3,4,5} a – b # 차집합 {1,2}
집합 자료형 관련 함수
data = set([1,2,3]) print(data) # 새로운 원소 추가 data.add(4) # 새로운 원소 여러 개 추가 data.update([5,6]) # 특정한 값을 갖는 원소 삭제 data.remove(3) print(data)
조건문
조건문 작성은 if ~ elif ~ else문을 이용한다.
비교 연산자
x == y x != y x > y x < y x >= y x <= y 논리 연산자 x and y x or y not x # x가 거짓일 때 참이다. 파이썬의 기타 연산자 파이썬에서는 추가적으로 'in 연산자'와 'not in 연산자'를 제공한다. 자료형 (리스트, 튜플, 문자열, 사전)에 사용된다. pass문 (조건문의 값이 참이라고 해도 아무것도 처리하고 싶지 않을 때) 조건부 표현식을 이용하면 if ~ else문을 한줄에 작성해 사용할 수 있다. 리스트에 있는 원소의 값을 변경해서 또 다른 리스트를 만들고자 할 때 매우 간결하게 사용가능 X in 리스트 # 리스트 안에 X가 들어가 있을 때 참(True)이다. X not in 문자열 # 문자열 안에 X가 들어가 있지 않을 때 참(True)이다. score = 85 if score >= 80: pass else: print(‘성적이 80점 미만입니다.’) # 1줄일 경우 줄이기 if score >= 80: result = “Success” else: result = “Fail” ## 조건부 표현식 result = “Success” if score >= 80 else “Fail” # 3항 연산자 result = score >= 80 and “Success” or “Fail” # 리스트에 있는 원소의 값을 변경해서 또 다른 리스트를 만들고자 할 때 매우 간결하게 사용가능 a = [1,2,3,4,5,5,5] remove_set = {3,5} result = [] for i in a: if i not in remove_set: result.append(i) result = [i for i in a if i not in remove_set]
반복문
while문
i = 1 result = 0 while i <= 9: result += i i += 1 print(result) for문 range(시작값, 끝값+1 ,증감) continue break result = 0 for i in range(1,10): result += 1 print(result) scores = [90, 85, 77, 65, 97] cheating_list = {2,4} for i in range(5): if i + 1 in cheating_list: continue if scores[i] >= 80: print(i + 1, ‘번 학생은 합격입니다’.)
이중 for문
플로이드 워셜 알고리즘
다이나믹 프로그래밍
# 구구단 for i in range(2,10): for j in range(1,10): print(i, “X”, j, “=”, i*j) print()
함수
동일한 알고리즘을 반복적으로 수행해야 할 때 사용
매개변수나 return문은 존재하지 않을 수도 있다.
def add(a,b): return a + b print(add(3,7)) def add(a, b): print(‘함수의 결과:’, a+b) # 매개변수를 직접 지정해 줄 수도 있다. add(b = 3, a = 7)
global
함수 안에서 함수 밖의 변수 데이터를 변경해야 하는 경우
a = 0 def func(): global a a += 1 for i in range(10): func() print(a)
람다 표현식(Lambda Express)
특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다
람다식은 파이썬의 정렬 라이브러리를 사용할 때, 정렬 기준(Key)을 설정할 때에도 자주 사용한다.
def add(a, b): return a + b print(add(3,7)) # 람다 표현식으로 구현한 add() 메서드 print( (lambda a, b: a + b)(3,7) )
입출력
입력
map() 해당 리스트의 모든 원소에 int() 함수를 적용한다.
sys.stdin.readline() 입력을 최대한 빠르게 받아야하는 경우 readline()으로 입력하면 입력후 엔터가 줄 바꿈 기호로 인식, 공백 문자를 제거하려면 rstrip()함수를 사용해야한다.
# 데이터의 개수 입력 n = int(input()) # 각 데이터를 공백으로 구분하여 입력 data = list(map(int, input().split())) data.sort(reverse = True) print(data) # 공백을 기준으로 구분하여 적은수의 데이터 입력 n, m, k = map(int, input().split()
# 입력을 최대한 빠르게 받아야하는 경우 import sys # 문자열 입력받기 sys.stdin.readline().rstrip()
출력
print() 기본적으로 출력 이후에 줄 바꿈을 수행한다.
f-string
# 출력할 변수들 a = 1 b = 2 print(a,b)
출력 시 오류가 발생하는 소스코드 예시 (자바와 다름 주의)
# 출력할 변수들 answer = 7 print(“정답은 ” + answer + “입니다.”) # TypeError: can only concatenate str (not “int”) to str # 올바른 예 print(“정답은 ” + str(answer) + “입니다”) print(“정답은” , str(answer), “입니다”) # Python 3.6 이상 answer = 7 print(f”정답은 {answer}입니다.”)
주요 라이브러리 문법과 유의점
코딩테스트를 준비하며 반드시 알아야 하는 라이브러리 6가지
내장 함수 print(), input()과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함하고 있는 내장 라이브러리 itertools 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리, 순열과 조합 라이브러리를 제공 heapq 힙(Heap) 기능을 제공하는 라이브러리. 우선순위 큐 기능을 구현하기 위해 사용한다. bisect 이진탐색/이분탐색(Binary Search) 기능을 제공하는 라이브러리 Collections 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리 math 필수적인 수학적 기능을 제공하는 라이브러리
팩토리얼, 제곱급, 최대공약수(GCD), 삼각함수, 파이(pi)
내장 함수
result = [1,2,3,4,5] sum(result) #iterable 객체가 들어왔을 때 (반복 가능한 객체) 리스트, 사전자료형, 튜플자료형 등 min(7,3,5,2) max(7,3,5,2) result = eval( “(3+5) * 7” ) result = sorted([9,1,8,5,4]) # 오름차순 정렬 result = sorted([9,1,5,1,4], reverse=True) # 기존 객체는 변경되지 않으며 return 값이 존재한다. result.sort() # void 문이다 result가 변경된다. data = [(‘홍길동’, 35), (‘이순신’, 17), (‘아무개’, 88)] result = sorted(data, key = lambda x : x[1], reverse = True) print(result) # 위와 같은 값을 가진다. data.sort(key = lambda x: x[1], reverse = True) print(data) data = [“23”, “59”, “59”] print(“:”.join(data)) # 23:59:59
itertools
반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리
permutations (순열)
combinations (조합)
product (중복을 허용하는 순열)
combinations_with_replacement (중복을 허용하는 모든 조합)
순열 조합 모두 클래스이므로 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
from itertools import permutations, combinations, product, combinations_with_replacement data = [‘a’, ‘b’, ‘c’] # 데이터 준비 # 리스트에서 3개를 뽑아 나열하는 모든 경우를 출력 result = list(permutations(data,3)) # 모든 순열 구하기 print(result) result = list(combinations(data,2)) # 2개를 뽑는 모든 조합 구하기 print(result) result = list(product(data,repeat = 2)) # 2개를 뽑는 모든 순열 구하기 (중복 허용) print (result) result = list(combinations_with_replacement(data,2)) # 2개를 뽑는 모든 조합 구하기 (중복 허용) print (result) [(‘a’, ‘b’, ‘c’), (‘a’, ‘c’, ‘b’), (‘b’, ‘a’, ‘c’), (‘b’, ‘c’, ‘a’), (‘c’, ‘a’, ‘b’), (‘c’, ‘b’, ‘a’)] [(‘a’, ‘b’), (‘a’, ‘c’), (‘b’, ‘c’)] [(‘a’, ‘a’), (‘a’, ‘b’), (‘a’, ‘c’), (‘b’, ‘a’), (‘b’, ‘b’), (‘b’, ‘c’), (‘c’, ‘a’), (‘c’, ‘b’), (‘c’, ‘c’)] [(‘a’, ‘a’), (‘a’, ‘b’), (‘a’, ‘c’), (‘b’, ‘b’), (‘b’, ‘c’), (‘c’, ‘c’)]
heapq (Min heap)
힙기능을 위해 heapq 라이브러리를 제공
다익스트라 최단 경로 알고리즘등에서 우선운위 큐 기능을 구현하고자 할 때 사용 PriorityQueue 라이브러리를 사용할 수 있지만 코딩테스트 환경에서는 heapq가 더빠르게 동작함으로 heapq를 사용하자
최소 힙(min heap)으로 구성되어 있으므로 넣었다 빼는 것만으로 O(NlogN)에 오름차순 정렬이 완료된다. 보통 최소 힙 자료구조의 최상단 원소는 항상 ‘가장 작은’원소이기 때문이다
heapq.heappush() 삽입
heapq.heappop() 꺼냄
# 힙정렬(heap sort)을 heapq로 구현하는 예제 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)) return result result = heapsort([1,3,5,7,9,2,4,6,8,0]) print(result) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 부호를 사용하여 최대 힙(max heap) 구현 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)) 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]
bisect
이진탐색을 쉽게 구현할 수 있도록 하는 라이브러리
‘정렬된 배열’에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용
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)) # 2 print(bisect_right(a, x)) # 4 #’정렬된 리스트’에서 ‘값이 특정 범위에 속하는 원소의 개수’를 구하고자 할 때 사용 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)) # 2 # 값이 [-1, 3] 범위에 있는 데이터 개수 출력 print(count_by_range(a, -1, 3)) # 6
collections
유용한 자료구조를 제공하는 표준 라이브러리
deque 스택, 큐를 구현할 때 사용하는 라이브러리 가장 앞 원소추가, 가장 앞 원소제거에서 O(1)의 시간복잡도를 가진다 인덱싱, 슬라이싱 등은 사용할 수 없다. from collections import deque data = deque([2,3,4]) data.appendleft(1) data.append(5) data.pop() data.popleft() print(data) # deque([2, 3, 4]) print(list(data)) # [2, 3, 4]
Counter 등장 횟수를 세는 기능을 제공 리스트와 같은 iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다. 원소별 등장 횟수를 세는 기능이 필요할 때 짧은 코드로 이를 구현할 수 있다. from collections import Counter counter = Counter([‘red’, ‘blue’, ‘green’, ‘blue’, ‘blue’]) print(counter[‘blue’]) # ‘blue’가 등장한 횟수 출력 print(dict(counter)) # 사전 자료형으로 변환 list,set도 가능하고 두개가 같은 값을 가진다 # 3 # {‘red’: 1, ‘blue’: 3, ‘green’: 1}
math
수학적인 기능을 포함하고 있는 라이브러리
팩토리얼, 제곱근, 최대공약수(GCD) , Pi
import math print(math.factorial(5)) # 5 팩토리얼 출력 print(math.sqrt(7)) # 7의 제곱근 출력 print(math.gcd(21,14)) # 21과 14의 최대 공약수 , 7 print(math.pi) # 파이 출력 print(math.e) # 자연상수 출력
Python 코딩테스트 대비 문법들 정리
매번 알고리즘 문제를 풀 때, 필요한 개념을 그때그때 구글에 검색하는 식으로 여태까지 풀었습니다.
그러다 보니 매번 검색하게 되고, 정작 머리에는 하나도 안 남더라고요…
그래서 공부를 해야겠다 마음먹은 와중에 너무 깔끔하게 정리된 블로그 글이 있어서
코딩테스트를 풀 때 참고하고 싶어 필요한 부분만 제 블로그에 정리 글을 쓰게 되었습니다. 문제 시 비공개 처리하겠습니다!
참고한 블로그 글입니다!
https://covenant.tistory.com/141?category=874690
https://covenant.tistory.com/142?category=874690
1. 입력, 출력 방법
(1) 입출력 가속
input(), print()를 쓰다 보면 시간 초과가 나는 경우가 종종 있어서 조금이라도 시간을 단축하기 위해 사용합니다.
import sys N = int(sys.stdin.readline()) sys.stdout.write(N)
이런 식으로 사용할 수 있고, sys를 쓰는게 귀찮다면
from sys import stdin, stdout input = stdin.readline print = stdout.write N = int(input()) print(N)
이렇게 사용할 수 있습니다.
이때 주의할 점은 문자열을 입력받을 때 뒤에 strip()을 넣어주세요!
안그러면
까지 같이 입력받을 수 있습니다.
(2) 2차원 배열 입력받기
테스트 케이스가
3
1 2 3
4 5 6
7 8 9
이런 식으로 되어 2차원 배열을 입력 받아야 한다면
MAP = [list(map(int, input().split())) for _ in range(N)]
(3) 정수와 배열이 같은 줄에 들어오는 경우
테스트 케이스가
3 10 20 30
3 7 5 12
이런식으로 앞에 배열의 개수가 있고 뒤에 배열이 있는 경우는
N, *arr = map(int, input().split())
이렇게 따로 나눌 수 있습니다.
(4) 문자열을 한 글자씩 배열에 저장하는 경우
테스트 케이스가
3
AAAA
ABCA
AAAA
이고, 한 글자씩 배열에 담아서 사용하고 싶을 때 다음과 같은 방법을 사용합니다.
arr = [list(input()) for _ in range(N)]
이렇게 담으면
arr = [[‘A’, ‘A’, ‘A’, ‘A’] [‘A’, ‘B’, ‘C’, ‘A’] [‘A’, ‘A’, ‘A’, ‘A’]]
다음과 같이 저장됩니다.
2. 진법 계산
(1) 10진수 -> 2, 8, 16진수
bin(42) # ‘0b101010’ oct(42) # ‘0o52’ hex(42) # ‘0x2a’
(2) 2, 8, 16진수 -> 10진수
int(‘0b111100’, 2) # 60 int(‘0o74’, 8) # 60 int(‘0x3c’, 16) # 60
3. 문자열
(1) 문자열 거꾸로 하기
alph = “ABCD” alph[::-1] # alph = “DCBA”
결과는 “DCBA”가 됩니다.
(2) 아스키코드 변환
# 문자열 -> 아스키코드 print ord(‘A’) # 65 # 아스키코드 -> 문자열 print chr(65) # A
4. 리스트
(1) 리스트 초기화
가로가 N, 세로가 M인 그래프 배열을 초기화할 때 다음과 같이 사용합니다.
N, M = map(int, input().split()) arr = [[0] * N for _ in range(M)]
(2) 리스트 요소를 거꾸로 하기
arr = [1, 2, 3] arr.reverse() # arr = [3, 2, 1]
(3) 리스트 내의 특정한 값의 개수
arr = [1, 2, 3] arr.count(1) # 1
(4) 리스트 정렬
리스트의 요소가 리스트인 경우 lambda를 통해서 우선순위를 결정합니다.
다음은 첫 번째 요소를 기준으로 정렬하고 첫번째 요소가 같을 경우, 두 번째 요소를 기준으로 정렬한다는 의미입니다.
arr.sort() # 오름차순 arr.sort(reverse=True) # 내림차순 arr.sort(key=lambda x:(x[0], x[1]))
5. 삼항 연산자
if 내의 조건이 맞다면 a, 틀리면 b
res = a if a > b else b
6. 리스트 변환 (문자열 변환)
(1) 문자열 -> 리스트
num_str = “1,3,2” print(num_str.split(‘,’)) # [‘1’, ‘3’, ’12’]
split()을 사용하면 , 기준으로 리스트로 변환할 수 있습니다.
(2) 리스트 -> 문자열
num_list = [‘1’, ‘3’, ‘2’] ‘,’.join(num_list) # ‘1,3,2’
join()을 사용하면 , 이 리스트 요소에 배치되는 문자열로 변환할 수 있습니다.
7. 값이 알파벳인지 숫자인지 판별하기
(1) 알파벳 확인
“a”.isalpha() # True “3”.isalpha() # False
판별하고 싶은 문자 뒤에 isalpha()를 붙이면, 알파벳일 경우 True, 아닐 경우 False
(2) 숫자 확인
“3”.isdigit() # True “a”.isdigit() # False
판별하고 싶은 문자 뒤에 isalpha()를 붙이면, 숫자일 경우 True, 아닐 경우 False
8. 2차원 배열 뒤집기
board = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] new_board = list(map(list, zip(*board))) print(new_board) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
파이썬 문법 정리 for 코딩 테스트
이것이 취업을 위한 코딩 테스트다 with 파이썬
나만을 위한 파이썬 문법 정리
수의 지수 표현
a = 1e9 // 1,000,000,000 a = 75.25e1 // 752.5 a = 3954e-3 // 3.954
반올림 round 함수
round(123.456, 2) // 123.46
리스트 컴프리헨션
# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트 array = [ i for i in range(20) if i % 2 == 1 ] # 1부터 9까지의 수의 제곱 값을 포함하는 리스트 array = [ i**2 for i in range(10) ] # 2차원 리스트 초기화 n = 3 m = 3 array = [[0] * m for _ in range(n)] print(array)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]리스트 관련 기타 메서드
변수.reverse() # 리스트의 순서 모두 뒤집음 변수.count(특정 값) # 리스트에서 특정 값을 가지는 데이터의 개수 변수.remove(특정 값) # 특정 값 가지는 원소 제거, 값이 여러 개면 하나만 제거 append() 함수는 O(1)에 실행되지만 insert() 함수는 O(N)에 실행된다 # 원소를 삽입한 뒤에, 리스트의 원소 위치를 조정해줘야 하기 때문 특정한 값의 원소를 모두 제거하려면? a = [1, 2, 3, 4, 5] remove_set = [1, 4] result = [i for i in a if i not in remove_set] // [2, 3, 5]
문자열 연산
a = “Hello” b = “World” print(a+b) print(a + ” ” + b)
HelloWorld
Hello World
튜플
#튜플 자료형은 리스트와 거의 비슷하지만 다음과 같은 차이가 있다. -튜플은 한 번 선언된 값을 변경할 수 없다. -리스트는 대괄호를([])를 이용하지만, 튜플은 소괄호(())를 이용한다 튜플 자료형은 그래프 알고리즘을 구현할 때 자주 사용된다.
Dictionary 관련 함수
data = dict() data[‘사과’] = ‘apple’ data[‘바나나’] = ‘banana’ data[‘코코넛’] = ‘coconut’ # 키 데이터만 담은 리스트 key_list = data.keys() # 값 데이터만 담은 리스트 value_list = data.values() # 각 기에 따른 값을 하나씩 출력 for key in key_list: print(data[key])
Set
# Set은 다음과 같은 특징이 있다. -중복을 허용하지 않는다. -순서가 없다. # Set 초기화 방법 1 data = set([1, 1, 2, 3, 4, 4, 5]) # Set 초기화 방법 2 data = {1, 1, 2, 3, 4, 4, 5}
# Set의 연산 a = set([1, 2, 3, 4, 5]) b = set([3, 4, 5, 6, 7]) print(a | b) # 합집합 print(a & b) # 교집합 print(a – b) # 차집합
{1, 2, 3, 4, 5, 6, 7}
{3, 4, 5}
{1, 2}
Set 관련 함수 # 하나의 원소을 추가할 때는 add() data.add(4) # 여러 개의 원소를 추가할 때는 update() data.update([5, 6]) # 특정한 값을 갖는 원소 삭제 data.remove(3)
입력
입력의 개수가 많은 경우에는 input() 함수를 그대로 사용하지는 않는다. 파이썬의 기본 input() 함수는 동작 속도가 느려서 시간 초과로 오답 판정을 받을 수 있기 때문 이 경우 파이썬의 sys 라이브러리에 정의되어 있는 sys.stdin.readline() 함수를 이용한다. 다음과 같은 방식으로 사용하며 input() 함수와 같이 한 줄씩 입력받기 위함 import sys sys.stdin.readline().rstrip() sys 라이브러리를 사용할 때는 한 줄 입력을 받고 나서 rstrip() 함수를 꼭 호출해야 한다.
출력
문자열과 수를 함께 출력해야 되는 경우 단순히 + 연산자를 이용하여 문자열과 수를 더하면 오류가 발생한다. # 오류 발생 코드 answer = 7 print(“정답은 ” + answer + “입니다.”) # 해결법 -str() 함수를 이용하여 출력하고자 하는 변수 데이터를 문자열로 바꾸어줌 -각 자료형을 콤마(,)를 기준으로 구분하여 출력 # f -파이썬 3.6 이상의 버전부터 f-string 문법 사용 가능 -f-string은 문자열 앞에 접두사 ‘f’를 붙임으로써 사용할 수 있다 print(f”정답은 {answer}입니다”)
표준 라이브러리
# 코딩 테스트를 준비하며 반드시 알아야 하는 라이브버리는 6가지 내장함수 : print(), input()과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함하고 있는 기본 내장 라이브러리 itertools : 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리, 순열과 조합 라이브러리를 제공 heapq : 힙(Heap) 기능을 제공하는 라이브러리. 우선순위 큐 기능을 구현하기 위해 사용한다. collections : 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리이다. math : 필수적인 수학적 기능을 제공하는 라이브러리이다. 팩토리얼, 제곱근, 최대공약수, 삼각함수 관련 메서드부터 파이(pi)와 같은 상수를 포함하고 있다.
permutations
# 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)을 계산해준다. # permutations는 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다. 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’, ‘B’, ‘A’)]combinations
# combinations는 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산한다. # combinations는 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다. from itertools import combinations data = [‘A’, ‘B’, ‘C’] result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합 구하기 print(result)
[(‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘C’)]product
# product는 permutations와 같이 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산한다. 다만 원소를 중복하여 뽑는다 <- 중요! # product 객체를 초가화 할 때는 데이터의 수를 repeat 속성값으로 넣어준다. # product는 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다. from itertools import product data = [1, 2, 3] result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기(중복 허용) print(result) [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] combination_with_replacement # combination_with_replacement는 combinations와 같이 리스트와 같은 iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산한다. # 다만 원소를 중복해서 뽑는다. # combination_with_replacement는 클래스이므로 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다. from itertools import combinations_with_replacement data = [1, 2, 3] result = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기(중복 허용) print(result) [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)] 정리 permutations # 모든 순열 구하기 combinations # 2개를 뽑는 모든 조합 구하기 product # 2개를 뽑는 모든 순열 구하기(중복 허용) combination_with_replacement # 2개를 뽑는 모든 조합 구하기(중복 허용) heapq # 파이썬의 힙은 최소 힙으로 구성되어 있으므로 단순히 원소를 힙에 전부 넣었다가 빼는 것만으로도 시간 복잡도 O(NlogN)에 오름차순 정렬이 완료된다 # heapq.heappush() // 힙에 원소 삽입 # heapq.heappop() // 힙에서 원소 꺼냄 # 파이썬에서는 최대 힙을 제공하지 않는다. 따라서 heapq 라이브러리를 이용하여 최대 힙을 구현해야 할 때는 원소의 부호를 임시로 변경하는 방식을 사용한다. 삽입 전에 부호를 반대로 바꾸었다가, 꺼낸 뒤에 다시 원소의 부호를 바꾸면 된다. import heapq def heapsort(iterable): h = [] result = [] for value in iterable: heapq.heappush(h, -value) for _ in range(len(h)): result.append(-heapq.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] bisect # 파이썬에서는 이진 탐색을 쉽게 구현할 수 있도록 bisect 라이브러리를 제공한다. # bisect 라이브러리는 '정렬된 배열'에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다. # 이 두 메서드는 시간 복잡도 O(logN)에 동작한다. bisect_left(a, x) #정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드 bisect_right(a, x) #정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드 # 예를 들어 정렬된 리스트 [1, 2, 4, 4, 8]이 있을 때, 새롭게 데이터 4를 삽입하려 한다. list = [1, 2, 4, 4, 8] bisect_left(list, 4) # 2 반환 bisect_right(list, 4) # 4 반환 collections deque # 보통 파이썬에서는 deque를 이용해 큐를 구현 # 리스트 자료형에서 앞쪽에 있는 원소를 삭제하거나 앞쪽에 새 원소를 삽입할 때의 시간복잡도는 O(N)이다. 하지만 deque의 경우 O(1) # deque에서는 리스트와 다르게 인덱싱, 슬라이싱 등의 기능을 사용할 수 없다. 다만 연속적으로 나열된 데이터의 시작 부분이나 끝부분에 데이터를 삽입하거나 삭제할 때는 매우 효과적으로 사용될 수 있다 # deque는 스택이나 큐의 대용으로 사용될 수 있다. popleft() # 첫 번째 원소 제거 pop() # 마지막 원소 제거 appendleft() # 첫 번째 인덱스에 원소 삽입 append() # 마지막 인덱스에 원소 삽입 # 따라서 deque를 queue로 이용할 때, 원소를 삽입할 때는 append()를 사용하고 삭제할 때에는 popleft()를 사용하면 된다. Counter # Counter는 등장 횟수를 세는 기능을 제공한다. from collections import Counter counter = Counter([1, 1, 1, 2, 2, 3]) print(counter[1]) print(counter[2]) print(counter[3]) 3 2 1 math import math print(math.factorial(5)) # 5! 출력 print(math.sqrt(7) # 루트7 출력 print(math.gcd(21, 14)) # 21과 14의 최대 공약수 출력 print(math.pi) # 파이(pi) 출력 print (math.e) # 자연상수 e 출력 빠르게 입력받기 입력 데이터의 개수가 많은 문제에 input() 함수를 사용하면 동작 속도가 느려서 시간 초과로 오답 판정을 받을 수 있다. 입력 데이터가 많은 문제는 sys 라이브러리의 readline() 함수를 이용하면 시간 초과를 피할 수 있다. import sys input_data = sys.stdin.readline().rstrip() print(input_data)
코딩테스트 대비 공부방법 (파이썬)
728×90
내 블로그를 찾아오시는 분들 대부분이 코딩 테스트 후기를 보고 오시는 것 같다.
(네이버 코테, 카카오 코테, 토스 코테, 라인 코테…)
그리고 댓글로 코딩테스트 혹은 비전공자 프로그래밍 공부 방법에 대해 물어보시는 분이 많아서 포스팅한다.
모든 사람에게 통용되는 방법은 아니겠지만, 비전공자로서 코딩 테스트를 대비하는 약간의 팁?
내가 했던 공부 방법과 문제풀이 사이트를 소개한다. 참고로 파이썬 기준!
일단 나는 Hello World! 가 뭔지도 모를 때 무작정 파이썬 수업부터 들었다.
처음부터 유료 강의 결제하기는 망설여져서 edwith에서 이지선 교수님 파이썬 기초 강의를 들었는데,
프로그래밍을 전혀 모르고 시작했지만 쉽게 설명해주시고
커리큘럼도 체계적이면서 필요한 부분만 빠르게 짚어주셔서 진도도 빨리 나갈 수 있었다.
혹시 필요하신 분이 있을까 싶어서 링크 ↓
www.edwith.org/sogang_python
이 강의 듣다가 중간에 두잇 점프 투 파이썬 교재도 구매해서
강의랑 겹치는 파트를 따로 더 공부하니까 이해도 쉽고 스킬도 많이 늘었다.
이렇게 강의를 다 듣고 교재도 설렁설렁 보다 보면 실제로 코드를 쳐보고 싶어 진다.
이때 백준 사이트에 들어가서 단계별로 풀어보기 중에 1~7(입출력~문자열) 정도 풀어보면 된다.
www.acmicpc.net/step
문제를 풀다 보면 쉽게 풀리는 것도 있고, 시간이 좀 걸리는 부분도 있다.
문제 풀고, 다른 사람 코드(주로 런타임이 짧은 코드)도 보면서 공부하다 보면
이제 좀 더 어려운 문제로 들어가도 되겠다 싶은 순간이 온다.
이때 자료구조와 알고리즘 공부를 시작하면 된다.
나는 알고리즘 교재는 따로 구매하지 않고 자료구조 책만 본 다음에
필요한 알고리즘은 그때그때 인터넷으로 검색해봤다.
book.naver.com/bookdb/book_detail.nhn?bid=13148682
당시엔 파이썬 자료구조 책이 거의 없어서 이 책으로 공부하긴 했는데 ‘파이썬 알고리즘 자료구조’로 검색해보니까
더 괜찮은 책도 많이 나와있는 것 같다. 그중에 마음에 드는 것 하나 고르면 되겠다.
이 책에는 파이썬에서 잘 안 쓰는 개념인 ‘포인터’를 파이썬으로 직접 구현하는데,
이 부분이 되게 어려웠지만 성장도 많이 하게 된 부분이라 좋았다.
자료구조와 알고리즘 공부를 하고, 백준에서 관련 문제를 찾아서 풀어보면 거의 완벽하다.
그리고 백준에 각종 기업 코딩 테스트 문제도 있어서 (완전 똑같지는 않고 약간 변형) 풀어보면 좋다.
백준 말고 사용해본 사이트는 프로그래머스, 삼성 sw expert academy가 있다.
일단 프로그래머스는 단계별로 문제가 있고, 조금 더 기업 코테에 가깝다.
그리고 SQL 코테도 있어서 연습하기가 좋다.
만약 기업 코테에 SQL이 나온다고 하면 프로그래머스에 SQL 키트는 다 풀어보고 응시하는 게 도움이 될 것이다.
삼성 익스퍼트는 보통 삼성 역량테스트 준비를 위해 많이 사용한다.
그런데 이번 해(2020년) 코로나 때문에 한 번도 시험이 열리지가 않아서 안타깝다..ㅠ
익스퍼트 사이트도 괜찮은 문제가 많지만, 파이썬의 경우에 시간제한이 꽤 빡빡한 경우도 있다. (백준도 가끔)
아마 원래는 역량테스트 응시 언어에 파이썬이 없었는데, 2년 전? 쯤부터
파이썬이 허용되어서 아직 런타임 설정이 제대로 안된 것 같다.
그리고 기업 코테용 알고리즘 공부가 막막하다면 일단
브루트 포스 / BFS와 DFS / 트리 / 그래프 탐색 정도로 시작해서 점점 깊게 배우면 좋을 것 같다.
재귀의 경우에는 많은 문제에서 유용하게 쓰이지만 for문으로 돌려도 될 것을 재귀로 돌리면 시간이 매우 오래 걸리므로
효율성을 잘 따져보고 쓰는 게 좋다. 내가 재귀를 좋아해서 이렇게 시험을 망친 경우가 많다…ㅎ
약간의 팁이 될 수 있는 표준 라이브러리를 소개하자면
import math import itertools import collections
이렇게 3개가 있다. 각 기능은 직접 찾아보고 응용해보길 권장한다.
다만 기업에 따라 표준 라이브러리도 못쓰게 막는 곳도 있으니,
그런 경우를 대비해서 해당 기능을 따로 구현할 줄 알아야 한다.
생각나는 대로 쭉 써봤는데, 누군가에게 도움이 되었으면 좋겠다.
물론 이 글은 정답이 아니고, 더 나은 공부 방법도 있겠지만
나는 이렇게 공부했다~ 하고 공유하는 정도로 봐주면 좋겠다.
728×90
코딩테스트를 위한 python 문법
반응형
코딩테스트를 위한 python 문법
코테 언어를 고민하다 파이썬으로 정착하기로 생각하면서 필요한 문법 정리
출처: 이코테
숫자 자료형 ( Number )
정수형
a = 1 b = 0 c = -1 print(a, b, c) # 1 0 -1
실수형
a = 1.23 b = 3. c = -13.2 print(a, b, c) # 1.23 3.0 -13.2 # 지수형 d = 1e4 e = 3000e-2 print(d, e) # 10000.0 30.0
컴퓨터의 시스템은 수 데이터를 처리할 때 2진수를 이용하며, 실수를 처리할 때 부동 소수점 방식을 이용한다.
2진수 체계 소수계산의 오차가 발생하는 대표적인 예시로는 0.3 + 0.6 이 0.8999999999999999 이 나오는 경우이다. 파이썬에서 이를 처리하는 방법으로는 round() 함수(반올림)를 이용한다.
a = 0.3 + 0.6 print(a, round(a)) # 0.8999999999999999 1
연산
a = 1 b = 2 print(a / b) # 나누기 0.5 print(a % b) # 나머지 1 print(a // b) # 몫 0 print(a ** b) # 거듭제곱 1
리스트 자료형 ( List )
c++의 vector, JS의 array와 유사함
선언
a = [1, 2, 3, 4] print(a) # [1,2,3,4]
인덱싱, 슬라이싱
a = [1, 2, 3, 4] # 인덱싱 print(a[0]) # 1 print(a[-1]) # 4 print(a[-2]) # 3 # 변경 a[3] = 5 print(a) # [1, 2, 3, 5] # 슬라이싱 print(a[1:3]) # [2, 3] print(a[:-1]) # [1, 2, 3] print(a[1:-1]) # [2, 3]
리스트 컴프리헨션 ( list comprehension )
# 1차원 리스트 초기화 a = [0] * 5 print(a) # [0, 0, 0, 0, 0] # 2차원 리스트 초기화 a = [[0] * 5 for _ in range(3)] print(a) # [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] # 1~9 중 홀수인 제곱수 리스트 a = [i**2 for i in range(1, 10) if i % 2 == 1] # [1, 9, 25, 49, 81]
리스트 메소드
a = [2, 3, 4] # 추가 a.append(1) # [2, 3, 4, 1] # 정렬 a.sort() # 오름차순 [1, 2, 3, 4] a.sort(reverse = True) # 내림차순 [4, 3, 2, 1] a.reverse() # 뒤집기 [1, 2, 3, 4] # 삽입 (idx, value) a.insert(1, 2) # [1, 2, 2, 3, 4] # 개수 a.count(2) # 2 # 제거 ( 앞에서 가장 먼저 나오는 하나만 제거) a.remove(2) # [1, 2, 3, 4]
문자열 자료형 ( String )
# 선언 a = ‘Hi’ print(a) # Hi # 연산 b = ‘Bye’ print(a + ” ” + b) # Hi Bye # 반복 print(a * 3) # HiHiHi # 슬라이싱 print(b[1:3]) # ye
튜플 자료형 ( Tuple )
# 선언 a = (1, 2, 3, 4) print(a) # (1, 2, 3, 4) # 선언 후 변경 불가 a[2] = 3 # ‘tuple’ object does not support item assignment
딕셔너리 자료형 ( Dictionary )
key: value 쌍
data = {} data[‘a’] = ‘aaa’ # { ‘a’: ‘aaa’ } data[‘b’] = ‘bbb’ # { ‘a’: ‘aaa’, ‘b’: ‘bbb’ } # key data.keys() # dict_keys([‘a’, ‘b’]) # value data.values() # dict_values([‘aaa’, ‘bbb’])
셋 자료형 ( Set )
중복 불가, 순서 없음
data = set([1, 1, 2]) print(data) # { 1, 1, 2 } data = { 1, 1, 2 } print(data) # { 1, 1, 2 }
연산
a = { 1, 2, 3 } b = { 3, 4, 5 } # 합집합 print(a | b) # {1, 2, 3, 4, 5} # 교집합 print(a & b) # { 3 } # 차집합 print(a – b) # { 1, 2 }
메소드
a = { 1, 2, 3 } # 추가 a.add(4) # { 1, 2, 3, 4 } # 여러 개 추가 a.update([5, 6]) # { 1, 2, 3, 4, 5, 6 } # 삭제 a.remove(3) # { 1, 2, 4, 5, 6}
조건문
if con: elif con: else: 1 in [1, 2, 3] # True 4 not in [1, 2, 3] # True
반복문
# while while con: # for for var in list:
함수
# 함수 def add(a, b): return a + b add(1, 2) # 3 # lambda 표현식 add = lambda a, b: a + b add(1, 2) # 3
입출력
# 개수 n = int(input()) # 데이터 data = list(map(int, input().split())) # readline 사용시 import sys data = sys.stdin.readline().rstrip()
주요 라이브러리
내장함수
# 합 sum([1, 2, 3]) # 6 # 최소값, 최대값 min(1, 2, 3) # 1 max(1, 2, 3) # 3 # 문자열 > 수식 eval(“3+5”) # 8 # key 정렬 sorted([(‘에이’, 5), (‘비’, 1), (‘씨’, 2)], key = lambda x: x[1]) # [(‘비’, 1), (‘씨’, 2), (‘에이’, 5)]
itertools – 순열, 조합
# 순열 from itertools import permutations a = [‘A’, ‘B’, ‘C’] res = list(permutations(a, 3)) print(res) # [(‘A’, ‘B’, ‘C’), (‘A’, ‘C’, ‘B’), (‘B’, ‘A’, ‘C’), (‘B’, ‘C’, ‘A’), (‘C’, ‘A’, ‘B’), (‘C’, ‘B’, ‘A’)] # 조합 from itertools import combinations a = [‘A’, ‘B’, ‘C’] res = list(combinations(a, 2)) print(res) # [(‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘A’), (‘B’, ‘C’), (‘C’, ‘A’), (‘C’, ‘B’)] # 중복순열 from itertools import product a = [‘A’, ‘B’, ‘C’] res = list(product(a, repeat = 2)) print(res) # [(‘A’, ‘A’), (‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘A’), (‘B’, ‘B’), (‘B’, ‘C’), (‘C’, ‘A’), (‘C’, ‘B’), (‘C’, ‘C’)] # 중복조합 from itertools import combinations_with_replacement a = [‘A’, ‘B’, ‘C’] res = list(combinations_with_replacement(a, 2)) print(res) # [(‘A’, ‘A’), (‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘B’), (‘B’, ‘C’), (‘C’, ‘C’)]
heapq – 힙, 우선순위큐
파이썬의 힙은 최소힙으로 구성되어 있어서, 원소 전체를 힙에 넣었다 빼는 것으로 오름차순 정렬이 안료됨. ( O(NlogN))
# 추가 heapq.heappush() # 제거 heapq.heappop() # 정렬 import heapq def heapsort(iterable): h = [] res = [] for value in iterable: heapq.heappush(h, value) # (h, -value) for i in range(len(h)): res.append(heapq.heappop(h)) # ( -heapq.heappop(h) ) return res res = heapsort([1,3,5,7,9,2,4,6]) print(res) # [1, 2, 3, 4, 5, 6, 7, 9] #반대로 내림차순의 경우엔 푸시와 팝의 부호를 바꾸는 방법으로 진행
bisect – 이진 탐색
이진탑색 / 정렬된 배열에서 효과적으로 사용 가능
배열 a 에서 각각 왼쪽과 오른쪽에서 삽입할 원소 x 의 인덱스를 찾는 함수
bisect_left(a, x) bisect_right(a, x)
collections – 덱, 카운터
덱(deque) – 인덱싱, 슬라이싱 불가능 / 데이터의 시작과 끝 부분 데이터 추가/삭제가 용이
from collections import deque data = deque([2, 3, 4]) data.appendleft(1) data.append(5) print(data) # deque([1, 2, 3, 4, 5])
카운터(counter) – 개수
from collections import Counter counter = Counter([‘red’, ‘blue’, ‘red’, ‘green’, ‘blue’]) print(counter[‘blue’]) # 2 print(dict(counter)) # {‘red’: 2, ‘blue’: 2, ‘green’: 1 }
math – 팩토리얼, 제곱근, gcd, 삼각함수, 수학 상수
import math print(math.factorial(5)) # 120 print(math.sqrt(4)) # 2.0 print(math.gcd(25, 15)) # 5
반응형
[이것이 코딩 테스트다] 1. 코딩 테스트 출제 경향 분석 및 파이썬 부수기
728×90
반응형
www.youtube.com/watch?v=m-9pAwq1o3w&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=1
이것이 코딩 테스트다 소스코드
https://github.com/ndb796/python-for-coding-test
온라인 저지(Online Judge) 란?
프로그래밍 대회나 코딩 테스트에서 나올 법한 문제를 시험해보는 온라인 시스템
온라인 개발 환경 (Python)
Team 노트 Sample
알고리즘 코딩 테스트를 준비하는 과정에서 자신만의 소스코드를 관리하는 습관을 들이면 좋음
자신이 자주 사용하는 알고리즘 코드를 라이브러리화 하면 좋음
https://github.com/ndb796/Python-Competitive-Programming-Team-Notes
IT 기업 코딩 테스트 최신 출제 경향
알고리즘 코딩 테스트 유형 분석
구현: 33%
BFS/DFS: 20.9%
그리디: 19.8%
정렬: 8.2%
다이나믹 프로그래밍: 8.2%
이진 탐색: 3.8%
최단 경로: 3.3%
그래프 이론: 2.7%
2019
삼성전자: 완전 탐색, 시뮬레이션, 구현, DFS/BFS
카카오: 구현, 이진 탐색, 자료구조, 추천 시스템 개발
라인: 탐색, 구현, 문자열, 다이나믹 프로그래밍, 자료구조, 완전 탐색, 구현
2018
삼성전자: 완전 탐색, 구현, DFS/BFS, 시뮬레이션
카카오: 그리디, 구현, 자료구조, 시뮬레이션 개발
라인: 탐색, 그리디, 다이나믹 프로그래밍, 구현, 탐색, 그리디, 구현, 문자열
알고리즘 성능 평가
복잡도(Complexity)
복잡도는 알고리즘의 성능을 나타내는 척도 시간 복잡도: 특정한 크기의 입력에 대하여 알고리즘의 수행 시간 분석 공간 복잡도: 특정한 크기의 입력에 대하여 알고리즘의 메모리 사용량 분석
동일한 기능을 수행하는 알고리즘이 있다면 일반적으로 복잡도가 낮을수록 좋은 알고리즘
빅오 표기법(Big-O Natation)
가장 빠르게 증가하는 항만을 고려하는 표기법 함수의 상한만을 나타내게 됨
예를 들어 연산 횟수가 3N³ + 5N² + 1,000,000인 알고리즘이 있다면 빅오 표기법에서는 차수가 가장 큰 항만 남기므로 O(N³)으로 표현된다
빅오 표기법 명칭 O(1) 상수 시간(Constant time) O(logN) 로그 시간(Log time) O(N) 선형 시간 O(NlogN) 로그 선형 시간 O(N²) 이차 시간 O(N³) 삼차 시간 O(2ⁿ) 지수 시간
알고리즘 설계 Tip
일반적으로 CPU 기반의 개인 컴퓨터나 채점용 컴퓨터에서 연산 횟수가 5억을 넘어가는 경우 C언어를 기준으로 통상 1 ~ 3초 가량의 시간이 소요됨 Python을 기준으로 통상 5 ~ 15초 가량의 시간이 소요됨 PyPy의 경우 때때로 C언어보다도 빠르게 동작하기도 함 O( N³ )의 알고리즘을 설계한 경우 N의 값이 5000이 넘는다면 천이백오십억이 연산횟수
Python 이 1초에 5천만번 정도의 계산을 처리할 수 있다고 하면 약 2500초 정도가 소요됨
채점용 서버에서는 Python이 1초에 2천만번 정도의 연산만 처리할 수 있다고 가정하고 문제를 접해야함 코딩 테스트 문제에서 시간제한은 통상 1 ~ 5초가량 이라는 점에 유의 혹여 문제에 명시되어 이씾 않은 경우 대략 5초 정도라고 생각하고 문제를 푸는 것이 합리적임
요구사항에 따라 적절한 알고리즘 설계학
문제에서 가장 먼저 확인해야 하는 내용은 시간제한(수행시간 요구사항) 임
임 시간제한이 1초인 문제를 만났을 때 일반적인 기준은 다음과 같습니다 N의 범위가 500인 경우: 시간 복잡도가 O( N³ )인 알고리즘을 설계하면 문제를 풀 수 있음 N의 범위가 2,000인 경우: 시간 복잡도가 O( N² )인 알고리즘을 설계하면 문제를 풀 수 있음 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) # 수행 시간 출력
선택 정렬과 기본 정렬 라이브러리 수행 시간 비교
from random import randint import time # 배열에 10,000개의 정수를 삽입 array = [] for _ in range(10000): array.append(randint(1, 100)) # 1부터 100 사이의 랜덤한 정수 # 선택 정렬 프로그램 성능 측정 start_time = time.time() # 선택 정렬 프로그램 소스코드 for i in range(len(array)): min_index = i # 가장 작은 원소의 인덱스 for j in range(i + 1, len(array)): if array[min_index] > array[j]: min_index = j array[i], array[min_index] = array[min_index], array[i] # 스와이프 end_time = time.time() # 측정 종료 print(“선택 정렬 성능 측정:”, end_time – start_time) # 수행 시간 출력 # 기본 정렬 라이브러리 성능 측정 start_time = time.time() # 기본 정렬 라이브러리 사용 array.sort() end_time = time.time() # 측정 종료 print(“기본 정렬 라이브러리 성능 측정:”, end_time – start_time) # 수행 시간 출력
실행 결과
선택 정렬 성능 측정: 37.918421268463135 기본 정렬 라이브러리 성능 측정: 9.083747863769531e-05
자료형
모든 프로그래밍은 결국 데이터를 다루는 행위 자료형에 대한 이해는 프로그래밍의 길에 있어서의 첫걸음이라고 할 수 있음
파이썬의 자료형으로는 정수형, 실수형, 복소수형, 문자열, 리스트, 튜플, 사전 등이 있음 파이썬의 자료형은 필수적으로 알아 두어야 함
정수형
정수형(Integer)은 정수를 다루는 자료형 양의 정수, 음의 정수, 0이 포함됨
코딩 테스트에서 출제되는 많은 문제들은 정수형을 주로 다루게 됨
# 양의 정수 a = 1000 print(a) # 음의 정수 a = -7 print(a) # 0 a = 0 print(a)
실행 결과
1000 -7 0
실수형
실수형(Real Number)은 소수점 아래의 데이터를 포함하는 수 자료형 파이썬에서는 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리됨 소수부가 0이거나, 정수부가 0인 소수는 0을 생략하고 작성할 수 있음
# 양의 실수 a = 157.93 print(a) # 음의 실수 a = -1837.2 print(a) # 소수부가 0일 때 0을 생략 a = 5. print(a) # 정수부가 0일 때 0을 생략 a = -.7 print(a)
실행 결과
157.93 -1837.2 5.0 -0.7
지수 표현 방식
파이썬에서는 e나 E를 이용한 지수 표현 방식을 이용 할 수 있음 e나 E 다음에 오는 수는 10의 지수부를 의미 예를 들어 1e9라고 입력하게 되면 10의 9제곱(1,000,000)이 됨 유효숫자eⁿ = 유효숫자 X 10ⁿ
지수 표현 방식은 임의의 큰 수를 표현하기 위해 자주 사용됨
최단 경로 알고리즘에서는 도달할 수 없는 노드에 대하여 최단 거리를 무한(INF) 로 설정하곤 함
이때 가능한 최댓값이 10억 미만이라면 무한(INF)의 값으로 1e9를 이용할 수 있음
# 1,000,000,000의 지수 표현 방식 a = 1e9 print(a) # 752.5 a = 75.25e1 print(a) # 3.954 a = 3954e-3 print(a)
실행 결과
1000000000.0 752.5 3.954
실수형 더 알아보기
오늘날 가장 널리 쓰이는 IEEE754 표준 에서는 실수형을 저장하기 위해 4바이트 혹은 8바이트의 고정된 크기의 메모리를 할당하므로
컴퓨터 시스템은 실수 정보를 표현하는 정확도에 한계를 가짐
에서는 실수형을 저장하기 위해 4바이트 혹은 8바이트의 고정된 크기의 메모리를 할당하므로 예를 들어 10진수 체계에서는 0.3과 0.6을 더한 값이 0.9로 정확히 떨어진다 하지만 2진수에서는 0.9를 정확히 표현할 수 있는 방법이 없음 컴퓨터는 최대한 0.9와 가깝게 표현하지만 미세한 오차가 발생하게 됨
a = 0.3 + 0.6 print(a) if a == 0.9: print(True) else: print(False)
실행 결과
0.8999999999999999 False
개발과정에서 실수 값을 제대로 비교하지 못해서 원하는 결과를 얻지 못할 수 있음
이럴 때는 round() 함수 를 이용할 수 있으며 이러한 방법이 권장됨
를 이용할 수 있으며 이러한 방법이 권장됨 예를 들어 123.456을 소수 셋째 자리에서 반올림하려면 round(123.456, 2) 라고 작성 결과는 123.46
라고 작성
a = 0.3 + 0.6 print(round(a, 4)) if round(a, 4) == 0.9: print(True) else: print(False)
실행 결과
0.9 True
수 자료형의 연산
수 자료형에 대하여 사칙연산 과 나머지 연산자가 많이 사용됨
과 나머지 연산자가 많이 사용됨 단 나누기 연산자( / )를 주의해서 사용해야 함 파이썬에서 나누기 연산자( / )는 나눠진 결과를 실수형으로 반환함
)를 주의해서 사용해야 함 다양한 로직을 설계할 때 나머지 연산자( % ) 를 이용해야 할 때가 많음 예시: a가 홀수인지 체크해야 하는 경우
를 이용해야 할 때가 많음 파이썬에서는 몫을 얻기 위해 몫 연산자( // ) 를 사용
를 사용 이외에도 거듭 제곱 연산자(“)**를 비롯해 다양한 연산자들이 존재
a = 7 b = 3 # 나누기 print(a / b) # 나머지 print(a % b) # 몫 print(a // b)
실행 결과
2.3333333333333335 1 2
a = 5 a = 3 # 거듭 제곱 print(a ** b) # 제곱근 print(a ** 0.5)
실행 결과
125 2.23606797749979
리스트 자료형
여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용하는 자료형 사용자 입장에서 C나 자바에서의 배열(Array)의 기능 및 연결 리스트와 유사한 기능을 지원 C++의 STL vector와 기능적으로 유사함 리스트 대신에 배열 혹은 테이블이라고 부르기도 함
리스트 초기화
리스트는 대괄호( [] )안에 원소를 넣어 초기화하며 쉼표( , )로 원소를 구분
)안에 원소를 넣어 초기화하며 쉼표( )로 원소를 구분 비어 있는 리스트를 선언하고자 할 때는 list() 혹은 간단히 [] 를 이용할 수 있음
혹은 간단히 를 이용할 수 있음 리스트의 원소에 접근할 때는 인덱스(Index) 값을 괄호에 넣음 인덱스는 0부터 시작
# 직접 데이터를 넣어 초기화 a = [1, 2, 3, 4, 5, 6, 7, 8, 9] print(a) # 네 번째 원소만 출력 print(a[3]) # 크기가 N이고, 모든 값이 0인 1차원 리스트 초기화 n = 10 a = [0] * n print(a)
실행 결과
[1, 2, 3, 4, 5, 6, 7, 8, 9] 4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]리스트의 인덱싱과 슬라이싱
인덱스 값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱(Indexing) 이라고 함 파이썬의 인덱스 값은 양의 정수와 음의 정수를 모두 사용할 수 있음 음의 정수를 넣으면 원소를 거꾸로 탐색하게 됨
이라고 함
a = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 여덟 번째 원소만 출력 print(a[7]) # 뒤에서 첫 번째 원소 출력 print(a[-1]) # 뒤에서 세 번째 원소 출력 print(a[-3]) # 네 번째 원소 값 변경 a[3] = 7 print(a)
실행 결과
8 9 7 [1, 2, 3, 7, 5, 6, 7, 8, 9]
리스트에서 연속적인 위치를 갖는 원소들을 가져와야 할 때는 슬라이싱(Slicing)을 이용 대괄호 안에 콜론( : )을 넣어서 시작 인덱스 와 끝 인덱스 를 설정할 수 있음 끝 인덱스는 실제 인덱스보다 1을 더 크게 설정 함
a = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 네 번째 원소만 출력 print(a[3]) # 두 번째 원소부터 네 번째 원소까지 print(a[1 : 4])
실행 결과
4 [2, 3, 4]
리스트 컴프리헨션
리스트를 초기화 하는 방법 중 하나 대괄호 안에 조건문과 반복문을 적용하여 리스트를 초기화 할 수 있음
주의: 아직 조건문과 반복문에 대한 내용을 배우기 전이라면 대략적인 쓰임새만 이해하고 넘어가도록
# 0부터 9까지의 수를 포함하는 리스트 array = [i for i in range(10)] print(array)
실행 결과
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]리스트 컴프리헨션은 2차원 리스트를 초기화할 떄 효과적으로 사용 될 수 있음
될 수 있음 특히 N X M 크기 의 2차원 리스트를 한 번에 초기화 해야 할 때 매우 유용함 좋은 예시: array = [[0] * m for _ in range(n)]
의 2차원 리스트를 한 번에 초기화 해야 할 때 매우 유용함 만약 2차원 리스트를 초기화할 때 다음과 같이 작성하면 예기치 않은 결과가 나올 수 있음 잘못된 예시: array = [[0] * m] * n 위 코드는 전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식 됨
리스트 컴프리헨션 (좋은 예시)
# N X M 크기의 2차원 리스트 초기화 n = 4 m = 3 array = [[0] * m for _ in range(n)] print(array)
실행 결과
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]리스트 컴프리헨션 (잘못된 예시)
# N X M 크기의 2차원 리스트 초기화 (잘못된 방법) n = 4 m = 3 array = [[0] * m] * n print(array) array[1][1] = 5 print(array)
실행 결과
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] [[0, 5, 0], [0, 5, 0], [0, 5, 0], [0, 5, 0]]리스트 컴프리헨션과 일반적인 코드 비교하기
코드 1: 리스트 컴프리헨션
# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트 array = [i for i in range(20) if i % 2 == 1] print(array)
코드 2: 일반적인 코드
# 0부터 19까지의 수 중에서 홀수만 포함하는 리스트 array = [] for i in range(20): if i % 2 == 1: array.append(i) print(array)
실행 결과(두 코드 모두 동일)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]언더바는 언제 사용하나요?
파이썬에서는 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 언더바( _ )를 자주 사용함
코드 1:1부터 9까지의 자연수를 더하기
summary = 0 for i in range(1, 10): summary += i print(summary)
코드 2: “Hello World”를 5번 출력하기
for _ in range(5): print(“Hello World”)
리스트 관련 기타 메서드
함수명 사용법 설명 시간 복잡도 append() 변수명 .append() 리스트에 원소를 하나 삽입할 떄 사용 O(1) sort() 변수명 .sort() 변수명 .sort(reverse=True) 기본 정렬 기능으로 오름차순으로 정렬 내림차순으로 정렬 O(NlogN) reverse() 변수명 .reverse() 리스트의 원소의 순서를 모두 뒤집어 놓음 O(N) insert() insert(삽입할 위치 인덱스, 삽입할 값) 특정한 인덱스 위치에 원소를 삽입할 때 사용 O(N) count() 변수명 .count(특정 값) 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용 O(N) remove() 변수명 .remove(특정 값) 특정한 값을 갖는 원소를 제거하는데 값을 가진 원소가 여러 개면 하나만 제거 O(N)
a = [1, 4, 3] print(“기본 리스트: “, a) # 리스트에 원소 삽입 a.append(2) print(“삽입: “, a) # 오름차순 정렬 a.sort() print(“오름차순 정렬: “, a) # 내림차순 정렬 a.sort(reverse = True) print(“내림차순 정렬: “, a)
실행 결과
기본 리스트: [1, 4, 3] 삽입: [1, 4, 3, 2] 오름차순 정렬: [1, 2, 3, 4] 내림차순 정렬: [4, 3, 2, 1]
a = [4, 3, 2, 1] # 리스트 원소 뒤집기 a.reverse() print(“원소 뒤집기: “, a) # 특정 인덱스에 데이터 추가 a.insert(2, 3) print(“인덱스 2에 3추가: “, a) # 특정 값인 데이터 개수 세기 print(“값이 3인 데이터 개수: “, a.count(3)) # 특정 값 데이터 삭제 a.remove(1) print(“값이 1인 데이터 삭제: “, a)
실행 결과
원소 뒤집기: [1, 2, 3, 4] 인덱스 2에 3추가: [1, 2, 3, 3, 4] 값이 3인 데이터 개수: 2 값이 1인 데이터 삭제: [2, 3, 3, 4]
리스트에서 특정 값을 가지는 원소를 모두 제거하기
a = [1, 2, 3, 4, 5, 5, 5] remove_set = {3, 5} # 집합 자료형 # remove_list에 포함되지 않은 값만을 저장 result = [i for i in a if i not in remove_set] print(result)
실행 결과
[1, 2, 4]문자열 자료형
문자열 변수를 초기화 할 때는 큰따옴표( ” )나 작은 따옴표( ‘ )를 이용
할 때는 큰따옴표( )나 작은 따옴표( )를 이용 문자열 안에 큰따옴표나 작은따옴표가 포함되어야 하는 경우가 있음 전체 문자열을 큰따옴표로 구성하는 경우 내부적으로 작은따옴표를 포함할 수 있음 전체 문자열을 작은따옴표로 구성하는 경우 내부적으로 큰따옴표를 포함할 수 있음 혹은 백슬래시( \ )를 사용하면 큰따옴표나 작은따옴표를 원하는 만큼 포함시킬 수 있음
data = ‘Hello World’ print(data) data = “Don’t you know \”Python\”?” print(data)
실행 결과
Hello World Don’t you know “Python”?
문자열 연산
문자열 변수에 덧셈( + ) 을 이용하면 문자열이 더해져서 연결(Concatenate) 됨
을 이용하면 됨 문자열 변수를 특정한 양의 정수와 곱하는 경우 문자열이 그 값만큼 여러 번 더해짐
문자열에 대해서도 마찬가지로 인덱싱과 슬라이싱을 이용할 수 있음 다만 문자열은 특정 인덱스의 값을 변경할 수는 없음 (Immutable)
a = “Hello” b = “World” print(a + ” ” + b) a = “String” print(a * 3) a = “ABCDEF” print(a[2 : 4])
실행 결과
Hello World StringStringString CD
튜플 자료형
튜플 자료형은 리스트와 유사하지만 다음과 같은 문법적 차이가 있음 튜플은 한 번 선언된 값을 변경할 수 없음 리스트는 대괄호( [] )를 이용하지만 튜플은 소괄호( () )를 이용함
튜플은 리스트에 비해 상대적으로 공간 효율적임
a = (1, 2, 3, 4, 5, 6, 7, 8, 9) # 네 번째 원소만 출력 print(a[3]) # 두 번째 원소부터 네 번째 원소까지 print(a[1 : 4])
실행 결과
4 (2, 3, 4)
튜플 사용 예제 (오류가 발생하는 예제)
a = (1, 2, 3, 4) print(a) a[2] = 7
실행 결과
Traceback (most recent call last): File “main.py”, line 4, in
a[2] = 7 TypeError: ‘tuple’ object does not support item assignment 튜플을 사용하면 좋은 경우
서로 다른 성질 의 데이터를 묶어서 관리해야 할 때 최단 경로 알고리즘에서는 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용함
의 데이터를 묶어서 관리해야 할 때 데이터의 나열을 해싱(Hashing)의 키 값 으로 사용해야 할 때 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있음
으로 사용해야 할 때 리스트보다 메모리를 효율적으로 사용해야 할 때
사전 자료형
사전 자료형은 키(Key)와 값(Value)의 쌍을 데이터로 가지는 자료형 앞서 다루었던 리스트나 튜플이 값을 순차적으로 저장하는 것과는 대비됨
사전 자료형은 키와 값의 쌍을 데이터로 가지며 원하는 ‘변경 불가능한(Immutable) 자료형’을 키로 사용 할 수 있음
할 수 있음 파이썬의 사전 자료형은 해시 테이블(Hash Table)을 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리 할 수 있음
data = dict() data[‘사과’] = ‘Apple’ data[‘바나나’] = ‘Banana’ data[‘코코넛’] = ‘Coconut’ print(data) if ‘사과’ in data: print(“‘사과’를 키로 가지는 데이터가 존재합니다”)
키(Key) 값(Value) 사과 Apple 바나나 Banana 코코넛 Coconut
실행 결과
{‘사과’: ‘Apple’, ‘바나나’: ‘Banana’, ‘코코넛’: ‘Coconut’} ‘사과’를 키로 가지는 데이터가 존재합니다
사전 자료형 관련 메서드
사전 자료형에서는 키와 값을 별도로 뽑아내기 위한 메서드를 지원함 키 데이터만 뽑아서 리스트로 이용할 때는 keys() 함수 를 이용 값 데이터만을 뽑아서 리스트로 이용할 때는 values() 함수 를 이용
data = dict() data[‘사과’] = ‘Apple’ data[‘바나나’] = ‘Banana’ data[‘코코넛’] = ‘Coconut’ # 키 데이터만 담은 리스트 key_list = data.keys() # 값 데이터만 담은 리스트 value_list = data.values() print(key_list) print(value_list) # 각 키에 따른 값을 하나씩 출력 for key in key_list: print(data[key])
실행 결과
dict_keys([‘사과’, ‘바나나’, ‘코코넛’]) dict_values([‘Apple’, ‘Banana’, ‘Coconut’]) Apple Banana Coconut
집합 자료형
집합은 다음과 같은 특징이 있음 중복을 허용하지 않음 순서가 없음
집합은 리스트 혹은 문자열을 이용해서 초기화할 수 있음 이때 set() 함수를 이용
혹은 중괄호 ( {} ) 안에 각 원소를 콤마( , )를 기준으로 구분하여 삽입함으로써 초기화 할 수 있음
안에 각 원소를 콤마( )를 기준으로 구분하여 삽입함으로써 초기화 할 수 있음 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있음
# 집합 자료형 초기화 방법 1 data = set([1, 1, 2, 3, 4, 4, 5]) print(data) # 집합 자료형 초기화 방법 2 data = {1, 1, 2, 3, 4, 4, 5} print(data)
실행 결과
{1, 2, 3, 4, 5} {1, 2, 3, 4, 5}
집합 자료형의 연산
기본적인 집합 연산으로는 합집합, 교집합, 차집합 연산 등이 있음 합집합: 집합 A에 속하거나 B에 속하는 원소로 이루어진 집합 (A ∪ B) 교집합: 집합 A에도 속하고 B에도 속하는 원소로 이루어진 집합 (A ∩ B) 차집합: 집합 A의 원소 중에서 B에 속하지 않는 원소들로 이루어진 집합 (A − B)
a = set([1, 2, 3, 4, 5]) b = set([3, 4, 5, 6, 7]) # 합집합 print(a | b) # 교집합 print(a & b) # 차집합 print(a – b)
실행 결과
{1, 2, 3, 4, 5, 6, 7} {3, 4, 5} {1, 2}
집합 자료형 관련 함수
data = set([1, 2, 3]) print(data) # 새로운 원소 추가 data.add(4) print(data) # 새로운 원소 여러 개 추가 data.update([5, 6]) print(data) # 특정한 값을 갖는 원소 삭제 data.remove(3) print(data)
실행 결과
{1, 2, 3} {1, 2, 3, 4} {1, 2, 3, 4, 5, 6} {1, 2, 4, 5, 6}
사전 자료형과 집합 자료형의 특징
리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있음
사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없음 사전의 키(Key) 혹은 집합의 원소(Element)를 이용해 O (1) 의 시간 복잡도로 조회함
인덱싱으로 값을 얻을 수 없음
기본 입출력
모든 프로그램은 적절한 (약속된) 입출력 양식을 가지고 있음
프로그램 동작의 첫 번째 단계는 데이터를 입력 받거나 생성하는 것
예시) 학생의 성적 데이터가 주어지고 이를 내림차순으로 정렬한 결과를 출력하는 프로그램
입력 예시
5 65 90 75 34 99
출력 예시
99 90 75 65 34
자주 사용되는 표준 입력 방법
input() 함수는 한 줄의 문자열을 입력 받는 함수이다
함수는 한 줄의 문자열을 입력 받는 함수이다 map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용함
함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용함 예시) 공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용함 list(map(int, input().split()))
공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용함 예시) 공백을 기준으로 구분된 데이터의 개수가 많지 않다면 단순히 다음과 같이 사용함 a, b, c = map(int, input().split())
공백을 기준으로 구분된 데이터의 개수가 많지 않다면 단순히 다음과 같이 사용함
# 데이터의 개수 입력 n = int(input()) # 각 데이터를 공백을 기준으로 구분하여 입력 data = list(map(int, input().split())) data.sort(reverse=True) print(data)
실행 결과
5 65 90 75 34 99 [99, 90, 75, 65, 34]
입력을 위한 전형적인 소스코드 2)
# n, m, k를 공백을 기준으로 구분하여 입력 n, m, k = map(int, input().split()) print(n, m, k)
실행 결과
3 5 7 3 5 7
빠르게 입력 받기
사용자로부터 입력을 최대한 빠르게 받아야 하는 경우 가 있음
가 있음 파이썬의 경우 sys 라이브러리에 정의되어 있는 sys.stdin.readline() 메서드를 이용 단 입력 후 엔터(Enter)가 줄 바꿈 기호로 입력되므로 rstrip() 메서드를 함꼐 사용함
메서드를 이용
import sys # 문자열 입력 받기 data = sys.stdin.readline().rstrip() print(data)
자주 사용되는 표준 출력 방법
파이썬에서 기본 출력은 print() 함수를 이용 각 변수를 콤마( , )를 이용하여 띄어쓰기로 구분하여 출력할 수 있음
함수를 이용 print() 는 기본적으로 출력 이후에 줄 바꿈을 수행 함 줄 바꿈을 원치 않는 경우 ‘end’ 속성을 이용할 수 있음
는 함
출력을 위한 전형적인 소스코드
# 출력할 변수들 a = 1 b = 2 print(a, b) print(7, end=” “) print(8, end=” “) # 출력할 변수 answer = 7 print(“정답은” + str(answer) + “입니다”)
실행 결과
1 2 7 8 정답은 7입니다
f-string 예제
파이썬 3.6부터 사용 가능하며 문자열 앞에 접두사 ‘f’ 를 붙여 사용
를 붙여 사용 중괄호 안에 변수명을 기입하여 간단히 문자열과 정수를 함께 넣을 수 있음
answer = 7 print(f”정답은 {answer}입니다”)
실행 결과
정답은 7입니다
조건문과 반복문
조건문
조건문은 프로그램의 흐름을 제어하는 문법
조건문을 이용해 조건에 따라서 프로그램의 로직을 설정할 수 있음
x = 15 if x >= 10: print(“x >= 10”) if x >= 0: print(“x >= 0”) if x >= 30: print(“x >= 30”)
실행 결과
x >= 10 x >= 0
들여쓰기
파이썬에서 코드의 블록(Block)을 들여쓰기(Indent)로 지정 함
함 다음의 코드에서 ②번 라인은 무조건 실행됨
score = 85 if score >= 70: print(‘성적이 70점 이상입니다’) if score >= 90: print(‘우수한 성적입니다’) else: print(‘성적이 70점 미만입니다’) # ① print(‘조금 더 분발하세요’) # ① print(‘프로그램을 종료합니다’) # ②
실행 결과
성적이 70점 이상입니다 프로그램을 종료합니다
텝을 사용하는 쪽과 공백 문자(space)를 여러 번 사용하는 쪽으로 두 진영이 있음 이에 대한 논쟁은 지금까지도 활발함
파이썬 스타일 가이드라인에서는 4개의 공백 문자를 사용하는 것을 표준으로 설정하고 있음
조건문의 기본 형태
조건문의 기본적인 형태는 if ~elif ~ else 임 조건문을 사용할 때 elif 혹은 else 부분은 경우에 따라서 사용하지 않아도 됨 if 조건문 1: 조건문 1이 True일 때 실행되는 코드 elif 조건문 2: 조건문 1에 해당하지 않고 조건문 2가 True 일 때 실행되는 코드 else: 위의 모든 조건문이 모두 True 값이 아닐 때 실행되는 코드
성적 구간에 따른 학점 출력 예제
성적이 90점 이상일 때: A
성적이 90점 미만 80점 이상일 때: B
성적이 80점 미만 70점 이상일 때: C
성적이 70점 미만일 때: F
score = 85 if score >= 90: print(“학점: A”) elif score >= 80: print(“학점: B”) elif score >= 70: print(“학점: C”) else: print(“학점: F”)
실행 결과
학점: B
비교 연산자
비교 연산자는 특정한 두 값을 비교할 때 이용 할 수 있음 대입 연산자( = )와 같음 연산자( == )의 차이점에 유의
할 수 있음
비교 연산자 설명 X == Y X와 Y가 서로 같을 때 참(True)이다 X != Y X와 Y가 서로 다를 때 참(True)이다 X > Y X가 Y보다 클 때 참(True)이다 X < Y X가 Y보다 작을 때 참(True)이다 X >= Y X가 Y보다 크거나 같을 때 참(True)이다 X <= Y X가 Y보다 작거나 같을 때 참(True)이다 논리 연산자 논리 연산자는 논리 값 (True/False) 사이의 연산을 수행할 때 사용 논리 연산자 설명 X and Y X와 Y가 모두 참(True)일 때 참(True)이다 X or Y X와 Y중에 하나만 참(True)이어도 참(True)이다 not X X가 거짓(False)일 때 참(True)이다 파이썬의 기타 연산자 다수의 데이터를 담는 자료형을 위해 in 연산자 와 not in 연산자 가 제공됨 리스트, 튜플, 문자열, 딕셔너리 모두에서 사용이 가능함 와 가 제공됨 in 연산자와 not in 연산자 설명 X in 리스트 리스트 안에 x가 들어가 있을 때 참(True)이다 x not in 문자열 문자열 안에 x가 들어가 있지 않을 때 참(True)이다 파이썬의 pass 키워드 아무것도 처리하고 싶지 않을 때 pass 키워드를 사용 예시) 디버깅 과정에서 일단 조건문의 형태만 만들어 놓고 조건문을 처리하는 부분은 비워놓고 싶은 경우 score = 85 if score >= 80: pass # 나중에 작성할 소스코드 else: print(‘성적이 80점 미만입니다’) print(‘프로그램을 종료합니다’)
실행 결과
프로그램을 종료합니다
조건문의 간소화
조건문에서 실행될 소스코드가 한 줄인 경우 굳이 줄 바꿈을 하지 않고도 간략하게 표현할 수 있음
score = 85 if score >= 80: result = “Success” else: result = “Fail” print(result)
실행 결과
Success
조건부 표현식(Conditional Expression)은 if ~ else문을 한 줄에 작성할 수 있도록 해줌
score = 85 result = “Success” if score >= 80 else “Fail” print(result)
실행 결과
Success
파이썬 조건문 내에서의 부등식
다른 프로그래밍 언어와 다르게 파이썬은 조건문 안에서 수학의 부등식을 그대로 사용할 수 있음
예를 들어 x > 0 and x < 20 과 0 < x < 20은 같은 결과를 반환함 코드 스타일 1 x = 15 if x > 0 and x < 20: print("x는 0 이상 20 미만의 수입니다) 코드 스타일 2 x = 15 if 0 < x < 20: print("x는 0 이상 20 미만의 수입니다") 본 책에서는 다른 언어를 다룰 때 햇갈리지 않도록 x > 0 and x < 20와 같이 비교 연산자 사이에 and, or 등의 연산자가 들어가는 형태의 코드를 이용함 반복문 특정한 소스코드를 반복적으로 실행하고자 할 때 사용하는 문법 파이썬에서는 while 문과 for 문이 있는데 어떤 것을 사용해도 상관 없음 다만 코딩 테스트에서의 실제 사용 예시를 확인해 보면 for 문이 더 간결한 경우가 많음 문과 문이 있는데 어떤 것을 사용해도 상관 없음 1부터 9까지 모든 정수의 합 구하기 예제 1 (while문) i = 1 result = 0 # i가 9보다 작거나 같을 때 아래 코드를 반복적으로 실행 while i <= 9: result += i i += 1 print(result) 실행 결과 45 1부터 9까지 홀수의 합 구하기 예제 2 (while문) i = 1 result = 0 # i가 9보다 작거나 같을 때 아래 코드를 반복적으로 실행 while i <= 9: if i % 2 == 1: result += i i += 1 print(result) 실행 결과 25 반복문에서의 무한 루프 무한 루프(Infinite Loop) 란 끊임없이 반복되는 반복 구문을 의미함 코딩 테스트에서 무한 루프를 구현할 일은 거의 없으니 유의해야 함 반복문을 작성한 뒤엔 항상 반복문을 탈출할 수 있는지 확인 란 끊임없이 반복되는 반복 구문을 의미함 x = 10 while x > 5: print(x)
실행 결과
10 10 10 10 10 10 … (중략)
반복문: for문
반복문으로 for 문을 이용할 수도 있음
문을 이용할 수도 있음 for 문의 구조는 다음과 같은데 특정한 변수를 이용하여 in 뒤에 오는 데이터(리스트, 튜플 등)에 포함되어 있는 원소를 첫 번째 인덱스부터 차레대로 하나씩 방문함
for 변수 in 리스트: 실행할 소스코드
array = [9, 8, 7, 6, 5] for x in array: print(x)
실행 결과
9 8 7 6 5
for 문에서 연속적인 값을 차례대로 순회할 때는 range() 를 주로 사용함 이때 range(시작 값, 끝 값 + 1) 형태로 사용 인자를 하나만 넣으면 자동으로 시작 값은 0이 됨
문에서 연속적인 값을 차례대로 순회할 때는 를 주로 사용함
result = 0 # i는 1부터 9까지의 모든 값을 순회 for i in range(1, 10): result += i print(result)
실행 결과
45
1 부터 30까지 모든 정수의 합 구하기 예제 (for문)
result = 0 for i in range(1, 31): result += i print(result)
실행 결과
465
파이썬의 continue 키워드
반복문에서 남은 코드의 실행을 건너뛰고 다음 반복을 진행하고자 할 때 continue 를 사용
를 사용 1부터 9까지의 홀수의 합을 구할 때 다음과 같이 작성할 수 있음
result = 0 for i in range(1, 10): if i % 2 == 0: continue result += i print(result)
실행 결과
25
파이썬의 break 키워드
반복문을 즉시 탈출하고자 할 때 break 를 사용
를 사용 1부터 5까지의 정수를 차례대로 출력하고자 할 때 다음과 같이 작성할 수 있음
i = 1 while True: print(“현재 i의 값:”, i) if i == 5: break i += 1
실행 결과
현재 i의 값: 1 현재 i의 값: 2 현재 i의 값: 3 현재 i의 값: 4 현재 i의 값: 5
학생들의 합격 여부 판단 예제 1) 점수가 80점만 넘으면 합격
scores = [90, 85, 77, 65, 97] for i in range(5): if scores[i] >= 80: print(i + 1, “번 학생은 합격입니다”)
실행 결과
1 번 학생은 합격입니다 2 번 학생은 합격입니다 5 번 학생은 합격입니다
학생들의 합격 여부 판단 예제 2) 특정 번호의 학생은 제외하기
scores = [90, 85, 77, 65, 97] cheating_student_list = {2, 4} for i in range(5): if i + 1 in cheating_student_list: continue if scores[i] >= 80: print(i + 1, “번 학생은 합격입니다”)
실행 결과
1 번 학생은 합격입니다 5 번 학생은 합격입니다
중첩된 반복문: 구구단 예제
for i in range(2, 10): for j in range(1, 10): print(i, “X”, j, “=”, i * j) print()
실행 결과
2 X 1 = 2 2 X 2 = 4 2 X 3 = 6 2 X 4 = 8 2 X 5 = 10 2 X 6 = 12 2 X 7 = 14 2 X 8 = 16 2 X 9 = 18 3 X 1 = 3 3 X 2 = 6 3 X 3 = 9 3 X 4 = 12 3 X 5 = 15 … (중략)
함수와 람다 표현식
함수
함수(Function)란 특정한 작업을 하나의 단위로 묶어 놓은 것을 의미
함수를 사용하면 불필요한 소스코드의 반복을 줄일 수 있음
함수의 종류
내장 함수: 파이썬이 기본적으로 제공하는 함수
파이썬이 기본적으로 제공하는 함수 사용자 정의 함수: 개발자가 직접 정의하여 사용할 수 있는 함수
함수 정의하기
프로그램에는 똑같은 코드가 반복적으로 사용되어야 할 때가 많음
함수를 사용하면 소스코드의 길이를 줄일 수 있음 매개변수: 함수 내부에서 사용할 변수 반환 값: 함수에서 처리 된 결과를 반환
def 함수명(매개변수): 실행할 소스코드 return 반환 값
더하기 함수 예시
더하기 함수 예시 1)
def add(a, b): return a + b print(add(3, 7))
실행 결과
10
더하기 함수 예시 2)
def add(a, b): print(‘함수의 결과:’, a + b) add(3, 7)
실행 결과
함수의 결과: 10
파라미터 지정하기
파라미터의 변수를 직접 지정 할 수 있음 이 경우 매개변수의 순서가 달라도 상관이 없음
할 수 있음
def add(a, b): print(‘함수의 결과:’, a + b) add(b = 3, a = 7)
실행 결과
함수의 결과ㅣ 10
global 키워드
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 = operator(7, 3) print(a, b, c, d)
실행 결과
10 4 21 2.3333333333333335
람다 표현식
람다 표현식을 이용하면 함수를 간단하게 작성할 수 있음 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점이 특징임
def add(a, b): return a + b # 일반적인 add() 메서드 사용 print(add(3, 7)) # 람다 표현식으로 구현한 add() 메서드 print((lambda a, b: a + b)(3, 7))
실행 결과
10 10
람다 표현식 예시: 내장 함수에서 자주 사용되는 람다 함수
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]))
실행 결과
[(‘이순신’, 32), (‘홍길동’, 50), (‘아무개’, 74)] [(‘이순신’, 32), (‘홍길동’, 50), (‘아무개’, 74)]람다 표현식 예시: 여러 개의 리스트에 적용
list1 = [1, 2, 3, 4, 5] list2 = [6, 7, 8, 9, 10] result = map(lambda a, b: a + b, list1, list2) print(list(result))
실행 결과
[7, 9, 11, 13, 15]실전에서 유용한 표준 라이브러리
내장 함수: 기본 입출력 함수 부터 정렬 함수까지 기본적인 함수들을 제공 파이썬 프로그램을 작성할 때 없어서는 안 되는 필수적인 기능을 포함하고 있음
기본 입출력 함수 부터 정렬 함수까지 기본적인 함수들을 제공 itertools: 파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공 특히 순열의 조합 라이브러리는 코딩 테스트에서 자주 사용됨
파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공 heapq: 힙(Heap) 자료구조를 제공 일반적으로 우선순위 큐 기능을 구현하기 위해 사용
힙(Heap) 자료구조를 제공 bisect: 이진 탐색(Binary Search) 기능을 제공
이진 탐색(Binary Search) 기능을 제공 collections: 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함
덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함 math: 필수적인 수학적 기능을 제공함 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함
필수적인 수학적 기능을 제공함
자주 사용되는 내장함수
# sum() result = sum([1, 2, 3, 4, 5]) print(result) # min(), max() min_result = min(7, 3, 5, 2) max_result = max(7, 3, 5, 2) print(min_result, max_result) # eval() result = eval(“(3+5)*7”) print(result)
실행 결과
15 2 7 56
# sorted() result = sorted([9, 1, 8, 5, 4]) reverse_result = sorted([9, 1, 8, 5, 4], reverse=True) print(result) print(reverse_result) # sorted() with key array = [(‘홍길동’, 35), (‘이순신’, 75), (‘아무개’, 50)] result = sorted(array, key=lambda x: x[1], reverse=True) print(result)
실행 결과
[1, 4, 5, 8, 9] [9, 8, 5, 4, 1] [(‘이순신’, 75), (‘아무개’, 50), (‘홍길동’, 35)]순열과 조합
모든 경우의 수를 고려해야 할 때 어떤 라이브러리를 효과적으로 사용할 수 있을까?
순열: 서로 다른 𝑛개에서 서로 다른 𝑟개를 선택하여 일렬로 나열하는 것 {‘A’, ‘B’, ‘C’}에서 세 개를 선택하여 나열하는 경우: ‘ABC’, ‘ACB’, ‘BAC’, ‘BCA’, ‘CAB’, ‘CBA’ 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’)]
조합: 서로 다른 𝑛개에서 순서에 상관 없이 서로 다른 𝑟개를 선택하는 것 {‘A’, ‘B’, ‘C’}에서 순서를 고려하지 않고 두 개를 뽑는 경우: ‘AB’, ‘AC’, ‘BC’ from itertools import combinations data = [‘A’, ‘B’, ‘C’] # 데이터 준비 result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합 구하기 print(result) 실행 결과 [(‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘C’)]
중복 순열과 중복 조합
# 중복 순열 from itertools import product data = [‘A’, ‘B’, ‘C’] # 데이터 준비 result = list(product(data, repeat=2)) # 2개를 뽑는 모든 순열 구하기 (중복 허용) print(‘> 2개를 뽑는 모든 순열 구하기 (중복 허용)’) print(result) # 중복 조합 from itertools import combinations_with_replacement data = [‘A’, ‘B’, ‘C’] # 데이터 준비 result = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기 (중복 허용) print(‘> 2개를 뽑는 모든 조합 구하기 (중복 허용)’) print(result)
실행 결과
> 2개를 뽑는 모든 순열 구하기 (중복 허용) [(‘A’, ‘A’), (‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘A’), (‘B’, ‘B’), (‘B’, ‘C’), (‘C’, ‘A’), (‘C’, ‘B’), (‘C’, ‘C’)] > 2개를 뽑는 모든 조합 구하기 (중복 허용) [(‘A’, ‘A’), (‘A’, ‘B’), (‘A’, ‘C’), (‘B’, ‘B’), (‘B’, ‘C’), (‘C’, ‘C’)]
Counter
파이썬 collections 라이브러리의 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}
최대 공약수와 최소 공배수
최대 공약수를 구해야 할 때는 math 라이브러리의 gcd() 함수를 이용할 수 있음
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
728×90
반응형
키워드에 대한 정보 파이썬 코딩 테스트
다음은 Bing에서 파이썬 코딩 테스트 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 [코테준비] N시간만에 끝내는 Python 코딩테스트(2018-2021년) 풀영상
- 동영상
- 공유
- 카메라폰
- 동영상폰
- 무료
- 올리기
YouTube에서 파이썬 코딩 테스트 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 [코테준비] N시간만에 끝내는 Python 코딩테스트(2018-2021년) 풀영상 | 파이썬 코딩 테스트, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.