알고리즘 파이썬 문법 총 정리

Stellar·2021년 10월 7일
0

Python

목록 보기
20/36
post-thumbnail
post-custom-banner

어려웠던 문제

입력

✔️ input() 입력

한 줄에 한 변수

n = int(input()) # 정수로 저장
n = input() # 기본 문자열 입력

한 줄에 여러 값 입력하기

#sys 이용하기
import sys
n = map(int, sys.stdin.readline().split())
# map으로 타입을 통일 시켜준다.
# split으로 입력 값을 구분한다. 기본 스페이스바

=========================================================

#입력받은 값 리스트로 저장하기 (input으로도 여러 값 받을 수 있는데 자꾸 까먹는다.)
n = list(map(int, input().split()))

참고. Python | 'sys.stdin.readline'에 대해

여러 줄 입력

# 5번 반복하면서 각각 입력을 받는다.
for _ in range(5):
    n = int(input())
    
=========================================================

# list 타입(comprehension)
n = [int(input()) for _ in range(5)]

print() 출력

✔️ return에서 or, and 사용하기

def solution(arr, divisor):
    return sorted([i for i in arr if i % divisor == 0]) or [-1]
    
##1) A and B
##- A,B 둘 다 참이면 B 를 출력
##- A,B 둘 다 거짓이면 A 를 출력
##- A, B 둘 중에 하나만 참이면 거짓인 값을 출력

##2) A or B
##- A,B 둘 다 참이면 A 를 출력
##- A,B 둘 다 거짓이면 B 를 출력
##- A, B 둘 중에 하나만 참이면 참인 값을 출력

✔️ 삼항 연산자

def get_min_between_two(a, b):
    # a if condition else b (조건이 True 면 a 반환, False 면 b 반환)
    return a if a < b else b

✔️ 객체 이어 붙여 출력

  • 변수 값이 str 타입인 경우 더하기(+)와 콤마(,)를 사용할 수 있음.
>>> a = '사과'
>>> b = '파인애플'
>>> print('내 폰은 ' + a, '네 폰은 ', b)
내 폰은 사과 네 폰은  파인애플
# 기호 플러스를 사용할 경우 붙어서 출력, 콤마는 한 칸 떨어져 출력.
  • 변수 값이 str이 아닌 경우
>>> c = 12
>>> print('내 폰은 사과폰' + c) #플러스 사용 불가
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    print('내 폰은 사과폰' + c)
TypeError: can only concatenate str (not "int") to str
>>> print('내 폰은 사과폰', c) #콤마 사용 가능
내 폰은 사과폰 12

✔️ 줄바꿈을 없애기, end =' '

>>>for i in [0, 1, 2, 3, 4, 5, 6, 7] :
>>>    print(i, end =', ')

    
0, 1, 2, 3, 4, 5, 6, 7, 

%d 는 십진수 출력 >> 자바, c언어 문법


이터러블(Iterable) 값

Iterable이란, 반복되는 객체로 리스트, 튜플, 딕셔너리, 세트, range 등 여러개가 있다.

✔️ min(), max(), sum()

iterable한 객체를 넣어서 계산하는 함수

  • max(), min()
>>>max(1, 20)
20
>>>min(10, 20, 1, 1.1, 0.7)
0.7

1. list [ ]

✔️ 리스트 순서 뒤집기 reversed()

i = [1, 2]
print(reversed(i)) # 1 
print(list(reversed(i))) # 2
print(sorted(n, reverse=True)) # 3

# 출력 값
2, 1 # 1
[2, 1] # 2
[2, 1] # 3

reversed 메소드는 비교 연산자를 사용할 수 없다.
'>' not supported between instances of 'reversed' and 'reversed'

✔️ 리스트 원소 개수 세기 Counter()모듈

from collections import Counter

my_list  = ['Tick', 'Tock', 'Tock'] # 나의 리스트
new_list = ['Tick', 'Tock', 'Song'] # 추가로 나타난 리스트

