ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코딩테스트를 위한 Python 문법 정리
    Algorithm 2023. 2. 3. 14:30

    1. 자료형

    수 자료형

    데이터는 모두 수로 표현할 수 있다.

    정수형

    • 정수를 다루는 자료형
    • 양의 정수, 음의 정수, 0이 있다.실수형
    • 소수점 아래의 데이터를 포함하는 수 자료형으로 파이썬에서는 변수에 소수점을 붙인 수를 대입하면 실수형 변수로 처리한다.
    • 소수부가 0이거나, 정수부가 0인 소수는 0을 생략하고 작성할 수 있다.
    • 실수형 데이터를 표현하는 방식으로 파이썬에서는 e나 E를 이용한 지수 표현 방식을 이용할 수 있다. e 다음에 오는 수는 10의 지수부를 의미한다. ex) le9 는 10의 9제곱이 된다.
    • 최단 경로 문제에서는 도달할 수 없는 노드에 대하여 거리를 ‘무한(INF)’으로 설정하곤 한다. 최댓값이 10억 미만이라면 무한(INF)을 표현할 때 10억을 사용할 수 있다. -> 이때 일일이 10억을 특정 변수에 대입하는 일은 번거로워 지수 표현 방식인 le9로 표현할 수 있는 것이다.
    • 또한 큰 수를 표현할 때, 0의 개수가 많아지게 되면 자릿수가 헷갈리는 경우가 많기 때문에 10억을 코드에 입력하는 것 보다는 le9로 표현하는 것이 실수할 확률이 적다.
    • 10진수 체계에서는 0.3과 0.6을 더한 값이 0.9로 정확히 떨어지지만, 2진수에서는 0.9를 정확히 표현할 수 있는 방법이 없다. -> 따라서 소수점 값을 비교하는 작업이 필요한 문제라면 round()함수를 이용할 수 있다.
    • round() 함수를 호출할 때 첫 번째 인자는 실수형 데이터이고, 두 번째 인자는 (반올림하고자 하는 위치 -1) 이다.

    수 자료형의 연산

    • a=7
      b=3
      #나누기
      print(a/b)
      #나머지
      print(a%b)
      #몫
      print(a//b)   
      

    리스트 자료형

    • 리스트는 여러개의 데이터를 연속적으로 담아 처리하기 위해 사용할 수 있다.
    • 내부적으로 연결 리스트 자료구조를 채택하고 있어서 append(), remove() 등의 메서드를 지원한다.리스트 만들기
      • 리스트는 대괄호([])안에 원소를 넣어 초기화하며, 쉼표(,)로 원소를 구분한다.
      • 비어있는 리스트를 선언하고자 할 때는 list() 혹은 간단히 대괄호([])를 이용할 수 있다.
      • 비어있는 리스트를 선언하고자 할 때는 list() 혹은 간단히 대괄호([])를 이용할 수 있다.
      #빈 리스트 선언 방법
      a= list()
      a=[]
      #크기가 N이고, 모든 값이 0인 1차원 리스트 초기화
      n=10
      a=[0]*n
    

    리스트의 인덱싱과 슬라이싱

    • 인덱스값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱이라고 한다.
    • 인덱스값을 입력하여 리스트의 특정한 원소에 접근하는 것을 인덱싱이라고 한다.
      #뒤에서 세 번째 원소 출력
      print(a[-3])
      #두 번째 원소부터 네 번째 원소까지 슬라이싱
      print(a[1:4])
    

    리스트 컴프리헨션

    • 리스트를 초기화하는 방법 중 하나이다. 리스트 컴프리헨션을 이용하면 대괄호([]) 안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다. 리스트 컴프리헨션을 이용하면 대괄호([]) 안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다.
      #0부터 19까지의 수 중에서 홀수만 포함하는 리스트
      array = [i for i in range(20) if i%2==1]
        
      array = [i for i in range(20) if i%2==1]    
      #1부터 9까지의 수의 제곱 값을 포함하는 리스트
      array = [i*i for i in range(1,10)]
    
    • 이러한 리스트 컴프리헨션은 코딩테스트에서 2차원 리스트를 초기화 할 때 매우 효과적으로 사용될 수 있다.
    • 이러한 리스트 컴프리헨션은 코딩테스트에서 2차원 리스트를 초기화 할 때 매우 효과적으로 사용될 수 있다.
    #N X M 크기의 2차원 리스트 초기화
    n=3
    m=4
    array=[[0]*m for _ in range(5)]

     

    리스트 관련 기타 메서드

    • append() -리스트에 원소를 하나 삽입할 때 사용한다 O(1)
    • sort() - 기본 정렬 기능으로 오름차순으로 정렬 O(NlogN)
    • sort(reverse=TRUE) - 내림차순으로 정렬 O(NlogN)
    • reverse() - 리스트의 원소의 순서를 모두 뒤집어 놓는다 O(N)
    • insert() - 특정한 인덱스 위치에 원소를 삽입할 때 사용한다 O(N)
    • count() - 리스트에서 특정한 값을 가지는 데이터의 개수를 셀 때 사용한다 O(N)
    • remove() - 특정한 값을 갖는 원소를 제거하는데, 값을 가진 원소가 여러 개면 하나만 제거한다 O(N)
    1.  

    문자열 자료형

    1. 문자열 초기화
      • 문자열 변수를 초기화할 때는 큰따옴표(“)나 작은따옴표(‘)를 이용한다.
    2. 문자열 연산
      • 문자열 변수에 덧셈(+)을 이용하면 단순히 문자열이 더해져서 연결된다.
      • 문자열 변수를 양의 정수와 곱하는 겨우, 문자열이 그 값만큼 여러 번 더해진다.
      • 파이썬 문자열은 내부적으로 리스트와 같이 처리된다. 문자열은 여러 개의 문자가 합쳐진 리스트라고 볼 수 있다.
    data=dict()
    data['사과']='Apple'
    data['바나나']='Banana'
    data['코코넛']='Coconut'
    print(data)  => {'사과':'Apple', '바나나':'Banana','코코넛':'Coconut'}

    튜플 자료형

    • 파이썬의 튜플 자료형은 리스트와 거의 비슷한데 다음과 같은 차이가 있다.
    • 튜플은 한 번 선언된 값을 변경할 수 없다.
    • 리스트는 대괄호([])를 이용하지만, 튜플은 소괄호 (())를 이용한다.

    사전 자료형

    • 사전 자료형은 키와 값의 쌍을 데이터로 가지는 자료형이다.
    • 앞서 다루었던 리스트나 튜플은 값을 순차적으로 저장한다는 특징이 있다. 하지만 사전 자료형은 키-값 쌍을 데이터로 가진다는 점에서, 우리가 원하는 변경 불가능한 데이터를 키로 사용할 수 있다.

    사전 자료형 관련 함수

    키 데이터만 뽑아서 리스트로 이용할 때는 keys() 함수를 이용하며, 값 데이터만을 뽑아서 리스트로 이용할 때는 values() 함수를 이용한다.

    #키 데이터만 담은 리스트
    key_list = data.keys()
    #값 데이터만 담은 리스트
    value_list = data.values()
    결과
    dict_keys(['사과','바나나','코코넛'])
    dict_values(['Apple','Banana','Coconut'])

    1. 집합 자료형

    • 중복을 허용하지 않는다.
    • 순서가 없다.
    • ‘특정한 데이터가 이미 등장한 적이 있는지 여부’를 체크할 때 매우 효과적이다.
    #집합 자료형 초기화 방법1
    data = set([1,1,2,3,4,4,5])
    #집합 자료형 초기화 방법2
    data={1,1,2,3,4,4,5}
    집합 자료형의 연산
    a = set([1,2,3,4,5])
    b = set([3,4,5,6,7])
    #합집합
    a|b  => {1,2,3,4,5,6,7}
    #교집합
    a&b => {3,4,5}
    #차집합
    a-b => {1,2}
    #새로운 원소 추가
    data.add(4)
    #새로운 원소 여러 개 추가
    data.update([5,6])
    #특정한 값을 갖는 원소 삭제
    data.remove(3)

     

    2. 조건문

    파이썬에서 조건문을 작성할 때는 if ~ elif ~ else문을 이용한다. 조건문을 사용할 때 elif 혹은 else 부분은 경우에 따라서 사용하지 않아도 된다.

    if 조건문 1:
      조건문 1이 True일 때 실행되는 코드
    elif 조건문 2:
      조건문 1에 해당하지 않고, 조건문 2가 True일 때 실행되는 코드
    else:
      위의 모든 조건문이 모두 True 값이 아닐 때 실행되는 코드
    #조건부 표현식
    score=85
    result = "Success" if score >=80 else "Fail"
    #리스트에 있는 원소의 값을 변경해서 또 다른 리스트 생성
    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]
    

    3. 반복문

    for문

    in 뒤에 오는 데이터에 포함되어 있는 모든 원소를 첫 번째 인덱스부터 차례대로 하나씩 방문한다. in 뒤에 오는 데이터로는 리스트, 튜플, 문자열 등이 사용될 수 있다.

    for 변수 in 리스트:
        실행할 소스코드
    #i는 1부터 9까지의 모든 값을 순회
    for i in range(1, 10):
        result +=i; 
    #range()의 값으로 하나의 값만을 넣으면, 자동으로 시작 값은 0이 된다
    for i in range(5):
      result +=i;

    while문

    while문은 조건문이 참일 때에 한해서, 반복적으로 코드가 수행된다.

    #i가 9보다 작거나 같을 때 아래 코드를 반복적으로 실행
    while i <= 9:
      if i % 2 ==1:
        result += i
      i += 1
    

    4. 함수

    동일한 알고리즘을 반복적으로 수행해야 할 때 함수는 중요하게 사용된다.

    def 함수명(매개변수):
      실행할 소스코드
      return 반환 값
    def add(a,b):
        print('함수의 결과:', a+b)
    add(b=3,a=7)   ->   함수의 결과: 10
    #람다 표현식으로 구현한 add() 메서드
    print((lambda a,b: a+b)(3,7))

    5. 입출력

     

    일반적으로 입력 과정에서는 먼저 데이터의 개수가 첫 번째 줄에 주오지고, 처리할 데이터는 그다음 줄에 주어지는 경우가 많다.

    #데이터의 개수 입력
    n= int(input())
    #각 데이터를 공백으로 구분하여 입력
    data = list(map(int,input().split())
    data.sort(reverse=True)  => [99,90,75,65,34]
    

    파이썬의 기본 input() 함수는 동작 속도가 느려서 시간 초과로 오답 판정을 받을 수 있기 때문에 sys라이브러리에 정의되어 있는 sys.stdin.readline() 함수를 이용한다.

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

     

    주요 라이브러리의 문법과 유의점

    • 표준 라이브러리란 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리를 의미한다.
    • 내장 함수: print(), input()과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함하고 있는 기본 내장 라이브러리이다.
    • itertools: 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리이다. 순열과 조합 라이브러리를 제공한다.
    • heapq: 힙(Heap) 기능을 제공하는 라이브러리이다. 우선순위 큐 기능을 구현하기 위해 사용된다.
    • visect: 이진 탐색 기능을 제공하는 라이브러리이다.
    • collections: 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리이다.
    • math: 필수적인 수학적 기능을 제공하는 라이브러리이다. 팩토리얼, 제곱근, 최대공약수, 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함하고 있다.

    1. 내장 함수

    • 별도의 import 명령어 없이 바로 사용할 수 있는 내장 함수 (input, print)
    • sum()
      result = sum([1,2,3,4,5])   => 15
      
    • min()
      result = min(7,3,5,2)       => 2
      
    • max()
      result = max(7,3,5,2)       => 7
      
    • eval()
      result = eval("(3+5)*7")    => 56
      
    • sorted()
      result = sorted([9,1,8,5,4]) #오름차순 정렬
      result = sorted([9,1,8,4,5], reverse = True) #내림차순 정렬
      #파이썬에서는 리스트의 원소로 리스트나 튜플이 존재할 때 특정한 기준에 따라서 정렬을 수행할 수 있다.
      result = sorted([('홍길동',35),('이순신',75)], key=lambda x: x[1], reverse= True)
      

    2. itertools

    • itertools는 파이썬에서 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리이다.
    • 가장 유용하게 사용할 수 있는 클래스는 permutations, combinations이다.
    • permutations (순열)
      from itertools import permutations
        
      data= ['A','B','C']
      result = list(permutations(data,3)) #모든 순열 구하기
      
    • combinations(조합)
      from itertools import combinations
      data=['A','B','C']
      result = list(combinations(data,2)) #2개를 뽑는 모든 조합 구하기
      

    3. heapq

    • heapq는 다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용된다.
    • 힙에 원소를 삽입할 때는 heapq.heappush() 메서드를 이용하고, 힙에서 원소를 꺼내고자 할 때는 heapq.heappop() 메서드를 이용한다.

    4. bisect

    • bisect 라이브러리는 ‘정렬된 배열’에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용된다.
    • bisect_left() 함수와 bisect_right() 함수가 가장 중요하게 사용되며, 이 두 함수는 시간 복잡도 O(logN)에 동작한다.
    • bisect_left(a,x) : 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
    • bisect_right(a,x) : 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드

    5. collections

    • 보통 파이썬에서는 deque를 사용해 큐를 구현한다.
    • deque는 연속적으로 나열된 데이터의 시작 부분이나 끝부분에 데이터를 삽입하거나 삭제할 때 매우 효과적으로 사용될 수 있다.
    • deque는 스택이나 큐의 기능을 모두 포함한다고도 볼 수 있기 때문에 스택 혹은 큐 자료구조의 대용으로 사용될 수 있다.
    • 첫 번째 원소를 제거할 때 popleft()를 사용하며, 마지막 원소를 제거할 때 pop()을 사용한다.
    • 첫 번째 인덱스에 원소 x를 삽입할 때 appendleft(x)를 사용하며, 마짐가 인덱스에 원소를 삽입할 때 append(x)를 사용한다.
    • Counter는 등장 횟수를 세는 기능을 제공한다.
      from collections import Counter
      counter = Counter(['red','blue','red','green','blue','blue'])
      print(count['blue'])  #'blue'가 등장한 횟수 출력 => 3
      print(dict(counter))  #사전 자료형으로 변환 => {'red':2, 'blue':3, 'green':1}
      

    6. math

    • 수학 계산을 요구하는 문제를 만났을 때 효과적으로 사용될 수 있다.
      import math
      print(math.factorial(5)) #5팩토리얼을 출력 => 120
      print(math.sqrt(7)) #7의 제곱근을 출력 => 2.6457513...
      print(math.gcd(21,14)) #최대공약수 츨력 => 7
      print(math.pi) #파이(pi)출력 => 3.141592653589793
      print(math.e) #자연상수 e 

    'Algorithm' 카테고리의 다른 글

    최대 연속 부분배열 알고리즘  (0) 2023.02.03
    BFS(너비 우선 탐색) - 백준 1697, 5014  (0) 2023.01.25
    냅색(배낭) 알고리즘  (0) 2023.01.24
Designed by Tistory.