코딩테스트/이코테

코딩테스트 공부 시작과 1. 파이썬 문법 부수기

tout l'été 2023. 10. 30. 00:11

 

 

안녕하세요.

많은 IT 기업들이 채용 과정에서 코딩테스트를 시행하고 있습니다.

저도 취업을 위한 코딩테스트를 위해서, python 알고리즘 공부 목적으로 스터디를 하고 있는데요. 

저는 그중에서 교재는 유명한 이것이 취업을 위한 코딩테스트다 with 파이썬 python언어로 공부하고 있습니다.

 

왜 이 교재를 선택했냐면
1. 코딩테스트 준비를 처음 시작하는 사람들에게 좋은 안내서 
2. python 초보자에게 좋은 문법 안내서
3. IT 직군을 준비하는 개발자에게 좋은 안내서

 

라고 생각했습니다.

 

이유

 

 

 코딩테스트 개요부터 취업을 위해 참고하면 좋은 사이트,  

기업 코딩 테스트 유형 분석알고리즘 이론,

혼동하기 쉬운 내용이나 알려두어야 할 사항도 으로

 

정리되어 있기 때문입니다 !

 

참고로 저는 교재와 유튜브 해설까지 참고하면서 공부하고 있어 도움이 2배가 되었다고 생각합니다.

<동빛나 유튜브- 이코테 2021 강의 몰아보기>

 

 

그럼 유튜브에 소개된 영상을 참고로 정리한 내용을 적어보도록 하겠습니다.

 

 

 

1. 파이썬 문법 부수기

array = [i for i in range(10)]
array

 

리스트 컴프리헨션

  • 리스트 컴프리헨션은 2차원 리스트를 초기화할 때 효과적으로 사용될 수 있다.
# 0부터 10까지의 수 중에서 홀수만 포함하는 리스트 
array = [i for i in range(20) if i % 2 == 1]
print(array)

 

언더바(_) : 알고리즘 코딩테스트에서 유용하게 쓰입니다 !🙌

  • 코드 1 : 1부터 9까지의 자연수 더하기
summary = 0 
for i in range(1, 10) :
    summary += i
print(summary)

  • 코드 2 : "Hello World" 5번 출력하기
for _ in range(5):
    print("Hellow World")

리스트 관련 기타 메서드

No. 변수  변수내용
1 변수명.append()  리스트에 원소를 하나 삽입할 때 사용
2 변수명.sort()  오름차순 정렬
3 변수명.sort(reverse = True) 내림차순 정렬
4 변수명.reverse() 리스트의 원소 순서 뒤집기
5 insert(삽입할 위치 인덱스, 삽입할 값)  특정한 인덱스 위치에 원소 삽입할 때 사용
6 변수명.count(특정 값) 리스트에서 특정한 값을 가지는 데이터의 개수 셀 때 사용
7 변수명.remove(특정 값)  특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거

 

a = [1, 4, 3]
print("기본 리스트 : ", a)

# 리스트에 원소 삽입 
a.append(2)
print("삽입: ", a)

# 오름차순 정렬 
a.sort()
print("오름차순 정렬 :", a)

# 내림차순 정렬 
a.sort(reverse = True)
print("내림차순 정렬 :", a)

 

 

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)

 

  • 리스트에서 특정 값을 가지는 원소를 모두 제거
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)

 

문자열 자료형

data = 'Hello World'
print(data)

data = "Don't you know \"Python\"?"
print(data)

 

 

문자열 연산

a = "Hello"
b = "World"
print(a + " " + b)

a = "String"
print(a * 3)

a = "ABCDEF"
print(a[2:4]) # 인덱스 2 ~ 3

 

튜플 자료형

  • 튜플 자료형은 리스트와 유사하지만 문법적 차이가 있다.
    • 튜플은 한 번 선언된 값을 변경할 수 없다.
    • 리스트는 대괄호([])를 이용하지만, 튜플은 소괄호(())를 이용한다.
  • 튜플은 리스트에 비해 상대적으로 공간 효율적이다.
a = (1, 2, 3, 4, 5, 6, 7, 8, 9)

# 네 번째 원소만 출력 
print(a[3])

# 두 번째 원소부터 네 번째 원소까지 
print(a[1:4])

 

튜플을 사용하면 좋은 경우

  • 서로 다른 성질의 데이터를 묶어서 관리해야 할 때
    • 최단 경로 알고리즘에서는 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용함
  • 데이터의 나열을 해싱(Hashing)의 키 값으로 사용해야 할 때
    • 튜플은 변경이 불가능하므로 리스트와 다르게 키 값으로 사용될 수 있다.
  • 리스트보다 메모리를 효율적으로 사용해야 할 때

 

사전 자료형

  • 사전 자료형은 키(key)와 값(value)의 쌍을 데이터로 가지는 자료형
  • 사전 자료형은 키와 값의 쌍을 데이터로 가지며, '변경 불가능한(immutable)자료형' 을 키로 사용
  • 파이썬의 사전 자료형은 해시 테이블(Hash Table)을 이용
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코넛'] = 'Coconut'