# 나의 리스트를 센다
counter = Counter(my_list)
print(counter)

# 추가된 리스트를 누적하여 센다
counter.update(new_list)
print(counter)

# 가장 많이 나타난 2개를 출력한다
print(counter.most_common(n=2)) # n으로 원하는 수의 값을 가져옴

# 출력
Counter({'Tock': 2, 'Tick': 1})
Counter({'Tock': 3, 'Tick': 2, 'Song': 1})
[('Tock', 3), ('Tick', 2)]

✔️ list comprehension

입력값 12345를 합하여 출력 sum

def solution(n):
    # return sum([int(i) for i in list(str(n))])
    # 입력값을 반복문에 넣기 전 list에 담지 않아도 str 타입이면 하나씩 가져온다.
    return sum([int(i) for i in str(n)])
    
print(solution(12345))
  1. 입력값을 하나씩 가져오기 위해 str타입으로 변환 후 list에 담아 for문을 돌리고 가져 온 값을 다시 int로 변환하여 list comprehension에 담아둔다.

  2. 반복문이 끝나면 sum() 함수를 사용해 리스트에 담긴 모든 값을 합하여 반환한다.

✔️ 인덱스 초과 시 나머지(%) 연산자로 무한대 만들기

배열의 길이를 나머지 연산하면 배열의 길이를 넘지 않는다.

# a 배열의 길이는 5
>>> a = len([1,2,3,4,5])
>>> 0 % a
0
>>> 4 % a
4
# a의 길이가 5이므로 5%5가 되어 나머지 값이 0이 되므로 0으로 리셋된다.
>>> 5 % a
0
>>> 6 % a
1
>>> 7 % a
2

✔️ list 요소 추가

#append
>>> a = [10, 20, 30]
>>> a.append(500)
>>> a
[10, 20, 30, 500]
>>> len(a)
4

#리스트안에 리스트
>>> a = [10, 20, 30]
>>> a.append([500, 600])
>>> a
[10, 20, 30, [500, 600]]
>>> len(a)
4

참고. 코딩도장 | Unit 22. 리스트와 튜플 응용하기

✔️ map(), 리스트의 요소를 지정된 함수로 한번에 처리하자.

원본은 유지되고 새로운 리스트를 생성한다.
for문에서 처리할 수 있는 기능을 map을 사용해 한 줄로 줄일 수 있다.

  • list(map(함수, 리스트))
  • tuple(map(함수, 튜플))

map 예제. int로 변환 후 각 변수에 넣기

a, b = map(int, input('숫자 두 개를 입력하세요: ').split())
 
print(a + b)

##실행 결과
숫자 두 개를 입력하세요: 10 20 (입력)
30
=========================================================

#콤마(,)로 나누기
a, b = map(int, input('숫자 두 개를 입력하세요: ').split(',')) # 입력받은 값을 콤마를 기준으로 분리
 
print(a + b)
소스 코드를 실행한 뒤 '숫자 두 개를 입력하세요: '가 출력되면 10,20을 입력하고 엔터 키를 누르세요.

##실행 결과
숫자 두 개를 입력하세요: 10,20 (입력)
30
=========================================================

✔️ 외부 함수와 같이 사용하기.

함수명과 함수에 전달할 인수인 시퀀스 객체를 적어주면 함수를 거쳐나온 결과 값이 for문의 변수 i로 반환된다.

def half(s) :
    return s / 2

score = [45, 90, 82, 53, 94]
for i in map(함수명, 시퀀스객체1) :
    print(s, end=', ')

map 예제. 1/2로 나눠주는 함수 사용하기.

def half(s) :
    return s / 2

score = [45, 90, 82, 53, 94]
for s in map(half, score) :
    print(s, end=', ')

map 예제2. 2개의 시퀀스 객체를 함수와 사용하기.

#map2
def total(s, b) :
    return s + b

