본문 바로가기
프로그래밍/이것이 코딩테스트다

이것이 코딩테스트다 2일차 - 파이썬 문법 : 입출력, 라이브러리

by 수삼이는코딩중 2023. 5. 31.
728x90

입출력

데이터를 입력받을 때는 문자열로 입력받는다.

input()

따라서 입력받은 데이터를 정수형 데이터로 처리하기 위해서는 정수로 바꾸는 int함수 사용

int(input())


여러 개의 데이터를 입력받을 때는 데이터가 공백으로 구분되는 경우가 많다
입력받은 문자열을 띄어쓰기로 구분하여 각각 정수 자료형의 데이터로 저장하는 코드의 사용빈도가 매우 높다

list(map(int,input().split()))
#입력받은 값을 공백기준으로 split하여 리스트 만듦
#map 함수로 리스트의 vlaue들을 int형으로 변환
#변환한 값들을 다시 list로 만듦


전형적인 소스코드

n=int(input())

data=list(map(int,input().split()))

# data.sort(reverse=True)등등


공백기준으로 구분하여 적은 수의 데이터 입력

n,m,k = map(int,input().split())


입력개수가 많은 경우에는 시간초과 방지 위해 sys라이브러리 사용

import sys
sys.stdin.redline().rstrip()


rstrip() 함수는 꼭. 호출해야 한다.
readline()은 입력 후 엔터가 줄 바꿈 기호로 입력된다.
이 공백 문자를 제거하려면 rstrip() 함수를 사용해야 한다.

import sys

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


출력 : print
print를 사용할 때마다 기본적으로 출력 이후 줄 바꿈을 수행한다.
문자열과 다른 자료형의 변수를 한 줄에 함께 출력하려면 다른 자료형의 변수를 문자열화 하거나 ‘,’를 이용하여 print. 단, ‘,’를 이용하면 중간에 공백(띄어쓰기)이 생긴다.

print(“나는“,27,”살입니다“)
print(“나는” +str(27)+”살입니다“)


f-string 문법(띄어쓰기 안됨)

print(f“나는{27}살입니다”)


라이브러리

표준 라이브러리 중 핵심

  • 내장함수 : print(), input(), sorted(), sum()등
  • heapq : 우선순위 큐 기능을 위해 사용하는 힙 라이브러리
  • Bisect : 이진탐색 기능 제공
  • collections : 덱(deque), 카운터(Counter)등의 자료구조 포함
  • math : 필수적인 수학적 기능. 팩토리얼, 제곱근, 최대공약수, 삼각함수, 파이상수 등

내장함수

sum() : iterable객체 (for문 돌릴 수 있는 리스트, 사전 자료형, 튜플 자료형등)의 모든 원소 합 반환
min() / max() : 파라미터가 2개 이상 들어왔을 때 가장 작은 값 / 큰 값반환
eval() : 문자열로 들어온 수식을 계산한 결과를 반환한다

result = eval(“(3+5)*7”)
print(result)


sorted함수를 키(key)를 이용해서 기준을 정할 때

list=[(“a”,1),(“c”,3),(“f”,5)]

result=sorted(list,key = lambda x :x[1],reverse = True)

lambda x : x[1]
x자리에는 리스트의 요소를 말하고 key값은 x[1], 즉 리스트의 요소의 두번째 값이 key가된다는 뜻이다.

itertools

반복되는 데이터를 처리하는 기능을 포함하는 라이브러리
가장 유용하게 사용하는 클래스

  • permutations(순열) : iterable객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우를 계산해준다 ex) 10개인데 3개를 뽑으면 10*9*8이겠지
  • Combinations(조합) : 순열에서 순서를 고려하지 않고 나열하는 것(순서가 달라도 같은 데이터가 들어있으면 똑같은거다) ex) 10개인데 3개를 뽑으면 10*9*8(순열)/(3개의 순서가 다른 경우의 수 : 3개의 숫자에서 3개를 뽑는 순열 3*2*1)이겠지

