티스토리 뷰

파이썬은 학부 강의 때 이후 따로 잘 사용하지 않았던 언어였는데, 코드가 간결하고 내부적으로 지원해 주는 기능이 많아 알고리즘 언어로 파이썬을 선택했다.

알고리즘 문제를 풀면서 알게 된 유용한 문법들이 필요한 곳에서는 기억나지 않거나 아예 있는지도 몰라 사용하지 못할 때도 있고, 심지어 가끔은 기본 사용 문법도 헷갈려서 엄한 데 시간을 쏟기도 했다. 

이런 문제를 해결하고자 이 포스팅은 알고리즘을 위한 파이썬 문법 정리 노트로 사용하려고 한다. 그렇기 때문에 앞으로 새롭게 알게 된 문법을 계속해서 업데이트 해 나갈 예정이다.

 


 

List 사용법

[기본 문법]

# 생성
a = list()
a = []


# 추가 & 삭제
a.append(3)
a.remove(3)


# 배열 뒤에 합치기
a.extend([5, 10, 7])

 

extend()는 반환 값이 없기 때문에 합친 배열 변수에 할당하기 위해서는 + 연산자를 사용한다.

a = [1, 2, 3] + [4, 5]

 

[2차원 배열 생성]

# 2차원 배열 초기화
temp_list = [[0]*width for _ in range(height)]

 

참고로, 여기서 아래와 같이 2차원 배열을 만들면 안 된다.

temp_list = [[0]*width] * height

만약 이 방법으로 3x3 배열을 생성했다면 아래와 같은 현상을 볼 수 있다.

temp_list = [[0]*3] * 3
temp_list[1][1] = 1
print(temp_list)	# 결과: [[0, 1, 0], [0, 1, 0], [0, 1, 0]]

[0, 0, 0]*3은 [0, 0, 0] 배열을 새로 생성하는 게 아니라 기존 배열의 주소를 복사해서 만드는 것이기 때문에 하나의 값만 바꿔도 같은 위치의 값이 모두 바뀌는 것처럼 동작한다.

 

 

[Stack으로 사용하기]

Python에서 List는 Stack으로도 사용할 수 있다.

# 생성
stack = []

# push
stack.append(1)

# pop
stack.pop()

# top
stack[-1]

# stack 안의 원소가 없을 때까지 반복하는 반복문
while stack:
    # do something
    
while len(stack) > 0:
    # do something

 

 

Dictionary 사용법
# 생성
temp_dict = {}
temp_dict = dict()

# 생성과 동시에 초기화
temp_dict = {"A": 1, "B": 6}

# 삽입, 수정
temp_dict["C"] = 7
temp_dict["C"] -= 3

# 사용
print(temp_dict["C"])  # OK
print(temp_dict["F"])  # ERROR!! 없는 key로 조회했기 때문.

 

[get()]

temp_dict.get(key)
# 있으면 value 반환, 없으면 None 반환
# 조건문에서 있으면 True, 없으면 False

temp_dict.get(key, default_value)
# 있으면 value 반환, 없으면 default_value 반환

 

(활용) "key" - "list value" dictionary 만들기

for e in lists:
    temp_dict[key] = temp_dict.get(key, []) + [value]

 

[items()]

temp_dict.items()	# (K, V) 튜플형태의 list 반환

# 활용 - value가 짝수인 key 리스트
keys_even_value = [k for k,v in temp_dict.items() if v%2 == 0]

 

(활용) value 값을 내림차순으로 정렬한 key list 만들기

answer = []
for item in sorted(temp_dict.items(), key=(lambda x: x[1]), reverse=True):
    # item[0]은 튜플의 첫 번째 원소(여기서 key), item[1]은 튜플의 두 번째 원소(여기서 value)
    answer.append(item[0])

sorted 파라미터의 key에 lambda x는 iterable 데이터 안의 각각의 아이템을 의미한다. 즉, x[1]은 여기서 튜플의 두 번째 원소를 가리키고 여기서는 value를 가지고 정렬한다는 의미가 된다.

 

[keys() 생략]

아래와 같이 temp_dict.keys()에서 .keys()를 생략해서 사용할 수 있다.

if key in temp_dict:
    # do something
   
   
for key in temp_dict:
    # do something

 

 

Queue 사용법
import queue

q = queue.Queue()

python에서 지원하는 Queue는 알고리즘에 사용하기 위한 목적으로 만들어진 자료구조가 아니다.

Queue의 멤버 함수를 보면 put_nowait(), get_nowait(), join()과 같이 스레드 관련 작업이 있는 걸 볼 수 있듯이 Queue는 스레드 관련 메시징 처리 등에서 사용하도록 만들어진 자료구조이다.

 

알고리즘 목적의 Queue는 collections.deque()를 이용해야 한다. Deque는 Stack과 메서드 이름이 비슷하기 때문에 쉽게 익힐 수 있다.

import collections as c

# 생성
queue = c.deque()

# push
queue.append(1)

# pop
queue.popleft()

# front
queue[0]

# back
queue[-1]

# queue 안의 원소가 없을 때까지 반복하는 반복문
while queue:
    # do something
    
while len(queue) > 0:
    # do something

 

 

기타

[VS Code에서 실행하는 방법]

python3 a.py

python 으로 하면 Python1 버전으로 실행되고 python3로 하면 Python3 버전으로 실행된다.

Python3에서 지원하는 문법이 Python1에서는 지원하지 않아 오류를 낼 수 있으니 주의!!

 

[VS Code 파이썬 주석 달기]

코드 맨 윗줄에 아래 코드를 넣어야 주석을 무시하고 실행한다.

# -*- coding: utf-8 -*-

 

[Input 처리]

# 각 변수에 대입
n, m = map(int, input().split())

# 1차원 배열 만들기
a = list(map(int,input().split()))

# 2차원 배열 만들기
a = [list(map(int, list(input()))) for _ in range(n)]

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함