print(data)

if '사과' in data:
    print("'사과'를 키로 가지는 데이터가 존재합니다.")

사전 자료형 관련 메서드

  • 사전 자료형에서는 키와 값을 별도로 뽑아내기 위한 메서드를 지원
    • 키 데이터만 뽑아서 리스트로 이용할 때는 keys() 함수를 이용
    • 값 데이터만 뽑아서 리스트로 이용할 때는 values() 함수를 이용

 

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

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

print(key_list)
print(value_list)

# 각 키에 따른 값을 하나씩 출력
for key in key_list :
    print(data[key])

 

집합 자료형

  • 집합의 특징
    • 중복 허용하지 않다
    • 순서 없다
  • 집합은 리스트 혹은 문자열을 이용해서 초기화 할 수 있다
    • 이때 set() 함수를 이용
  • 혹은 중괄호({}) 안에 각 원소를 콤마(,)를 기준으로 구분하여 삽입함으로써 초기화 할 수 있다.
# 집합 자료형 초기화 방법 1
data = set([1, 1, 2, 3, 4, 4, 5])
print(data)

# 집합 자료형 초기화 방법 2
data = {1, 1, 2, 3, 4, 4, 5}
print(data)

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

# 합집합
print(a | b)

# 교집합
print(a & b)

# 차집합 
print(a - b)

data = set([1, 2, 3])
print(data)

# 새로운 원소 추가 
data.add(4)
print(data)

# 새로운 원소 여러 개 추가 
data.update([5, 6])
print(data)

# 특정한 값을 갖는 원소 삭제
data.remove(3)
print(data)

 

자주 사용되는 표준 입력 방법

  • input() 함수는 한 줄의 문자열을 입력 받는 함수
  • map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용
  • ex) 공백을 기준으로 구분된 데이터를 입력 받을 때
    • list(int, input().split())
  • ex) 공백을 기준으로 구분된 데이터의 개수가 많지 많을 때
    • a, b, c = map(int, input().split())

 

입력을 위한 소스코드

# 데이터의 개수 입력 
n = int(input())
# 각 데이터를 공백을 기준으로 구분하여 입력 
data = list(map(int, input().split()))

# 내림차순 정렬
data.sort(reverse = True)
print(data)

 

빠르게 입력 받기

  • 사용자로부터 입력을 최대한 빠르게 받아야 하는 경우
  • 파이썬의 경우 sys 라이브러리에 정의되어 있는 sys.stdin.readline() 메서드를 이용
    • 단, 입력 후 엔터(Enter)가 줄 바꿈 기호로 입력되므로 rstrip() 메서드 합께 사용

 

출력을 위한 전형적인 소스코드

# 출력할 변수들
a = 1
b = 2
print(a, b)
print(7, end = " ")
print(8, end = " ")

# 출력할 변수 
answer =7
print("정답은 " + str(answer) + "입니다.")

 

f-string 예제

  • 파이썬 3.6부터 사용 가능, 문자열 앞에 접두사 'f'를 붙여 사용
  • 중괄호 안에 변수명을 기입하여 간단히 문자열과 정수를 함께 넣을 수 있음
answer = 7
print(f"정답은 {answer}입니다.")

 

조건문

  • 조건문은 프로그램의 흐름을 제어하는 문법
  • 조건문을 이용해 조건에 따라서 프로그램의 로직을 생성할 수 있음


조건문 예제

x = 15

if x >= 10 :
    print("x >= 10")
    
if x >= 0 :
    print("x >= 0")
    
if x >= 30 :
    print("x >= 30")

조건문의 간소화

  • 조건문에서 실행될 소스코드가 한 줄인 경우, 굳이 줄 바꿈 하지 않고도 간략하게 표현할 수 있음
score = 85

if score >= 80: result = "Success"
else : result = "Fail"
    
print(result)

  • 조건부 표현식(Conditional Expression)은 if ~ else 문을 한 줄에 작성할 수 있다.
score = 85
result = "Success" if score >= 80 else "Fail"

print(result)
  • 1부터 9까지 모든 정수의 합 구하기 예제(while문)
i = 1
result = 0 

# i 가 9보다 작거나 같을 때 코드를 반복적으로 실행
while i <= 9 :
    result += i
    i += 1
    
print(result )

  • 1부터 9까지 홀수의 합 구하기 예제(while문)
i = 1 
result = 0 

while i <= 9 :
    if i % 2 == 1:
        result += i 
    i += 1 
print(result)

 

파이썬에서 continue 키워드

  • 반복문에서 남은 코드의 실행을 건너뛰고, 다음 반복을 진행하고자 할 때 continue를 사용
  • 1부터 9까지의 홀수 합을 구할 때
result = 0 

for i in range(1, 10) :
    if i % 2 == 0:
        continue
    result += i # 홀수인 값만 result에 차례대로 더해서 넣기
    
print(result)

 

 

