삶의 공유

[Python]코딩 테스트 준비 (Python 문법(2)) 본문

Data Scientist/Python

[Python]코딩 테스트 준비 (Python 문법(2))

dkrehd 2021. 2. 1. 23:00
728x90
반응형

문자열 자료형

 - 문자열 변수를 초기화 할때는 큰 따옴표(")나 작은 따옴표(')를 이용한다.

 - 문자열 안에 큰따옴표나 작은따옴표가 포함되어야 하는 경우가 있다.

  1) 전체 문자열을 큰 따옴표로 구성하는 경우, 내부적으로 작은 따옴표를 포함할 수 있다.

  2) 전체 문제열을 작은 따옴표로 구성하는 경우, 내부적으로 큰따옴표를 포함 할 수 있다.

  3) 혹은 백슬래쉬(\)를 사용하면, 큰 따옴표나 작은 따옴표를 원하는 만큼 포함 시킬수 있다.

 

data = 'Hello World'
print(data) #Hello World

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

 - 문자열 변수에 덧셈(+)을 이용하면 문자열이 더해져서 연결된다. 

 - 문자열 변수를 특정한 양의 정수와 곱하는 경우, 문자열이 그 값만큼 여러번 더해진다.

 - 문자열에 대해서도 마찬가지로 인덱싱과 슬라이싱을 이용할 수 있다. 

  ※ 다만 문자열은 특정 인덱스의 값을 변경할 수는 없다.

a = 'Hello'
b = 'World'

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

a = "String"
print(a*3) #StringStringString

a = "ABCDEF"
print(a[2:4]) #CD

 

튜플 자료형

 - 튜플 자료형은 리스트와 유사하지만 다음과 같은 문법적 차이가 있다.

  1) 튜플은 한번 선언된 값을 변경할 수 없다.

  2) 리스트는 대괄호([ ])를 이용하지만, 튜플은 소괄호(( ))를 이용한다.  

 - 튜플은 리스트에 비해 상대적으로 공간 효율적이다.

 

a = (1,2,3,4,5,6,7,8,9)
# 네 번째 원소만 출력
print(a[3]) # 4

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

a[2] = 7 # Error : TypeError: 'tuple' object does not support item assignment

 

  ※ 튜플을 사용하면 좋은 경우

  1) 서로 다른 성질의 데이터를 묶어서 관리해야할 때

   - 최단 경로 알고리즘에서는 (비용, 노드번호)의 형태로 튜플 자료형을 자주 사용한다.

  2) 데이터의 나열을 해싱(Hasing)의 키값을 사용해야 할때

   - 튜플은 변경이 불가능 하므로 리스트와 다르게 키 값으로 사용 될 수 있다.

  3) 리스트 보다 메모리를 효율적으로 사용해야 할 때

 

사전 자료형

 - 사전 자료형은 키(Key)와 값(Value)의 쌍을 데이터로 가지는 자료형이다.

 : 앞서 다루었던 리스트나 튜플이 값을 순차적으로 저장하는 것과는 대비 된다.

 - 사전 자료형은 키와 값의 쌍을 데이터로 가지며, 원하는 '변경 불가능(Immutable)자료형'을 키로 사용할 수 있다.

 - 파이썬의 사전 자료형은 해시 테이블(Hash Table)을 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.

data = dict()

data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코낫'] = 'Coconut'

print(data) # {'사과': 'Apple', '바나나': 'Banana', '코코낫': 'Coconut'}

if '사과' in data:
    print("'사과'를 키로 가지는 데이터가 존재 합니다.") #'사과'를 키로 가지는 데이터가 존재 합니다.
Key Value
사과 Apple
바나나 Banana
코코넛 Coconut

 

data = dict()

data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코낫'] = 'Coconut'

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

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

print(key_list) # dict_keys(['사과', '바나나', '코코낫'])
print(value_list) # dict_values(['Apple', 'Banana', 'Coconut'])

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

# Apple
# Banana
# Coconut

집합 자료형

 - 집합은 다음과 같은 특징이 있다

  1) 중복을 허용하지 않는다

  2) 순서가 없다

 - 집합은 리스트 혹은 문자열을 이용해서 초기화 할 수 있다.

  1) 이 때 set()함수를 이용한다

 - 혹은 중괄호({ }) 안에 각 원소를 콤마(,) 를 기준으로 구분하여 삽입함으로써 초기화 할 수 있다.

 - 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.

# 집합 자료형 초기화 방법 1
data = set([1,1,2,3,4,4,5])
print(data) # {1, 2, 3, 4, 5}, 중복된 항목 제거

#집햅 자료형 초기화 방법 2
data = {1,1,2,3,4,4,5}
print(data) # {1, 2, 3, 4, 5}, 중복된 항목 제거

 -  집합 자료형의 연산

 1) 합집합 : 집합 A에 속하거나, B에 속하는 원소로 이루어진 집합

 2) 교집합 : 집합 A에도 속하고 B에도 속하는 원소로 이루어진 집합

 3) 차집합 : 집합 A의 원소 중에서 B에 속하지 않는 원소로 이루어진 집합

 

 a = set([1,2,3,4,5])
 b = set([3,4,5,6,7])

 # 합집합
 print(a|b) # {1,2,3,4,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}

