본문 바로가기

Unity/Lecture

알고리즘을 위한 파이썬 기본 기초 문법 정리

원래 C++ 사용하다가 python을 사용할 필요가 느껴 배우기로 함!

js문법을 쓰면서 C++ 의 아쉬운점이 많았는데, (객체 다루는것 , STL 사용, 이터레이터 등등 ) js문법은 ES 최신버전을 쓰려면 babel 환경셋팅이 필요하다.

알고리즘 사이트에서는 babel 지원 여부가 확실치 않고, 문제 검색할때, 주로 C++, python 코드가 많아서 python을 배우기로 함

알고리즘을 위한 C++ 기본 문법

https://dosimpact.tistory.com/10

알고리즘 풀이를 위한 C/C++/STL 기초 정리 - 목록

백준 강의 정리 노트 1. C언어편 2. C++ 언어편 3. STL1 4. C++ 문자열 처리 5. STL2

dosimpact.tistory.com

알고리즘을 위한 파이썬 기본 기초 문법 정리 ( c++ to python )

간단한 사용법( 코드 조각 | code snippet ) 으로 정리하였다.

C/C++/STL 기초 to Python

1. 변수 | 타입 | 기본연산 | 진수


#  기본 연산자
print(7/3)  # 소수점 챙기는 나눗셈
print(7//3)  # 소수점 버리는 나눗셈
print(7 % 3)  # mod
print(2 ** 3)  # pow

# 몫 과 나머지
print(divmod(7, 3))  # 튜플로 (2,1) 반환.

# 형 변환
print(type(3.3))  # float 형
print(int(3.3))  # 소수점 버리기 | int형
print(int('10'))  # string to int
print(str(10)) # int to str

# 2,8,16 진수 포멧

print(0b101)  # 십진수로 5

print(0o10)  # 십진수로 8

print(0xF)  # 십진수로 15

# 출력 진수 포멧 정하기
# https://www.acmicpc.net/problem/11816
a = input()
if(a[0] == '0'):
    if(a[0:2] == '0x'):
        print(int(a[2:], 16))
    else:
        print(int(a[1:], 8))

else:
    print(int(a))

2. 변수 (선언)

# variable & type

a, b, c = 10, '20', 30

print(a, b, c)
print(type(a), type(b), type(c))

# Swap

a, c = c, a
print(a, b, c)

# variable => None | del

var1 = 10
del var1
# print(var1) # NameError: name 'var1' is not defined
var1 = None
print(var1)  # None

변수 (입력,출력)

# input

var1 = input()  # input : 10 | str 형으로 입력됨
print(type(var1))

var1 = int(input())  # input : 10 | int로 형 변환
print(type(var1))


# input 한줄을 받아서, 공백으로 구분하기 하지만 str로 들어감

u, v = input().split()
print(u, v)
print(type(u), type(v))

# input 바로 int형으로 받는 방법.

u, v = map(int, input().split())
print(u, v)
print(type(u), type(v))

# print 마다  \n 을 넣기

a, b, c = map(int, input().split(','))  # input 10,20,30
print(a, b, c, sep='\n')  # output 10\n20\n30

# print 마다  \n 을 넣기

a, b, c = map(int, input().split(','))  # input 10,20,30
print(a, b, c, sep='\n')  # output 10\n20\n30

print(a, end='')  # output 102030
print(b, end='')
print(c, end='\n')

print(a, end=' ')  # output 10 20 30
print(b, end=' ')
print(c, end='')

python - 입력 정리, EOF 까지 | 한줄 그냥 | spilt 이용해서


# 문자열 한줄을 그냥 받기
a = input()
print(a)

# 공백을 제외한 알맹쓰만 받기 -> 리스트로 반환됨
a = input().split()
print(a)

# EOF(ctrl+Z) 까지 한줄 한줄 입력받기 (공백 포함 싹다 포함)

# https://www.acmicpc.net/problem/11718
import sys

for line in sys.stdin:
    a = line
    print(a, end='')  # line자체가 enter를 포함학 있다.

# EOF(ctrl+Z) 한번에 입력받기 (공백 포함 싹다 포함)

# https://www.acmicpc.net/problem/11718
import sys
v = sys.stdin.read()
print(v, end='')

# EOF(ctrl+Z) 까지 한줄 한줄 입력받기 (공백 없이 알맹이 문자열만)

import sys

for line in sys.stdin:
    a = line.split()
    print(a)

# EOF(ctrl+Z) 까지 정수 a,b  입력받기

import sys

for line in sys.stdin:
    a, b = map(int, line.split())
    print(a + b)

#  공백 포함 문자열 하나하나 분리하기

a = input()
print(list(a))

#  공백 제거 후 문자열 하나하나 분리하기

a = input().split()
for e in a:
    print(list(e))

#  1234 숫자 입력시 , 1,2,3,4 로 하나씩 끊어 받기 ( 공백 처리 불가능  )

a = list(input())
res = list(map(int, a))

print(res)

#  1234 숫자 입력시 , 1,2,3,4 로 하나씩 끊어 받기 ( 공백 처리 가능 )
ans = []
a = input().split()
for e in a:
    res = list(map(int, e))
    ans.extend(res)

print(ans)

# 뛰어쓰기 처리하기 -> replace('\n','')

import sys

var = sys.stdin.read()
var = (var.replace('\n', '').split(','))
print(sum(list(map(int, var))))

# EOF 까지 한번에 읽어서, 뛰어쓰기는 제거하고 ,로 나눠서 리스트를 반환후 더한값을 출력하기
# https://www.acmicpc.net/problem/10823
import sys

nlist = [int(x) for x in sys.stdin.read().replace('\n', '').split(',')]
print(sum(nlist))


람다식 | map ( 각원소를 2씩 곱할수있다. ) | filter (배열에서 짝수인경우만 퉤)


# 람다식 | map ( 각원소를 2씩 곱할수있다. ) | filter (배열에서 짝수인경우만 퉤)
# (x,y) => x+y
# lamda x,y: x+y


def g(x): return x**2


(a, b, c) = map(g, [1, 2, 3])  # 람다 없이 각 원소 2제곱
print(a, b, c)


(a, b, c) = map(lambda x: x*2, [1, 2, 3])  # 람다로, 각 원소 2곱
print(a, b, c)

res = list(map(lambda x: x*2, [1, 2, 3]))  # 람다로, 각 원소 2곱
print(res)

wannaEven = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
res = list(filter(lambda e: e % 2 == 0, wannaEven))  # filter오브젝트에서 list로 반환하기.
print(res)

bool 과 논리

if(True and False or not True):
    while(True):
        if(bool('False')):  # 모든 문자열은 참값!!!
            break

리스트 만들기

a = [] # 혹은 a = list()
b = list(range(10)) # 0부터 9까지 range 객체 만들어 list로 변환
print(b)

c = list(range(1, 5)) # [1, 2, 3, 4]
print(c)

c = list(range(1, 11, 2)) # [1, 3, 5, 7, 9] # 1부터 10까지 2씩증가 | 11포함 안됨
print(c)

c = list(range(10, 0, -1)) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 이 역시 0은 미 포함.
print(c)

# for문으로 문자열 리스트 -> 정수 리스트 변환 및 합

nlist = [int(x) for x in ['10', '20', '30']]
print(sum(nlist))

enumerate()

var = ['a', 'b', 'c']

for i, val in enumerate(var):
print(i, val)

2차원 배열

a = [[10, 20], [30, 40], [50, 60]]

for x, y in a:  # 리스트 자체를 받아서 사용
    print(x, y)

for i in a:  # 리스트를 원소를 2번꺼내 사용
    for j in i:
        print(j, end=' ')

for i in range(len(a)):  # 길이만큼 사용
    for j in range(len(a[i])):
        print(a[i][j])

for i, x in enumerate(a):
    for j, y in enumerate(x):
        print(a[i][j])

for i, x in enumerate(a):
    for j, y in enumerate(x):
        print(a[i][j])

for i, x in enumerate(a):
    for j, y in enumerate(x):
        print(y)

반복문으로 2차원 | 배열 만들기

a = ['x' for i in range(3)]
print(a) # ['x', 'x', 'x']

a = [[0, 0, 0] for i in range(3)]
print(a) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

a = [[0 for i in range(3)] for i in range(3)]
print(a) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

# for문으로 리스트 완성하기

nlist = [int(x) for x in ['10', '20', '30']]
print(sum(nlist))

튜플 만들기 ( 튜플은 읽기 전용 리스트 )

c = tuple(range(0, 10)) # range to tuple
print(c) # print (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
print(list(c)) # tuple to list

시퀀스 활용.

  • 시퀀스 자료형이란: 리스트, 튜플, range, string, bytes, bytearray = > 슬라이싱 등등 가능!

시퀀스 존재성.

a = [0, 1, 2, 'a', "hello", True, [0, 'dos', True], (0, 'impact', False)]

print(1 in a) # 참
print(10 in a) # 거짓
print('a' in a) # 참
print(True in a) # 참

print(1 not in a) # 거짓
print(10 not in a) # 참
print('a' not in a) # 거짓
print(True not in a) # 거짓

print('ll' in a[4]) # 참

print('dos' in a[6])  # 참
print('do' in a[6])  # 거짓
print('do' in a[6][1])  # 참

print('impact' in a[7])  # 참
print('act' in a[7])  # 거짓
print('act' in a[7][1])  # 참

시퀀스 with => len + * del

a = [1, 2, 3]
b = [4, 5, 6, 7, 8, 9, 10]
st = 'hello'
print(len(st)) # 5
print(a+b) # [1, 2, 3, 4, 5, 6]
print(a\*2) # [1, 2, 3, 1, 2, 3]
print(a[-1]) # 3 (뒤에서 첫번째)

del a[1] # 1번째 인덱스 삭제
print(a) # [1, 3]

시퀀스 with => slice [][:]

print(b[0:2]) # [4, 5]
print(b[0:]) # [4, 5, 6, 7, 8, 9, 10]
print(b[0:-1]) # [4, 5, 6, 7, 8, 9]
print(b[0:-1:2]) # 2씩 증가하면서 가져오기 [4, 6, 8]

print(b[::2]) # [4, 6, 8, 10] 짝수번 인덱스만 가져오기.

print(b[::-1]) # 뒤 집기 [10, 9, 8, 7, 6, 5, 4]

print(b[1::] + b[0:1:]) # 로테이션 [5, 6, 7, 8, 9, 10, 4]

sum,min,max,sorted

var = [1, 2, 3, 4, -1, 100]

print(sum(var))  # 109
print(min(var))  # 01
print(max(var))  # 100
print(sorted(var))  # [-1, 1, 2, 3, 4, 100]
print(sorted(var, reverse=True))  # [100, 4, 3, 2, 1, -1]

var = (1, 2, 3, 4, -1, 100)

print(sum(var))  # 109
print(min(var))  # 01
print(max(var))  # 100
print(sorted(var))  # [-1, 1, 2, 3, 4, 100]

var = "EABCD"
# print(sum(var))  #TypeError: unsupported operand type(s) for +: 'int' and 'str'
print(min(var))  # A
print(max(var))  # E
print(sorted(var))  # ['A', 'B', 'C', 'D', 'E']

리스트 append sort reverse index insert remove pop count extend

a = [50, 20, 3, 4, 5]
a.append(6)
print(a)  # [50, 20, 3, 4, 5, 6]

a.extend([7, 8])
print(a)  # [50, 20, 3, 4, 5, 6, 7, 8]

a.sort()
print(a)  # [3, 4, 5, 6, 7, 8, 20, 50]

a.sort(reverse=True)
print(a)  # [50, 20, 8, 7, 6, 5, 4, 3]

a.reverse()
print(a)  # [3, 4, 5, 6, 7, 8, 20, 50]

idx = a.index(20)  # 현재 20의 위치는 6번째.
print(idx)  # 6

a.insert(idx, 21)  # 20위치가 하나 밀리고, 21이 들어감
print(a)  # [3, 4, 5, 6, 7, 8, 21, 20, 50]

a.remove(21)  # 21 찾아서 제거
print(a)  # [3, 4, 5, 6, 7, 8, 20, 50]

a.pop()
a.pop()
print(a)  # [3, 4, 5, 6, 7, 8]

print([3, 3, 3, 2, 2, 1].count(3))  # 3

딕셔너리 사용(obj)


x = {'base': 1, 'dos': 20}
print(x['base'])

# 피보나치 + dp for문 | dp 재귀

d = {}


def dp(n):
    if(n <= 1):
        return n
    if((n) in d):
        return d[(n)]
    d[n] = dp(n-1)+dp(n-2)
    return d[n]


var = int(input())
d[0] = 0
d[1] = 1
for i in range(2, var+1):
    d[i] = d[i-1] + d[i-2]
print(dp(var))

python - 덱 ( 큐대신 댁을 쓰기. 큐는 시퀀서가 아니다.)

from collections import deque

dq = deque([1, 2, 3, 4])

print(dq[0])  # front
print(dq[-1])  # back
print(len(dq))  # size

dq.append(5)  # push_back
dq.appendleft(6)  # push_front

print(dq.pop())  # pop_back
print(dq.popleft())  # pop_front

dq.rotate()
print(list(dq))