파이썬의 break 키워드

  • 반복문을 즉시 탈출하고자 할 때 break 사용
  • 1부터 5까지의 정수를 차례대로 출력하고자 할 때
i = 1 

while True :
    print("현재 i의 값 :", i)
    if i == 5:
        break
    i += 1

 

  • 학생들의 합격 여부 판단 예제 1) 점수가 80점만 넘으면 합격
score = [90, 85, 77, 65, 97]

for i in range(5) :
    if score[i] >= 80:
        print(i + 1, "번 학생은 합격입니다.")

 

  • 학생들의 합격 여부 판단 예제 1) 점수가 80점만 넘으면 합격
score = [90, 85, 77, 65, 97]

for i in range(5) :
    if score[i] >= 80:
        print(i + 1, "번 학생은 합격입니다.")

  • 학생들의 합격 여부 판단 예제 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, "번 학생은 합격입니다.")

 

함수

  • 함수랑 특정한 작업을 하나의 단위로 묶어 놓은 것
  • 함수를 사용하면 불필요한 소스코드의 반복을 줄일 수 있다.

 

 

함수의 종류

  • 내장 함수 : 파이썬이 기본적으로 제공하는 함수
  • 사용자 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수

 

함수 정의하기

  • 프로그램에는 똑같은 코드가 반복적으로 사용되어야 할 때가 많다.
  • 함수를 사용하면 소스코드의 길이를 줄일 수 있다.
    • 매개변수 : 함수 내부에서 사용할 변수
    • 반환 값 : 함수에서 처리 된 결과를 반환

 

 

global 키워드

  • global 키워드로 변수를 지정하면 해당 함수에서느느 지역 변수를 만들지 않고, 함수 바깥쪽에 선언된 변수를 바로 참조하게 됨
a = 0 

def func():
    global a 
    a += 1 
    
for i in range(10):
    func()
    
print(a)

 

 

여러 개의 반환 값

  • 파이썬에서 함수는 여러 개의 반환 값을 가질 수 있다.
def opperator(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 = opperator(7, 3)
print(a, b, c, d)

 

람다 표현식

  • 람다 표현식을 이용하면 함수를 간단하게 작성할 수 있다.
    • 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점
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))

실전에서 유용한 표준 라이브러리

  • 내장 함수 : 기본 입출력 함수부터 정렬 함수까지 기본적인 함수들을 제공
    • 파이썬 프로그램을 작성할 때 없어서는 안 되는 필수적인 기능을 포함
  • itertools : 파이썬에서 반복되는 형태으 데이터를 처리하기 위한 유용한 기능 제공
    • 특히 순열과 조합 라이브러리는 코딩 테스트에서 자주 등장
  • heqpq : 힙(Heap) 자료구조 제공
    • 일반적으로 우선순위 큐 기능을 구현하기 위해 사용
  • bisect : 이진 탐색(Binary Search) 기능 제공
  • collections : 덱(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)

# 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)

 

순열과 조합

  • 모든 경우의 수를 고려해야 할 때 어떤 라이브러리를 효과적으로 사용할 수 있을까요?
  • 순열 : 서로 다른 n개에서 서로 다른 r개를 선택하여 일렬로 나타내는 것
    • {'A', 'B', 'C'}에서 세 개를 선택하여 나열하는 경우 : 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA'
  • 조합 : 서로 다른 n개에서 순서에 상관 없이 서로 다른 r개를 선택하는 것
    • {'A', 'B', 'C'}에서 순서를 고려하지 않고 두 개를 뽑는 경우 : 'AB', 'AC', 'BC'
# 순열
from itertools import permutations 

data = ['A', 'B', 'C'] # 데이터 준비

result = list(permutations(data, 3)) # A, B, C 중 3개를 골라 일렬로 나타냄 /모든 순열 구하기
print(result)

# 조합 
from itertools import combinations

data = ['A', 'B', 'C'] # 데이터 준비

result = list(combinations(data, 2)) # 2개를 뽑는 모든 조합 구하기 
print(result)

 

중복 순열과 중복 조합

from itertools import product

data = ['A', 'B', 'C'] # 데이터 준비

result = list(product(data, repeat = 2)) # 2개를 뽑는 모든 순열 구하기 (중복 허용)
print(result)

from itertools import combinations_with_replacement

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

result = list(combinations_with_replacement(data, 2)) # 2개를 뽑는 모든 조합 구하기 (중복 허용)
print(result)

Counter

  • 파이썬 collections 라이브러리의 Counter는 등장 횟수를 세는 기능 제공
  • 리스트와 같은 반복 가능한 (iterable) 객체가 주어졌을 때 내부의 원소가 몇 번씩 등장했는지 알려줌
from collections import Counter

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

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

 

최대 공약수와 최소 공배수

  • 최대 공약수를 구해야 할 때는 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))

 

 

 

기본적인 파이썬 문법 구조와 코딩테스트를 위한 기본 팁을 정리했습니다.

감사합니다.