본문 바로가기
코딩 테스트/코딩테스트 - 학습

자주 잊는 코딩테스트 문법

by 안스 인민군 2023. 1. 29.

0. 기본

# 1. 나누기를 조심하자!!!!나누기하면 float으로 나온다
print(4/2) # 2.0
print(4/2) # 2.5

# 컴퓨터는 2진수 체계이기 때문에 실수 덧셈을 정확히 하지 못한다. 보통 5째 자리에서 반올림 하면된다.
a = 0.3 + 0.6
print(round(a,4))

# Java에서 다음과 같은 코드는 ch 에 'b'를 저장한다.
# 하지만 파이썬은 문자를 아스키코드를 나타내는 int형으로 변환하고 연산한 뒤 다시 char형으로 형변환 해주어야 한다.
char ch = 'a'+1; 	 # 자바
ch = chr(ord('a')+1) # 파이썬

# 입력
import sys
input = sys.stdin.readline

# N개의 정수를 한 줄로 입력 받았을 경우
N, M, K = map(int, input().split())

# N개의 정수를 한 줄로 입력 받아 List에 저장할 경우
data = list(map(int, input().split()))

# N개의 정수를 여러 줄에 걸쳐 입력 받아 List에 저장할 경우
N = int(input())
data = [int(input()) for _ in range(N)]

# N개의 문자열을 여러 줄에 걸쳐 입력 받아 List에 저장할 경우 <- 중요!(문자열의 뒤에 \n 제거하기 위해 .rstrip() 추가)
N = int(input())
data = [input().rstrip() for _ in range(N)]

# N개의 정수를 여러 줄에 걸쳐 입력 받아 이차원 배열에 저장할 경우.
N = int(input())
matrix = [list(map(int, input().split())) for _ in range(N)]

# 콜론 ':' 기호를 사이에 두고 값을 출력 (sep 는 분류기호(seperator)를 의미)
print(a,b, sep=":") # 출력 : 1:2

# f-string 방식
# 파이썬 3.6 이상 부터 지원하는 방식이다. 가장 가독성이 좋고 가장 빠르다고 알려져 있다.
# 출력할 문자열 앞에 f나 F를 붙이면 사용할 수 있다. { } 안에는 출력할 변수가 직접 들어간다. (연산도 가능)
month = 1
day = 10
print(f'2020년 {month}월 {day}일')

# 2진수, 8진수, 16진수 (BOX 로 외우기)
# 앞에 '0b'와 같은 걸 빼고 싶으면 #을 삭제하기
print(format(a,'#b')) //10진수 -> 2진수
print(format(a,'#o')) //10진수 -> 8진수
print(format(a,'#x')) //10진수 -> 16진수
value = 0b1100100 #예시 2진수
print(format(value,'#d')) //2진수 -> 10진수

1. 해쉬를 이용한 갯수세기 (Counter 함수를 이용하면 됨!!!!)

hash_map = {}
for name,type in data:
    hash_map[type] = hash_map.get(type,0) +1

2. 리스트

a = [1,2,3,4,5,6,7,8,9]
a[-1]   # 9
a[1:4]  # 2,3,4

# 1부터 100까지 리스트 만들기
a = list(range(100))

#2차원 리스트 초기화
n,m = 3,4
# 인접 배열을 만들때 사용한다.
arr = [[0] *m for _ in range(n)] # [[0,0,0,0],[0,0,0,0],[0,0,0,0]]
# 인잡 리스트를 만들 때 사용한다.
arr = [[] for _ in range(n)] 	 # [[],[],[]]

# 리스트 안에 원소 삽입
a = [1,4,3]
a.append([2,5]) # [1, 4, 3, [2, 5]]
a.extend([2,5]) # [1, 4, 3, 2, 5]

# 특정 인덱스에 데이터 추가
a.insert(2,3) # 인덱스2에 3추가

# 특정 값인 데이터 개수 세기
a.count(3)

# 리스트 안에 있는 값 index 찾기
list1.index(1)

3. zip 함수

number = [1,2,3]
english = ['a','b','c']
korean = ['ㄱ','ㄴ','ㄷ']
for a,b,c in zip(number, english, korean):
   print(a,b,c , end = " ")

4. 내장함수 (max,min,abs는 Math가 아님을 잊지 말자!!)

min(7,3, 5, 2) # 2
max(7, 3, 5, 2) # 7
abs

# 문자열 -> 리스트
str = "python"
my_list = list(str) # ['p','y','t','h','o','n']

# 리스트 -> 문자열 변환
str_list = ['There', 'is', "items"]
result = ' '.join(map(str, str_list)) # There is 4 items

5. itertools

from itertools import permutations, combinations, product, combinations_with_replacement

# (순열) 2개를 뽑아 나열하는 모든 순열을 출력
result = list(permutations(data,2))

# (조합) 2개를 뽑는 모든 조합 구하기
result = list(combinations(data,2))

# (중복 허용 순열) 2개를 뽑는 모든 순열 구하기
result = list(product(data,repeat = 2))

# (중복 허용 조합)2개를 뽑는 모든 조합 구하기
result = list(combinations_with_replacement(data,2))