# 새로운 원소 여러개 추가
data.update([5, 6]) 
print(data) # {1, 2, 3, 4, 5, 6}

# 특정한 값을 갖는 원소 삭제
data.remove(3)
print(data) {1, 2, 4, 5, 6}

사전 자료형과 집합 자료형의 특징

리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있다.

사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다.

  : 사전의 키(Key) 혹은 집합의 원소(Element)를 이용해 0(1)의 시간 복잡도로 조회 한다.

 

 

파이썬의 기본 입출력

 1) 모든 프로그램은 적절한 (약속된) 입출력 양식을 가지고 있다.

 2) 포르그램 동작의 첫 번째 단계는 데이터를 입력 받거나 생성하는 것이다.

 예시) 학생의 성적 데이터가 주어지고, 이를 내림 차순으로 정렬한 결과를 출력하는 프로그램

 - input() 함수는 한 줄의 문자열을 입력 받는 함수

 - map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용 할 때 사용 한다.

 예시) 공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용한다

   - list(map(int, input().split()))

 예시) 공백을 기준으로 구분된 데이터의 개수가 많지 않다면, 단순히 다음과 같이 사용한다

  - a, b, c = map(int, input().split())

# 데이터의 개수 입력
n = int(input()) # 5

# 각 데이터를 공백을 기준으로 구분하여 입력
data = list(map(int, input().split())) # 65 90 75 34 99

data.sort(reverse=True)
print(data) #[99, 90, 75, 65, 34]

빠르게 입력 받기

 - 사용자로부터 입력을 최대한 빠르게 받아야 하는 경우가 있다. 파이썬의 경우 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) + "입니다.")

# output : 
# 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")

# output:
# x >= 10
# x >= 0

파이썬에서는 코드의 블록(Block)을 들여쓰기로(indent)로 지정한다.

 

들여쓰기 

 - 탭을 사용하는 쪽과 공백 문자(space)를 여러번 사용하는 쪽으로 두 진영이 있다.

 - 파이썬 스타일 가이드 라인에서는 4개의 공백 문자를 사용하는 것을 표준으로 설정하고 있다.

 

조건문의 기본적인 형태는 if ~ elif ~ else 이다.

  - 조건문을 사용 할 때 elif혹은 else부분은 경우에 따라서 사용하지 않아도 된다.

if 조건문 1:
    # 조건문 1이 True일때 실행되는 코드
elif 조건문 2:
    # 조건문 1에 해당하지 않고, 조건문 2가 True일 때 실행 되는 코드
else:
    # 위의 모든 조건문이 모두 True값이 아닐 때 실행 되는 코드

 

성적 구간에 따른 학점 출력 예제

score = 85

if score >= 90:
    print("학점 : A")
elif score >= 80:
    print("학점 : B")
elif score >= 70:
    print("학점 : C")
else:
    print("학점 : F")

# output :
# 학점 : B

 

if True or False:
    print("Yes")

if True and False:
    print("No")

# output : 
# Yes

 

 

출저 : 나동빈 이코테 2021 유투브

파이썬의 pass 키워드

아무것도 처리 하고 싶지 않을 때 pass 키워드를 사용한다

score = 85

if score >= 90:
    pass
elif score >= 80:
    print("학점 : B")
elif score >= 70:
    print("학점 : C")
else:
    print("학점 : F")

# output :
# 학점 : B

 

조건문에서 실행될 소스코드가 한 줄인 경우, 굳이 줄 바꿈을 하지 않아도 간략하게 표현할 수 있다.

score = 85

if score >= 90: result = "Sucess"
else : result = "Fail"

조건부 표현식은 if ~ else문을 한줄에 작성 할수 있도록 해준다.

score = 85

result= "Sucess" if score >= 80 else "Fail"

 

파이썬 조건문 내에서 부등식

 - 다른 프로그래밍 언어와 다르게 파이썬은 조건문 안에서 수학의 부등식의 그대로 사용할 수 있다. 

 - 예를 들어 x > 0 and x < 20 과 0 < x < 20은 같은 결과를 반환한다.

 

반복문

 - 특정한 소스코드를 반복적으로 실행하고자 할 때 사용하는 문법

 - 파이썬 에서는 while문과 for문이 있는데, 어떤 것을 써도 관계는 없다.

 

1 ~ 9까지 모든 정수의 합 구하기 예제 (while문)

i = 1
result = 0

while i <= 9:
    result += i
    i += 1

print(result) # 45

1 ~ 9까지 홀수의 합 구하기 예제 (while문)

i = 1
result = 0

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

print(result) # 25

무한 루프란 끊임 없이 반복 되는 반복 구문을 의미한다

 - 코딩테스트에서 무한 루프를 구현할 일은 거의 없으니 유의해야 한다.

 - 반복문을 작성한 뒤에는 항상 반복문을 탈출 할수 있는지 확인 한다.

 