모두 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.

from itertools import permutations
from itertools import combinations

data = [‘a’,’b’,’c’]
result_p = list(permutations(data,3))
result_c = list(combinations(data,2))

print(result_p)
print(result_c)
  • product : permutations에서 원소를 중복해서 뽑는다 (3개에서 2개 뽑는 방법 3*3)

다만 추가적으로 뽑고자 하는 데이터의 수는 repeat=n의 형태로 입력한다.

  • combinations_with_replacement : permutation에서 원소를 중복해서 뽑는다.  ex) 10개인데 3개를 뽑으면 10*10*10(순열)/(3개의 순서가 다른 경우의 수 : 3개의 숫자에서 3개를 뽑는 순열 3*2*1)이겠지

모두 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.

heapq

다익스트라 최단경로 알고리즘 - 우선순위 큐에 갱신된 노드를 넣는 방법으로 구현
파이썬의 힙은 최소힙으로 구성되어있다. 따라서 단순히 원소를 힙에 전부 넣었다가 빼는 것만으로도 시간 복잡도가 O(NlogN)에 오름차순 정렬이 완료된다
삽입

import heapq

def heapsort(iterable):
    h = []
    result = []
#모든 원소를 차례대로 힙에 삽입
    for value in iterable : 
         heapq.heappush(h,value)
 #힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)) : 
         result.append(heapq.heappop(h))
    return result
 
result = heapsort([1,3,5,7,4,2,6,8])
print(result)


최대힙은 원소의 부호를 반대로 하기

import heapq

def heapsort(iterable):
    h = []
    result = []
#모든 원소를 차례대로 힙에 삽입
    for value in iterable : 
         heapq.heappush(h,-value)
 #힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for i in range(len(h)) : 
         result.append(-heapq.heappop(h))
    return result
 
result = heapsort([1,3,5,7,4,2,6,8])
print(result)


Bisect

이진탐색을 쉽게 구현
정렬된 배열에서 특정한 원소를 찾아야할 때 매우 효과적으로 사용된다.

Collections

  • deque

큐를 구현할 때 (기본 리스트 자료형도 append와 pop을 제공하지만, 제일 앞쪽에 원소를 추가하면 모든 원소를 오른쪽으로 한칸씩 옮겨야 하기 때문에 append함수는 시간 복잡도가 O(n)이고, 제일 앞쪽 원소를 제거하면 pop함수는 제일 뒤쪽 원소를 기준으로 수행되기 때문에 pop함수도 시간복잡도가 O(n)이다. 인덱싱이나 슬라이싱은 사용할 수 없지만 데이터의 시작 or 끝 부분에 데이터를 삽입하거나 삭제할 때는 매우 효과적으로 사용할 수 있다. 스택이나 큐의 기능을 모두 포함한다. 따라서 스택혹은 큐 자료구조의 대용으로 사용될 수 있다. (사실 스택은 list로 구현하기에 적합하다.)

첫번째 원소 제거 : popleft()
마지막 원소 제거 : pop()

첫번째 인덱스에 원소 x 삽입 : appendleft(x)
마지막 인덱스에 원소 x 삽입 : append(x)

(pop과 append는 마지막이 기준 - 시간복잡도 O(1))

큐를 구현할 때

  • 삽입 : append()
  • 제거 : popleft()


  • Counter

등장횟수 세는 기능
iterable 객체가 주어졌을 때 해당 객체 내부의 원소가 몇번씩 출현했는지 알려준다.

from collections import Counter

counter=Counter([1,4,5,5,4,23,1,5,7,6,3,2])

print(counter[1])
print(counter[5])
print(dict(counter)) # 각 데이터 별로 출현 횟수


math

import math

#factorial
print(math.factorial(5))

#최대공약수
print(math.gcd(21,14))

#자주 쓰는 상수 pi 나 e
print(math.pi)
print(math.e)


댓글