6. heapq

import heapq

hq =[]
heapq.heappush(hq,1) # 리스트에 min heap기준으로 값 추가
heapq.heappop(hq)    # 리스트에 min heap기준으로 값 삭제 후 반환
heapq.heapify(hq)    # 기존 리스트를 min heap 으로 반환

7. bisect

from bisect import bisect_left, bisect_right

a = [1, 2, 4, 4, 8]

print(bisect_left(a, 3))  # 2
print(bisect_right(a, 5)) # 4

8. Collections (deque도 있으나 패스)

- 추가적으로 만약 stack을 풀다가 뒤어꺼가 아닌 앞에꺼를 잠깐 빼고 싶다면 stack.pop(0)이렇게 빼자

# 1. 사전 자료형의 value를 리스트로 만들고 추가하는 방법
from collections import defaultdict
data = defaultdict(list)
tickets = [[0,0],[1,1],[2,2]]
for ticket in tickets:
    data[ticket[0]].append(ticket[1])
    
 
# Counter
from collections import Counter
list = ['Hello', 'HI', 'How', 'When', 'Where', 'Hello']
print(Counter(list)) # Counter({'Hello': 2, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1})
value = "Hello Appia"
print(Counter(value)) # Counter({'l': 2, 'p': 2, 'H': 1, 'e': 1, 'o': 1, ' ': 1, 'A': 1, 'i': 1, 'a': 1})
print(Counter(value).most_common()) # [('l', 2), ('p', 2), ('H', 1), ('e', 1), ('o', 1), (' ', 1), ('A', 1), ('i', 1), ('a', 1)]
print(countValue.most_common(2) # [('l', 2), ('p', 2)]

 

9.math

- round함수는 math에 포함되지 않으며 뒤에 인자를 하나더 받을 수 있음 (그 위치에서 반올림)

import math

print(math.factorial(5)) # 5 팩토리얼 출력

print(math.sqrt(7)) # 7의 제곱근 출력

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

print(math.pi) # 파이 출력

print(math.e) # 자연상수 출력

math.ceil(5.123) # 소수점 올림

math.floor(5.123) # 소수점 내림

round(5.123) # 소수점 반올림
round(5.123,1) # 소수점 반올림

10. 정렬

e = [[1, 3], [0, 3], [1, 4], [1, 5], [0, 1], [2, 4]]
f = sorted(e, key = lambda x : [x[0], -x[1]]) # 아이템 첫번째는 오름차순, 후에 두번쨰는 내림차순

11. 다익스트라

https://www.acmicpc.net/problem/1916

import heapq
import sys

input = sys.stdin.readline
N = int(input())
M = int(input())
graph = [[] for _ in range(N+1)]
visit = [1e9]*(N+1)

for i in range(M):
    a,b,c = map(int,input().split())
    graph[a].append((c,b))

start,end = map(int, input().split())

def sol(start):
    global graph,visit
    pq = []
    heapq.heappush(pq, (0,start))
    visit[start] = 0

    while pq:
        c_dist,cur = heapq.heappop(pq)

        if visit[cur] < c_dist : continue

        for n_dist,next in graph[cur]:
            weight = n_dist + c_dist
            if visit[next] > weight:
                visit[next] = weight
                heapq.heappush(pq, (weight,next))

sol(start)
print(visit[end])

12. 문자열 관련 함수

# 대 소문자 함수
'ponyozzang'.upper() # 해당 문자열을 대문자로 변환
'ponyozzang'.lower() # 해당 문자열을 소문자로 변환
'ponyozzang'.isupper() # 해당 문자열이 전부 대문자인지 판단
'ponyozzang'.islower() # 해당 문자열이 전부 소문자인지 판단

# 문자열 변경
replaceAll= '123,456,789,999'.replace(",","")

# 특정 문자 찾기
s = '가나다라 마바사아 자차카타 파하'
s.find('마') 	# 5
s.find('가',5) 	# -1

# 회문
s = '가나다다나가'
if s == s[::-1]: print('회문이다')
else :print("아니다")

# 문자열 뒤집기
a = 'abcde'
a = a[::-1]
print(reversed(a))

 

14. 유니온 파인드 & 크루스칼 알고리즘

def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]

def union_parent(parent, a, b):
    a = find_parent(parent, a)
    b = find_parent(parent, b)

    if a < b:
        parent[b] = a
    else:
        parent[a] = b

edges = [[1,2,29], [1,5,75],[2,3,35],[2,6,34],[3,4,7],[4,6,23],[4,7,13],[5,6,53],[6,7,25]]
v,e = 7,9

parent = list(range(v+1))
result = 0
edges.sort(key =lambda x:x[2])

for e in edges:
    a,b,cost = e
    if find_parent(parent, a) != find_parent(parent, b):
        union_parent(parent, a, b)
        result += cost

print(result) # 159

 

문제지

#기본#########################################################
## 나누기 2만들기

## 실수 더하기
# a = 0.3 + 0.6

# 아스키 코드 a -> b로 바꾸기

#입력#########################################################
##임포트하기

