그동안 항상 c++로만 알고리즘 문제를 풀었는데 코딩 테스트에는 파이썬을 사용하는 것이 더 좋다는 말을 듣고 파이썬으로 갈아탔다.
기초 문법 정도는 알고 있으나 다른 사람들의 풀이를 보니 여러 메소드를 사용하는 것을 보았고 주로 사용하는 메소드들을 정리해보려 한다.
입출력
입력
n=input()
n이라는 변수에 키보드로부터 입력받은 값을 저장하려면 위처럼 input을 쓰면 된다.
기본적으로 입력받은 값은 문자열 취급을 하기 때문에 만약 정수를 입력받고 싶다면 아래처럼 형 변환을 해주면 된다.
n=int(input())
한 줄에 여러 개 입력
split 메소드를 사용한다. split 함수는 인자로 받는 문자를 기준으로 문자열을 나누어서 리스트로 반환한다.
a = "5,4,3"
list = a.split(",")
print(list)
위 코드는 ","문자를 기준으로 문자열을 나누므로 결과는 아래와 같다.
출력
['5', '4', '3']
또한 파이썬에서는 다음과 같이 구조 분해 할당이 가능하다.
a = "5,4,3"
list = a.split(",")
b,c,d = list
print(b)
print(c)
print(d)
출력
5
4
3
입력으로 5 4 3을 입력받고 구조 분해 할당을 하는 코드는 아래와 같다.
a,b,c =input().split(" ")
공백은 split의 첫 번째 파라미터의 기본값이라 공백을 기준으로 나눌 때에는 인자를 생략해도 된다.
input과 split은 문자열을 기준으로 하기 때문에 a, b, c는 모두 문자이다. 이를 정수로 바꾸려면 map을 사용한다.
map(함수, 리스트 혹은 튜플)과 같이 사용하고 각각의 요소들을 함수에 넣어 받은 반환값들을 map 객체로 반환한다.
이 map 객체도 구조 분해 할당이 가능하다.
결론적으로 세 정수를 받아 세 변수에 할당하는 코드는 다음과 같다.
a,b,c =map(int,input().split())
map 메소드는 기본적으로 map 객체를 반환한다.
만약 list로 받고 싶다면 list로 형 변환을 해주면 된다.
여러 정수를 입력받아 리스트로 저장하는 코드는 다음과 같다.
arr = list(map(int, input().split()))
format을 이용한 소숫점 제한
print("{:.4f}".format(a)) //소숫점 4자리로 제한
문자열
아스키 코드
문자 -> 아스키 코드
print(ord('A'))
출력
65
아스키 코드 -> 문자
print(chr(65))
출력
A
포매팅
문자열 사이사이에 정수를 끼워넣을 때 문자열의 덧셈을 이용해도 되지만 포매팅을 사용하면 가독성 좋게 구현할 수 있다.
이럴 때는 format 메소드를 사용하면 된다.
a=1
b=2
c=3
string = "a : {0}, b : {1}, c : {2}".format(a,b,c)
print(string)
출력
a : 1, b : 2, c : 3
따옴표 출력
1. 역슬래쉬 사용
print("It\'s me")
2. 따옴표 3개 사용
print("""It's me""")
따옴표 세 개를 사용하면 역슬래쉬 없이 그냥 따옴표를 출력할 수 있다.
함수
min, max 메소드 사용
min, max 메소드를 사용하면 가장 작은 값 혹은 가장 큰 값을 반환한다.
a, b를 입력받아 작은 값과 큰 값을 출력하는 코드는 다음과 같다.
a, b = map(int, input().split())
print(min(a,b), max(a,b))
정수가 아닌 문자를 넣으면 min 메소드는 순서가 앞선 문자를, max 메소드는 순서가 뒤인 문자를 반환한다.
min, max 메소드의 인자에 리스트나 튜플 같은 iterator를 넣어주면 요소들 중 가장 작고 큰 값을 반환한다.
여러 개의 정수를 입력받아 가장 큰 값을 출력하는 코드는 다음과 같다.
list = list(map(int,input().split()))
print(max(list))
isupper, islower, isdigit, isspace
문자 하나를 입력받아서 확인할 수 있다.
문자.isupper() : 알파벳 대문자면 True, 아니면 False 반환
문자.islower() : 알파벳 소문자면 True, 아니면 False 반환
문자.isdigit() : 숫자면 True, 아니면 False 반환
문자.isspace() : 공백이면 True, 아니면 False 반환
일차원 리스트, 이차원 리스트 만들기
dp 알고리즘 문제를 풀다보면 같은 값을 가진 리스트를 만들어야할 때가 있다.
모든 값이 0이고 길이가 5인 일차원 리스트와
모든 값이 0이고 5x5인 이차원 리스트를 만드는 코드는 다음과 같다.
일차원 리스트
- 곱셈 사용
dp = [0]*5
2. 반복문 사용
dp = [0 for _ in range(5)]
이차원 리스트
1.반복문 사용
dp = [[0 for _ in range(5)] for _ in range(5)]
이차원 리스트를 다음과 같이 곱셈을 사용한다면 문제가 발생한다.
dp = [[0]*5]*5
여기서 dp[1][2] 값을 5로 변경하고 출력을 해보면 아래처럼 모든 리스트의 값이 바뀌게 되는 문제가 발생한다.
dp = [[0]*5]*5
dp[1][2]=5
print(dp)
출력
[[0, 0, 5, 0, 0],
[0, 0, 5, 0, 0],
[0, 0, 5, 0, 0],
[0, 0, 5, 0, 0],
[0, 0, 5, 0, 0]]
sort 함수 사용법 및 입력 시간 단축
https://growth-coder.tistory.com/72
리스트 마지막 요소에 접근
인덱스 -1에 접근하면 마지막 요소에 접근할 수 있다.
리스트와 집합의 차이점
리스트(list) | 집합(set) | |
생성 | li=[ ] | se=set([ ]) |
요소 추가(1 추가) | li.append(1) | se.add(1) |
특정값 제거(1 제거) | li.remove(1) | se.remove(1) |
중복 여부 | O | X |
요소 인덱스 찾기(값이 1인 인덱스 찾기) | li.index(1) | X |
재귀 제한 풀기
DFS와 같이 재귀 함수를 구현하다보면 재귀 깊이에 제한이 걸려 오류가 발생할 수 있다.
그럴 때는 재귀 제한 값을 sys의 setrecursionlimit로 늘려주면 된다.
import sys
sys.setrecursionlimit(10000)
'백준 알고리즘 > dp' 카테고리의 다른 글
[백준 1699][파이썬] 제곱수의 합 (0) | 2023.01.14 |
---|---|
[백준 1912][파이썬] 연속 합 (0) | 2023.01.13 |
[백준 11055, 11722, 11054][파이썬] 증가, 감소하는 수열 dp 문제 (0) | 2023.01.11 |
[백준][파이썬] 쉬운 계단 수 10844 (0) | 2023.01.09 |
[백준][파이썬] 기초 별 찍기 문제 유형 팁 (2) | 2023.01.07 |
댓글