728x90
이 글은 Covenant 님의 용감하게 시작하는 코딩테스트 시리즈를 정리한 글입니다.
1. 입출력
✨ 입력 받기
입력 문자열을 공백을 기준으로 분리하여 각 값을 변수에 할당
a, b = map(int(), input().split())
✨ 빠른 입출력
많은 양의 데이터 처리 시 속도를 개선하기 위해 표준 입출력을 사용
from sys import stdin, stdout
input = stdin.readline
print = stdout.write
n = int(intput())
print(str(n))
❗주의 sys.stdout.write() 은 문자열인 경우에만 출력이 가능
2. 배열 입력
✨ 코드 한 줄로 배열 입력 받기
첫 번째 줄에 입력될 줄의 수가 주어지고, 이후 공백으로 구분된 숫자들이 각 줄마다 주어지는 경우
3 # 입력되는 숫자의 줄 수
1 2 3
4 5 6
7 8 9
arr = [list(map(int(), input().split())) for _ in range(int(input()))]
✨ 정수와 배열이 같은 줄로 입력되는 경우
각 줄에서 첫 번째 값은 배열 요소의 개수가 주어지고, 이후 공백으로 구분된 숫자들이 주어지는 경우
4 10 20 30 50 # 숫자의 개수 숫자1 숫자2 숫자3 숫자4
3 5 6 7
3 100 200 300
n, *arr = map(int, input().split())
변수 앞에 * 연산자를 붙이면 나머지 값을 리스트로 묶어 처리하는 unpacking을 수행
✨ 문자열을 한 글자씩 배열에 저장
첫 번째 줄에 입력될 줄 수가 주어지고, 그 다음 줄부터 문자열이 주어지는 경우
# 입력 데이터
3
AAAA
ABCA
AAAA
# 문자열을 한 글자씩 배열에 저장
data = [['A', 'A', 'A', 'A']
['A', 'B', 'C', 'A']
['A', 'A', 'A', 'A']]
arr = [list(input()) for _ in range(int(input())]
3. 배열 출력
✨ 공백 없이 출력
리스트의 요소를 공백 없이 이어서 출력
print("".join(map(str, arr)))
print(*arr)
4. 기타 배열 관련
✨ 배열 초기화
입력으로 주어진 배열의 가로, 세로 크기에 따라 0으로 초기화된 배열 생성
N, M = map(int, input().split())
arr = [[0] * N for _ in range(M)]
✨ 원소를 거꾸로
arr.reverse()
❗주의 반환값이 없음
✨ 원소의 개수
arr.count(찾고자 하는 값)
✨ 원소의 중복 제거
set 자료형 사용
data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd' ]
data = list(set(data))
# 실행 결과 예시
# ['d', 'a', 'b', 'f', 'e', 'g', 'c']
❗ 주의 set을 리스트로 변환하는 과정에서 순서가 보장되지 않음
중복을 제거하면서도 순서를 유지
data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd']
data = list(dict.fromkeys(data))
# 출력 결과 예시
['a', 'b', 'c', 'd', 'e', 'f', 'g']
2차원 리스트에서 중복 제거
data = [[1, 2], [1, 2], [1]]
unique_data = list(map(list, set(map(tuple, data))))
# 출력 결과
# [[1], [1, 2]]
✨ 정렬
기본 배열 정렬
arr.sort() # 오름차순 정렬
arr.sort(reverse=True) # 내림차순 정렬
❗ 주의 sort() 는 리스트 자체를 변경함
2차원 배열에서 특정 기준으로 정렬
# x[0]을 기준으로 먼저 오름차순 정렬한 후, x[0] 값이 같다면 x[1] 값을 기준으로 오름차순 정렬
arr.sort(key=lambda x: (x[0], x[1]))
# x[0]을 기준으로 먼저 내림차순 정렬한 후, x[0] 값이 같다면 x[1] 값을 기준으로 오름차순 정렬
arr.sort(key=lambda x: (-x[0], x[1]))
5. 정수
✨ 최댓값 및 최솟값
임의로 최댓값 또는 최솟값을 지정하여 최솟값 또는 최댓값 구하기
import sys
MAXVALUE = sys.maxsize
MINVALUE = -sys.maxsize - 1
❗주의 파이썬에서 int 자료형은 크기 제한이 없기 때문에 sys.maxsize + 1 과 같은 연산도 가능
✨ 진법
10진수 → 2, 8, 16 진수로 변환
bin() # 2진수로 변환
oct() # 8진수로 변환
hex() # 16진수로 변환
2, 8, 16 진수 → 10 진수로 변환
int('2진수', 2)
int('8진수', 8)
int('16진수', 16)
6. 문자열
✨ 문자열 뒤집기
리스트 인덱싱을 사용
data = "ABCD"
data[::-1]
✨ 문자 ↔ 아스키 코드
ord() # 문자 → 아스키 코드
chr() # 문자 ← 아스키 코드
7. 삼항 연산자
(True일 때의 값) if 조건 else (False일 때의 값)
8. 순열과 조합
✨ 조합
순서와 상관없이 n개의 요소를 뽑는 경우
from itertools import combinations
print(list(combinations(arr, n)))
✨ 순열
순서를 고려하여 n개의 요소를 뽑는 경우
from itertools import permutations
print(list(permutations(arr, n)))
✨ 중복 순열
반복 가능한 객체 간의 모든 가능한 조합을 생성
from itertools import product
product(*iterables, repeat=1)
✨ 중복 조합
중복을 허용한 조합
from itertools import combinations_with_replacement
combinations_with_replacement(iterable, r)
9. 빈도 계산
✨ 배열의 요소별 빈도 계산
from collections import Counter
print(Counter(배열))
✨ 문자열의 문자별 빈도 계산
from collections import Counter
print(Counter(문자열))
✨ 딕셔너리처럼 사용
키를 통해 값 읽기
from collections import Counter
counter = Counter("hello world")
print(counter["o"], counter["l"])
특정 키에 해당하는 값 업데이트
counter["l"] += 1
counter["h"] -= 1
특정 키 존재 확인
if "o" in counter:
print("o in counter")
특정 키 삭제
del counter["o"]
if "o" not in counter:
print("o not in counter")
최빈값 찾기
print(counter.most_common(k)) # 상위 k개의 최빈값
덧셈 및 뺄셈 연산
c1 = Counter(["a", "b", "a"])
c2 = Counter(["a", "c"])
print(c1 + c2) # 두 카운터를 더함
print(c1 - c2) # c2에 있는 값을 뺌
10. 힙 (Heap)
✨ 최소 힙
이진 트리 구조로 데이터를 관리하며, 가장 작은 값이 루트에 위치
import heapq
heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 10)
heapq.heappush(heap, 5)
heapq.heappush(heap, 8)
print(heap) # [1, 3, 10, 5, 8]
1
/ \
3 10
/ \
5 8
힙의 길이: len()
힙의 루트 원소 제거: heappop()
✨ 최대 힙
값을 넣을 때 음수로 넣고, 최종적인 값을 출력할 때 -1을 곱해줘서 출력
import heapq
heap = []
heapq.heappush(heap, -3)
heapq.heappush(heap, -1)
heapq.heappush(heap, -10)
heapq.heappush(heap, -5)
heapq.heappush(heap, -8)
print([-x for x in heap]) # [10, 8, 3, 1, 5]
-10
/ \
-8 -3
/ \
-1 -5
11. 덱 (Deque)
✨ 초기화
from collections import deque
deq = deque()
deq = deque([i for i in range(1, 5)])
print(deq) # deque([1, 2, 3, 4])
✨ 양쪽에서의 삽입 및 삭제
오른쪽 끝에서 값 추가 및 제거: append(), pop()
왼쪽 끝에서 값 추가 및 제거: appendleft(), popleft()
deq.append(5)
print(deq) # deque([1, 2, 3, 4, 5])
deq.append(0)
print(deq) # deque([0, 1, 2, 3, 4, 5])
deq.pop()
print(deq) # deque([0, 1, 2, 3, 4])
deq.popleft()
print(deq) # deque([1, 2, 3, 4])
✨ 길이 구하기
print(len(deq))
✨ 회전
# 시계 방향으로 한 칸 회전
deq.rotate(1)
print(deq) # deque([4, 1, 2, 3])
# 반시계 방향으로 한 칸 회전
deq.rotate(-1)
print(deq) # deque([1, 2, 3, 4])
12. 우선순위 큐
✨ 값 삽입
우선순위를 따로 지정하지 않는 경우, 기본적으로 작은 값이 높은 우선순위로 처리됨
from queue import PriorityQueue
que = PriorityQueue()
que.put((우선순위, 값))
✨ 값 제거
가장 우선순위가 높은 값을 제거하고 반환
que.get()
728x90
반응형
'코딩테스트 대비' 카테고리의 다른 글
[알고리즘] 구현 (Implementation) (0) | 2024.10.16 |
---|---|
[알고리즘] 그리디 알고리즘 (Greedy Algorithm) (0) | 2024.10.14 |
[코드트리 챌린지] [Novice Low] 5. 단순 반복문(10) - cnt 활용하기 (0) | 2023.10.28 |
[코드트리 챌린지] [Novice Low] 5. 단순 반복문(9) - for 안의 if (0) | 2023.10.27 |
[코드트리 챌린지] [Novice Low] 5. 단순 반복문(8) - if 안의 for (0) | 2023.10.26 |