## N개의 정수를 한 줄로 입력 받았을 경우
#N,M,K

## N개의 정수를 한 줄로 입력 받아 List에 저장할 경우
# data

## N개의 정수를 여러 줄에 걸쳐 입력 받아 List에 저장할 경우
# N
# data

## N개의 문자열을 여러 줄에 걸쳐 입력 받아 List에 저장할 경우

## N개의 정수를 여러 줄에 걸쳐 입력 받아 이차원 배열에 저장할 경우

#출력###############################################################
## 띄어쓰기로 된 여러 변수를 출력하는 법

## 콜론 ':' 기호를 사이에 두고 값을 출력

## 줄바꿈없이 띄어쓰기로 출력 두번 하기

## 출력할 문자열 중간에 변수 넣기 2020년 1월 10일
# month = 1
# day = 10

## 2진수, 8진수, 16진수 기본출력, 0b빼기
# a = 15

# 해쉬 갯수세기###################################################
# data = [['a',1],['b',2],['c',5],['a',3],['c',2],['d',3]]

# 리스트########################################################
## 1. 1부터 100까지 리스트 만들기

## 2. 2차원 배열 초기화
# n,m = 3,4
# arr =

## 3. 2차원 리스트 초기화
# arr2 =

## 4. 리스트 안에 원소 삽입
# a = [1,4,3]
# b = [2,5]

## 5. 특정 인덱스에 데이터 추가 (인덱스 2에 3추가)

## 6. 리스트 안에 1 갯수세기

## 7. 리스트 안에 1 위치 찾기

# zip 함수########################################################
# number = [1,2,3]
# english = ['a','b','c']
# korean = ['ㄱ','ㄴ','ㄷ']

# 내장함수 함수########################################################
## 1, 리스트 -> 문자열 변환
# str_list = ['There', 'is', 4 ,"items"]


# 순열조합 세트 ########################################################
# data = {'가','나','다','라','마','바','사'}
## 1. 순열

## 2. 조합

## 3. 중복 순열

## 4. 중복 조합

# priorityQueue ########################################################
## 1. 추가

## 2. 삭제

## 3. minheap 반환

# 이분탐색 ########################################################
# a = [1, 2, 4, 4, 8]

# 사전자료리스트형, 숫자 세기 ############################################
## 1. 사전자료리스트형
# tickets = [[0,0],[1,1],[2,2]]

## 2. 숫자 세기, 가장 많이 나온거 찾기
# list = ['Hello', 'HI', 'How', 'When', 'Where', 'Hello']
# value = "Hello Appia"

# 수학 함수 ############################################
## 1. 소수점 올림

## 2. 소수점 내림

## 3. 소수점 반올림

# 정렬 ############################################
## 1. 아이템 첫번째는 오름차순, 후에 두번쨰는 내림차순
# e = [[1, 3], [0, 3], [1, 4], [1, 5], [0, 1], [2, 4]]

# 다익스트라 ############################################
## https://www.acmicpc.net/problem/1916

# 문자열 관련 함수 ############################################
## 1. 대문자로 변환, 소문자로 변환, 해당 문자열이 전부 대문자인지 판단, 해당 문자열이 전부 소문자인지 판단

## 2. 문자열 변경

## 3. 특정 문자 찾기

## 4. 회문
# s = '가나다다나가'

## 5. 문자열 뒤집기
# a = 'abcde'

# 유니온 파인드 & 크루스칼 알고리즘 ############################################
# edges = [[1,2,29], [1,5,75],[2,3,35],[2,6,34],[3,4,7],[4,6,23],[4,7,13],[5,6,53],[6,7,25]]
# v,e = 7,9

틀린문제

# 기본#########################################################
# 실수 더하기
# a = 0.3 + 0.6
# print(round(a,4))
# 아스키 코드 a -> b로 바꾸기
# a='a'
# print(chr(ord(a)+1))
# 출력###############################################################
# 2진수, 8진수, 16진수 기본출력, 0b빼기, 대문자로 출력
# a = 15
# print(format(a,'b'))
# print(format(a,'o'))
# print(format(a,'x'))
# 리스트########################################################
# 4. 리스트 안에 원소 삽입
# a = [1,4,3]
# b = [2,5]
# a.extend(b)
# print(a)
# # 수학 함수 ############################################
# import math
# # 1. 소수점 올림
# print(math.ceil(1.123))
# # 2. 소수점 내림
# print(math.floor(1.123))
# # 3. 소수점 반올림
# print(round(1.123,2))
# 문자열 관련 함수 ############################################
# # 4. 회문
# s = '가나다다나가'
# if s == s[::-1]: print('회문')
# # 5. 문자열 뒤집기
# a = 'abcde'
# b = a[::-1]
# print(b)

'코딩 테스트 > 코딩테스트 - 학습' 카테고리의 다른 글

[DP] 누적합 알고리즘  (0) 2023.01.31
DP  (0) 2023.01.30
Union Find 서로소 집합 알고리즘  (0) 2023.01.28
(그리디) 크루스칼 알고리즘  (1) 2023.01.28
문자열  (0) 2023.01.25