score = [88, 95, 70, 100, 99]
bonus = [2, 3, 0, 0, 5]
for s in map(total, score, bonus) :
    print(s, end=', ')

✔️ lambda(), 무명 함수

람다문에 함수 명이 없어 무명 함수라고 칭한다.
lambda 설명글 보러가기

Q. 다른 함수로 감싸야만 실행이 가능한가?

A.기본 문법을 보다시피 괄호로 감싸주기만 하면 기초적인 기능은 무리없다.

기본 문법

# lambda 매개변수 : 표현식
>>> (lambda x,y: x + y)(10, 20)
30

lambda 예제. filter() 함수 사용하기.

#lambda
score = [45, 90, 82, 53, 94]
for s in filter(lambda x : x < 60, score) :
    print(s)

lambda 예제2. map() 함수 사용하기.

#lambda 2
score = [45, 90, 82, 53, 94]
for s in map(lambda x : x / 2, score) :
    print(s, end=', ')

2. tuple ()

요소가 변경되지 않아 구조가 간단하여 리스트보다 속도가 훨씬 빠르고, 고정된 메모리 공간을 사용하여 튜플로 성능을 높일 수 있다.


3. dictonary(object) {} key:value

✔️ Counter의 키,값 가져오기

BJ 1157 | 단어 공부 문제 응용

from collections import Counter

# 입력 받은 문자열을 대문자로 변경 후 list에 담은 뒤 Counter로 dic 타입으로 키, 값을 만들어준다.
s = Counter(input().upper())
s.most_common(n=2) # 가져올 값의 개수

for key, value in s.items(): 
    print(key, value)

>>>nMNMN
N 3
M 2
  • dic 타입에 .item() 메서드를 주면 키, 값을 가져오고 s.keys()는 키만, s.values() 값만 가져온다.

✔️ 최댓값 dic(또는 list) 타입으로 여러개 가져오기

Algorithm: baekjoon 1157 단어 공부

from collections import Counter

s = Counter((input().upper())) # dic 타입으로 문자열을 쪼개어 알파벳 하나당 개수를 키:값 형태로 저장한다.

max_num = max(s.values()) # 최댓값을 구한다.

# dict 타입의 경우 (key, value) 형태이다.
d = dict((key, value) for key, value in s.items() if value == max_num) 

# list 타입의 경우 key값 또는 value값 하나만 정하면 된다.
l = list(key for key, value in s.items() if value == max_num) 

print(s) # 키,값 생성
print(max_num) # 제일 큰 값을 가져온다
print(d) # s.items()로 반복문을 돌려 키와 값을 가져오고 if max_num 값과 반복문에서 가져 온 값을 비교하여 똑같은 경우 키와 값을 저장한다.
print(l)

>>>nnmmi
Counter({'N': 2, 'M': 2, 'I': 1})
2
{'N': 2, 'M': 2}
['N', 'M']

4. set {}


5. Unpacking

✔️ '*'를 사용해서 언 팩킹

>>> x = [1, 2, 3]
>>> print(x)
[1, 2, 3]
>>> print(*x)
1 2 3

6. slicing

✔️ input 값 순서 바꾸기

A, B = map(str, input().split()[::-1])

print(A, B)

>>>123 456 # 입력
456 123 # 출력

slicing은 비교 연산자 사용이 가능하다.
if A[::-1] < B[::-1]:
int 값을 슬라이싱하면 에러가 발생한다.
TypeError : 'int' object is not subscriptable


if, for, while


1. if


2. for

✔️ 중첩 for문에서 입력 시 다음 줄로 안 넘어갈 때

T = int(input())

for i in range(T):
    R, S = list(input().split())
    R = int(R)
    for j in range(len(S)):
        print(S[j] * R, end='')
    print('') # 2중 for문의 상위 for문에 print('')을 하여 다음 줄로 넘어가게 해준다