반복문 : for문

for 변수 in 리스트:
    실행할 소스코드
array = [9,8,7,6,5]

for x in array:
    print(x) # 9 8 7 6 5

for문에서 연속적인 값을 차레대로 순회할 때는 range()를 주로 사용한다.

  - 이때 range(시작 값, 끝 값 +1) 형태로 사용한다.

  - 인자를 하나만 넣으면 자동으로 시작 값은 0이 된다.

 

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

# output :
# 현재 i의 값 :  1
# 현재 i의 값 :  2
# 현재 i의 값 :  3
# 현재 i의 값 :  4
# 현재 i의 값 :  5

 

학생들의 합격 여부 판단 예제 (점수가 80점만 넘으면 합격)

scores = [90, 85, 77, 65, 97]

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

# output : 
# 1 번 학생은 합격 입니다.
# 2 번 학생은 합격 입니다.
# 5 번 학생은 합격 입니다.

시험지를 훔쳐본 2,4번 학생 제외 후 합격 여부 판단하는 예제

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 , "번 학생은 합격 입니다.")

# output : 
# 1 번 학생은 합격 입니다.
# 5 번 학생은 합격 입니다.

중첩된 반복문 ※구구단

for i in range(2, 10):
    for j in range(1,10):
        print(i, "X",j, "=",i*j)
    print()


# output : 
# 2 X 1 = 2
# 2 X 2 = 4
# 2 X 3 = 6
# 2 X 4

   *
   *
   *

# 9 X 6 = 54
# 9 X 7 = 63
# 9 X 8 = 72
# 9 X 9 = 81

 

함수와 람다 표현식

 

함수란특정한 작업을 하나의 단위로 묶어 놓은 것을 의미

함수를 사용하면 불필요한 소스코드와 반복을 줄일 수 있다.

 - 내장 함수 : 파이썬이 기본적으로 제공한느 함수

 - 사용자 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수

def 함수명(매개변수):
    실행할 소스코드
    return 반환 값

 매개변수 : 함수 내부에서 사용할 변수

 반환 값 : 함수에서 처리된 결과를 반환

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

print(add(3,7)) # 10

 

파라미터의 변수를 직접 지정할 수 있다. 이 경우 매개변수의 순서가 달라도 상관이 없다.

def add(a,b):
    print('함수의 결과 : ',a+b) 

add(b=3, a=7) # 함수의 결과 :  10

 

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
    substract_var = a-b
    multiply_var = a*b
    divide_var = a/b
    return add_var, substract_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)) #10

# 람다 표현식으로 구현한 add()메서드

print((lambda a, b: a+b)(3,7)) #10

람다 표현식 예시

array = [('홍길동',50), ('이순신', 32),('아무개', 74)]

def my_key(x):
    return x[1]

print(sorted(array, key=my_key)) # [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
print(sorted(array, key=lambda x:x[1])) # [('이순신', 32), ('홍길동', 50), ('아무개', 74)]

# key:정렬 기준

람다 표현식 예시 (여러개의 리스트에적용)

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]

 

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

 

출저 : 나동빈 유투브(이코테 2021 강의 몰아보기)

 

#sum()
result = sum([1,2,3,4,5])
print(result) # 15

#min(), man()

min_result = min(7,3,5,2)
max_result = max(7,3,5,2)
print(min_result, max_result) # 2 7

#eval()
result = eval("(3+5)*7") # 56
print(result)

#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 = [('홍길동',50), ('이순신', 32),('아무개', 74)]
result = sorted(array, key=lambda x : x[1], reverse=True)

print(result) # [('아무개', 74), ('홍길동', 50), ('이순신', 32)]

 

출저 : 나동빈 유투브(이코테 2021 강의 몰아보기)

순열 : 서로 다른 n개에서 서로 다른 r개의 선택하여 일렬로 나열하는 것

 - {'A', 'B', 'C'} 에서 두 개를 선택하여 나열하는 경우의 예제

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')]

조합 : 서로 다른 n개에서 순서에 상광넚이 서로 다른 n개를 선택하는 것

 - {'A', 'B', 'C'} 에서 순서를 고려하지 않고 두 개를 뽑는 경우의 예제

from itertools import combinations

data = ['A', 'B', 'C']
result = list(combinations(data, 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(result) # [('A', 'B'), ('A', 'C'), ('B', 'C')]

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')]

Counter 

파이썬 collections라이브러리의 Counter는 등장 횟수를 세는 기능을 제공한다.

리스트와 같은 반복 가능한 객체가 주어졌을때 내부의 원소가 몇번 씩 등작했는지를 알려준다

from collections import Counter

counter = Counter(['red', 'blue', 'green', 'red','blue','blue'])
print(counter['blue']) # 3, blue가 등장한 횟수 출력
print(dict(counter)) # 사전 자료형으로 반환 - {'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)) # 최대 공약수 계산
print(lcm(21, 14)) # 최소 공배수 계산

 

반응형