Python Coding test tip

shin·2022년 7월 15일
0

CodingTest 문제 풀이

목록 보기
2/79

입출력

1) 입력을 나누어 받기

a, b = map(int, input().split())
  • 첫 번째 줄에는 입력되는 숫자들의 줄 수가 주어지고, 다음 줄 부터 숫자들이 공백을 기준으로 주어짐
for i in range(int(input())):
    inputStr = input()
    arr = list(inputStr)
    MAP.append(arr)

# Pythonic한 코드로 수정
MAP = [list(map(int, input().split())) for _ in range(int(input()))]
  • 정수와 배열이 같은 줄에 입력으로 들어오는 경우
N, *arr = map(int, input().split())

2) 입출력 가속

from sys import stdin, stdout
input = stdin.readline
print = stdout.write

3) 문자열 한 글자씩 저장

  • 문자열을 한 글자씩 배열에 저장
"""
입력 예시
3
AAAA 
ABCA 
AAAA
"""

arr = [input() for _ in range(N)] 
# arr = ['AAAA', 'ABCA', 'AAAA'] <- wrong code

# list를 input 앞에 붙이면 입력 받은 문자열을 글자로 잘라서 저장함
arr = [list(input()) for _ in range(N)] 
# arr = [['A', 'A', 'A', 'A'], ['A', 'B', 'C', 'A'], ['A', 'A', 'A', 'A']]
  • 문자열 순서 반대로 바꾸기
alph = "ABCD"
alph[::-1] # 'DCBA'

배열

1) 배열 연결

arr = [1, 2, 3, 4]
arrToString = ''.join(map(str, arr))
print(arr*) # 1 2 3 4
print(arrToString) # 1234

2) 최대 범위 설정

  • 최대 범위를 정하기 애매한 상황에 큰 값을 설정하는 방법
import sys
ans = sys.maxsize # 가장 큰 값인 4가 출력됨
for num in arr:
    if ans > num:
        ans = num

3) 배열 초기화

  • N : 배열 가로 크기, M : 배열 세로 크기
N, M = map(int, input().split())
arr = [[0] * N for _ in range(M)] # 0으로 초기화

# 정수 값을 문자열로 변환한 다음 한 글자씩 배열에 넣음
B = int(input())
arr = list(map(int, list(str(B))))
arr = [int(i) for i in str(B)]

4) 배열 원소 개수

list.count(1) # 배열에 1이 몇개 있는지
str.count(0) # 문자열에 0이 몇개 있는지

5) 배열 중복 제거

  • set 활용
alpha = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd' ]
alpha = list(set(alpha)) # ['e', 'b', 'f', 'c', 'a', 'd', 'g']

# 2차원 배열 중복 제거
lst = [[1,2], [1,2], [1]]
list(set(map(tuple, lst))) # [(1, 2), (1,)]

6) Counter

  • 빈도 계산
from collections import Counter
arr = [int(input()) for _ in range(10)]
"""
3
7
8
7
7
9
3
0
7
3
"""
print(sum(arr) // 10) # 평균 : 5

# 첫번째 인덱스에는 arr의 숫자, 두번째 인덱스에는 해당 숫자의 등장 빈도수
val = Counter(arr).most_common()
print(val) # [(7, 4), (3, 3), (8, 1), (9, 1), (0, 1)]
print(val[0][0]) # 최빈값 : 7

진법 변환

1) 10진수 -> 2, 8, 16진수로 변환

bin(42) # '0b101010'
oct(42) # '0o52'
hex(42) # '0x2a'

2) 2, 8, 16진수 -> 10진수로 변환

int('0b101010', 2) # 42
int('0o52', 8) # 42
int('0x2a', 16) # 42

3) 2진수 덧셈

# 2진수 덧셈
A = 1001101
B = 10010
result = bin(A) + bin(B)

삼항 연산자

# a와 b 중에 큰 값을 res에 저장
if a > b:
    res = a
else:
    res = b
    
res = a if a > b else b # 삼항 연산자 사용

정렬

1) 배열 정렬

  • 길이가 짧은 것부터, 길이가 같으면 사전 순으로
  • 조건에 따라 정렬하여 단어 출력, 단 같은 단어가 여러 번 입력된 경우에는 한 번만 출력
data_list = ['but','i','wont','hesitate','no','more','no','more','it','cannot','wait','im','yours']
data_list = list(set(data_list))
data_list.sort() # 사전 순으로 우선 정렬 후
data_list.sort(key = lambda x : len(x)) # 길이 순으로 다시 정렬

2) 2차원 리스트 정렬

a = [(1,2), (0,1), (5,1), (5,2), (3,0)]
b = sorted(a) # [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
c = sorted(a, key = lambda x : x[0]) # [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
d = sorted(a, key = lambda x : x[1]) # [(3, 0), (0, 1), (5, 1), (1, 2), (5, 2)]

e = [(1, 3), (0, 3), (1, 4), (1, 5), (0, 1), (2, 4)]
# 첫 번째 인자를 기준으로 오름차순으로 먼저 정렬한 후, 두 번째 인자를 기준으로 내림차순 정렬
f = sorted(e, key = lambda x : (x[0], -x[1])) # [(0, 3), (0, 1), (1, 5), (1, 4), (1, 3), (2, 4)]

조합과 순열

1) 조합

from itertools import combinations
list(combinations([1, 2, 3], 2)) # nCm (두번째 인자 : m) 
# [(1, 2), (1, 3), (2, 3)] -> 순서가 중요하지 않음

2) 순열

from itertools import permutations
list(permutations([1, 2, 3], 2)) # nPm
# [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)] -> 순서가 중요함

Heap

import heapq

heap = []

# 삽입 연산
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)
heapq.heappush(heap, 5)
heapq.heappush(heap, 7)
print(heap) # [1, 3, 2, 5, 7]
print(len(heap)) # 5

# 삭제 연산
heapq.heappop(heap) # 1
print(heap) # [2, 3, 7, 5]

double-ended queue (dequeue)

  • FIFO + LIFO 연산 모두 가능 -> 양방향에서 데이터 처리 가능
  • stack과 queue도 시간 초과를 방지하기 위해 deque를 사용해서 구현
from collections import deque

# 덱 생성 및 초기화
deq = deque()
deq = deque([i for i in range(1, 5)]) # 생성과 동시에 값 저장 -> [1, 2, 3, 4]

# 삽입 연산
deq.appendleft(10) # deq 왼쪽에 값 추가 -> [10, 1, 2, 3, 4]
deq.append(11) # 오른쪽에 값 추가 -> [10, 1, 2, 3, 4, 11]

# 삭제 연산 (empty인지 확인 필수)
print(deq.pop()) # 오른쪽에 있는 값인 11이 삭제됨 
print(deq.popleft()) # 왼쪽에 있는 값인 10이 삭제됨

# 인자로 들어간 값 만큼 회전 -> 음수이면 좌측, 양수이면 우측
deq.rotate(-1) # [2, 3, 4, 1]
deq.rotate(1) # [1, 2, 3, 4]
deq.rotate(2) # [3, 4, 1, 2]

Priority Queue

  • 자주 출제되지는 않음
from queue import PriorityQueue

que = PriorityQueue()

# 삽입 연산
que.put(2)
que.put(1)
que.put(3)
print(que.queue) # [1, 2, 3]

# 삭제 연산
print(que.get()) # 1
print(que.queue) # [2, 3]
profile
Backend development

0개의 댓글