중첩 for문 사용 시 print의 end를 ''으로 지정해서 쉘이 다음 줄로 안 넘어갈 때
참고. BJ 2675 | 문자열 반복

✔️ 1부터 시작하는법 - range(1, N+1)

N = int(input())

for i in range(1, N+1):
    print('*' * i)

참고. BJ2438 | 별 찍기 - 1

3. while


최대, 최솟값

✔️ 입력값 순서 바꾼 후 큰 수 출력하기

A, B = map(str, input().split())

print(max(A[::-1], B[::-1])) # slicing과 조합하여 사용한다.

문자열

문자열(문장)은 string, 문자는 character 로 Type이 정의 됨.

✔️ ''' 긴 문자열 만들기

''' 입력하고
엔터 누르면
자동으로 줄바꿈으로 나옴.'''

✔️ 특수 기호 출력하기 - 특수 기호 앞 역 슬래시 입력 (한글 자판에선 ₩ 입력), r 붙이기

>>>print('doesn\'t')
doesn't

# 특수 기호 ₩를 사용해야 할 때
>>print('C:₩user₩appdata')
SyntaxError: incomplete input
#문자열 앞에 r을 붙여 문자열을 그대로 보여줄 수 있다.
>>print(r'C:₩user₩appdata') 
C:₩user₩appdata

✔️ \n 줄바꿈

✔️ \t 탭(스페이스 4번)

✔️ split() 특정 문자로 구분하기

print(len(input().split()))

# split을 사용하여 문자를 나누고 len으로 문자의 개수를 셈
# 'The', 'last', 'character', 'is', 'a', 'blank'
6

✔️ upper(), lower() 대,소문자 변환하기

a = "nNN"
print(a.upper())
print(a.lower())
print(a.isupper(), a.islower()) # 문자열의 전체가 소문자인지 대문자인지 Boolean형태 (True, False)로 구분한다.

# 출력
NNN
nnn
False False

✔️ rindex() 오른쪽에서부터 문자열 위치 찾기

>>> 'apple pineapple'.rindex('pl')
12 # 인덱스

✔️ isalpha() 공백, 숫자, 특수문자 거르기

isalpha()함수는 주어진 문자열에 공백, 숫자, 특수문자를 걸러낸다. 이걸 for문과 If을 활용하여 특수문자를 제외한 문자열을 만들 수 있다.

x = 'wow!'
for i in x:
    if i.isalpha():
        print(i, end='')
        
# list comprehension
x = 'wow!'
print(*[i for i in x if i.isalpha()], sep='')
    
# output
wow # 특수문자 !가 제외 됨.

✔️ zfill() 문자열 왼쪽에 0으로 채워넣기

print(int('{0}{1}'.format(1, str(3).zfill(2)))) 해당 식 처럼 문자열에 zfill() 함수를 사용해서 0을 채워 넣을 수 있다.
output: 103

✔️ 더하기(+)와 콤마(,)를 사용 글자 붙이기

print("당신의 이름은 " + name + ", 나이는 ", age, "살 이군요!")

✔️ (+)는 합쳐서 나오고 (,)는 개별 문자로 나온다.

>>> T = "T"
>>> G = "G"
>>> S = "S"
>>> print(T + G + S) #플러스
TGS
>>> print(T, G, S) #콤마
T G S

✔️ %, .format()을 사용, 변수로 글자 대체하기 (순서대로 적용 됨.),

자바나 c언어에서 주로 사용하는 방법. 파이썬에서 ('%d입니다' % 7) 콤마없이 작성.

  • %s - 문자열
  • %d - 정수
  • %f - 실수
    위 세가지를 문자열 사이에 넣어 변수를 따로 중간에 넣지 않고 문자열로 바로 출력할 수 있어 가독성이 좋다.

%s

>>>price = 10000
>>>print("상품의 가격은 %s원 입니다." % price)
상품의 가격은 10000원 입니다.

>>>message = "오늘은 %s월 %s일 입니다."
>>>m = 10
>>>d = 25
>>>print(message % (m,d))
오늘은 1025일 입니다.

%d 옵션 설정

아래 코드에서 0은 숫자 앞에 붙이겠다는 의미, 2는 숫자앞에 한 칸 띄우겠단 의미.
위에서부터 %s으로 사용된 부분은 변경되지 않는 것을 볼 수 있다.
%d를 사용했음에도 2를 붙여 간격을 띄워주지 않아 옵션 적용이 안 된 것을 볼 수 있다.

>>>day = 7
>>>print('%s일' % day) #%s를 사용해도 값이 나오긴 함.
7>>> print('%02s일' % day) #간격띄우기는 되나 숫자 0이 붙진 않음.
 7>>>print('%0d일' % day) #간격 띄우기를 안 해 적용 안 됨.
7>>>print('%02d일' % day) #여기만 성공
07

{}.format

위 방법도 있지만 통합적으로 중괄호만 사용하여 편하게 쓸 수 있다.
'문장 사이에 {}를 사용'.format(변수명) 와 같이 사용한다.

word = input('문자, 스페이스바, 숫자만 입력하세요 : ')
al = 0
num = 0
spa = 0

for c in word :
    if c.isalpha() :
        al += 1
    elif c.isdigit() :
        num += 1
    else :
        spa += 1

print('알파벳 개수 = {}, 숫자 개수 = {}, 공백 개수 = {}'.format(al, num, spa))

✔️ 인덱스를 활용해 문자를 바꿀 수 있을까?

문자열이기 때문에 문자만 바꿀 수 없다. 전체를 바꾸던지 새로 변수를 만들던지 하자.

>>> word = 'Python'
>>> word[0] = 'C'
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    word[0] = 'C'
TypeError: 'str' object does not support item assignment

Math 계산식

파이썬 Math 내장 함수
Math 내장 함수를 사용하여 여러 메서드를 이용할 수 있다.

사용법
#import만 사용하여 선언 시 매 메서드마다 math를 붙여야 함.
>>>import math
>>>math.round(1.5)
\
#from ~ import *의 경우 함수를 매번 적을 필요 없다.
>>>from math import *
round(1.5)

계산 관련 메서드는 아래 내용들과 같이 있다.

ㄴ 평균 구하기 statistics.mean()

import statistics
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

print(statistics.mean(arr1))

5.5 # 출력
  • statistics는 파이썬 내장 함수로 mean 메서드를 포함하며 평균을 구한다.

✔️ 반올림, 내림

  • round()
>>>round(1.5) #반올림
2
>>>round(1.4) #내림
1

a = round(1.23456) 
b = round(1.23456, 0) 
c = round(1.23456, 2)
d = round(1.23456, 4)

print(f"round(1.23456) : {a}") 
print(f"round(1.23456, 0) : {b}") 
print(f"round(1.23456, 2) : {c}") 
print(f"round(1.23456, 4) : {d}")

# 출력
round(1.23456) : 1
round(1.23456, 0) : 1.0
round(1.23456, 2) : 1.23
round(1.23456, 4) : 1.2346
  • ceil(), floor()

    math.ceil() 어떤 수든 반올림
    math.floor() 어떤 수든 내림

import math
>>>math.ceil(1.2)
1
>>>math.floor(1.9)
1

✔️ 제곱근(루트) 구하기 math.sqrt() OR 하드코딩

하드 코딩

참고. 조선시대 제곱근 구하는 방법

 def solution(n):
     answer = 0
     n = n / 2
     i = 1
     while n-i >= 0:
         n -= i
         i += 1
     answer = (i+1)**2
    
     if i != n*2:
         answer = -1
    
     return answer

 print(solution(3))
 print(solution(121))
  1. 제곱근 구하는 공식
    121 / 2 = 60.5 -> 60.5 - 1 ~ 음수가되기 전까지의 정수
    60.5 - 1 = 59.5 - 2 = 57.5 - 3 = 54.5 ~~ 10 = 5.5(1번의 결과 값) : 11(i)을 뺴면 음수니까 종료.

  2. 1번의 결과값 5.5 x 2를 한 값이 더이상 뺼 수 없는 수 i와 같다면 i는 제곱근이므로 (i+1)^2를 계산 후 반환한다.

  3. 만약 i 값이 결과값과 같지 않다면 -1을 반환한다.

math.sqrt()

참고. 파이썬 pow, sqrt 함수 (제곱, 제곱근)

  • 예제
from math import *

>>>sqrt(4.0)
2.0
>>>sqrt(36.0)
6.0
  • 예제2
import math

def solution(n):
    if n % math.sqrt(n) == 0:
        return int((math.sqrt(n)+1)**2)
    return -1

print(solution(3))
print(solution(121))
  1. math함수의 sqrt() 메서드를 사용하여 n의 제곱근을 구한 뒤 n과 나눈 나머지 값이 0과 같다면 (n의 제곱근+1)**2를 계산 후 float 타입 -> int 타입으로 변환 후 반환.

  2. n과 나눈 나머지 값이 0과 같지 않다면 -1을 반환

✔️ statistics, 통계

import statistics

score = [30, 40, 60, 70, 80, 90]
print(statistics.mean(score))
print(statistics.harmonic_mean(score))
print(statistics.median(score))
print(statistics.median_low(score))
print(statistics.median_high(score))

✔️ factorial

def factorial(n) :
    if n == 1 :
        return(1)
    else :
        return n * factorial(n-1)

n = int(input('정수를 입력하세요 : '))
print(n, '!= ', factorial(n))

✔️ 피보나치 수열

0, 1, 1, 2, 3, 5 ... 왼쪽의 수를 합한 값이 오른쪽에 있는 것을 피보나치 수열이라 함.

피보나치 예제. 피보나치 수열의 n번째의 값을 구하기.

def fib(n) :
    if n == 0 :
        return 0
    elif n == 1 :
        return 1
    else :
        return fib(n-1) + fib(n-2)

n = int(input('정수를 입력하시오 : '))
print(n, '번째 피보나치 수는 ', fib(n))

피보나치 예제2.

fiboList = {0:0, 1:1}

def fibm(n) :
    if not n in fiboList:
        fiboList[n] = fibm(n-1) + fibm(n-2)
    return fiboList[n]

n = int(input('정수를 입력하시오 : '))
print(n, '번째 피보나치 수는 ', fibm(n))

✔️ Eratosthenes, 소수의 배수만 구하기

에라토스테네스의 체라고도 불리며 솟수인 값만 가져온다.

def eratosthenes(n) :
    multiples = set()
    for i in range(2, n-1):
        if i not in multiples:
            yield i
            multiples.update(range(i * i, n+1, i))

print(list(eratosthenes(10)))

✔️ 하노이의 탑

#막대 from에 쌓여있는 n개의 원판을 막대 tmp를 사용하여 막대 to로 옮긴다.
def hanoi_tower(n, org, tmp, to) :
    if n == 1 :
        print('원판 1을 {}에서 {}로 옮긴다.'.format(org, to))
    else :
        hanoi_tower(n-1, org, to, tmp)
        print('원판 {}을 {}에서 {}로 옮긴다.'.format(n, org, to))
        hanoi_tower(n-1, tmp, org, to)

hanoi_tower(4, 'A', 'B', 'C')

연산자

✔️ 논리 연산자 (and, or, not)

N = int(input())

if N%4 == 0 and N%100 != 0 or N%400 == 0 :
    print(1)
else:
    print(0)

참고

✔️ 관계 연산자

연산자문법설명
==a == b같다
!=a != b다르다
>, <a > b, a < b크다, 작다
>=, <=a >= b, a <= b크거나 작다
post-custom-banner

0개의 댓글