해당 글은 https://covenant.tistory.com/142 를 참고하여 작성하였습니다.
1. 정수
1-1. 최대, 최소
ans = ???
for num in arr:
if ans > num:
ans = num
print(ans)
배열 arr에 있는 값을 for문으로 순회하고 있습니다. 마지막에 출력되는 ans에 arr에 저장되어 있는 값 중 최솟값이 저장되게 하고 싶습니다. 그렇다면 첫번째 줄 ans에 무엇을 저장해야 할까요 ? arr에 있는 최댓값보다 큰 수가 저장되면 됩니다.
ans = 999999
ans에 임의로 큰 값을 쓰는 방법도 있습니다. 보통은 문제에서 주어지는 입력 범위 값보다 큰 값을 설정합니다. 예를 들어 arr에는 100,000을 넘지 않는 값이 저장된다고 하면 ans = 100,001로 초기화 하면 됩니다. 하지만 최대/최소 범위를 정하기 애매한 상황에서 우아한 방법은 아래와 같습니다.
import sys
ans = sys.maxsize
ans 값을 출력하면 큰 값이 출력됩니다. 다만 파이썬은 1편에서 설명한 것처럼 아무리 큰 정수라도 범우의 제한없이 연산이 가능합니다. 따라서 sys.maxsize가 저장된 ans라 하더라도 ans += 1 연산이 가능하다는 사실은 참고로 알아주세요.
2. 진법
진법은 입사 코딩테스트에서 빈도가 많이 떨어집니다.
2-1. 10진수 → 2, 8, 16진수 변환
>>> bin(42)
>'0b101010'
>>> oct(42)
>'0o52'
>>> hex(42)
>'0x2a'
정수값에 bin, oct, hex를 붙이면 각각 2진수, 8진수, 16진수 입니다.
2-2. 2, 8, 16진수 → 10진수 변환
>>> int('0b111100', 2)
> 60
>>> int('0o74', 8)
> 60
>>> int('0x3c', 16)
> 60
주어진 2진수, 8진수, 16진수를 10진수로 변환하면 60이 나옵니다.
2-3. 진법 연산 예제
3
1001101 10010
1001001 11001
1000111 1010110
백준 2729번 이진수 덧셈 문제를 요약하면 첫 줄에는 테스트 케이스의 수가 주어지며, 테스트 케이스 줄 수 만큼 2진수가 두 개 주어진다고 했을 때 각 이진수의 합을 구하라는 문제입니다.
for _ in range(int(input())):
A, B = map(int, input().split())
print(bin(A)+bin(B))
일단 int로 입력받아 bin()으로 변환하고 바로 덧셈 연산을 하면 됩니다. 그러면 이진수는 이진수 연산이 이루어집니다.
3. 문자열
3-1. 문자열을 거꾸로
문자열 ABCD를 DCBA로 바꾸는 코드는 다음과 같습니다.
alph = "ABCD"
alph[::-1]
이와 같은 방법으로 백준 10988번 팰린드롬인지 확인하기 문제를 쉽게 풀 수 있습니다.
inputStr = input()
if inputStr == inputStr[::-1]:
print(1)
else:
print(0)
팰린드롬 문자는 앞으로 읽어도, 뒤로 읽어도 같습니다. 따라서 정방향 문자열과, 역방향 문자열을 한글자씩 비교하면 됩니다.
3-2. 문자열 <-> 아스키코드
ord() # 문자를 아스키코드로 변환하는 함수
chr() # 아스키코드를 문자로 변환하는 함수
4. 배열
4-1. 배열 초기화
배열 초기화는 그래프 문제를 해결할 때 밥 먹듯이 사용합니다. 초기화 형태를 기억하셔서 거침없이 사용하기를 바랍니다.
3 5
두 정수가 첫째줄에 입력값으로 들어옵니다. 첫 번째 정수는 배열의 가로 크기를, 두 번째 정수는 배열의 세로 크기인 0으로 초기화된 배열을 만들어봅시다. 위의 입력값은 가로 3, 세로 5인 크기의 배열을 0으로 초기화해야 합니다.
N, M = map(int, input().split())
arr = [[0] * N for _ in range(M)]
여기서 팁을 드리면 배열의 가로 세로를 N, M으로 정하면 편합니다. 문제마다 가로와 세로를 M와 N으로 문제와는 반대로 주는 경우가 있는데 여러분들이 딱 N, M을 가로, 세로로 쓴다고 정하면 index out of range에서 자유로울 수 있습니다.
4-2. 배열의 원소를 거꾸로
arr.reverse()
배열의 원소를 거꾸로 하려면 reverse()를 사용하면 됩니다. 반환 값이 없으니 이점 유의해주세요.
arr = list(map(int, list(String)))
arr = [int(i) for i in String]
두 코드 모두 arr에 [1, 2, 3]이 저장됩니다.
4-3. 배열 원소 갯수
list.count(찾는 값)
값이 배열에 몇 개가 있는지 찾으려면 위와 같이 쓰면 됩니다.
str.count(찾는 값)
배열 뿐만 아니라 문자열도 가능합니다.
4-4. 원소 중복 제거
alpha = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c', 'd' ]
alpha = list(set(alpha))
set은 저장된 원소가 유일합니다. 따라서 배열에 저장된 값이 중복없이 alpha에 저장됩니다. 여기서 한 단계 더 들어가볼까요 ?
lst = [[1,2], [1,2], [1]]
2차원 리스트가 있습니다. 중복된 값을 제거하려면 어떻게 해야할까요 ?
print(list(set(map(tuple, lst))))
위와 같이 작성하면 됩니다.
4-5. 배열 정렬
arr.sort()
배열을 오름차순으로 정렬하는 방법은 위와 같습니다.
arr.sort(reverse=True)
배열을 내림차순으로 정렬하는 방법은 위와 같습니다.
배열의 원소가 한 개가 아닌 리스트라면 다음과 같은 방법을 사용합니다.
arr.sort(key=lambda x:(x[0], x[1]))
위의 코드를 바탕으로 백준 11650번 좌표 정렬하기 문제를 해결 할 수 있습니다. N개의 점이 주어지고 각 줄에 x와 y 좌표 정보가 주어집니다. x좌표가 증가하는 순으로 정렬하며, x 좌표가 같으면 y좌표를 기준으로 출력하는 코드를 작성해야 합니다.
N = int(input())
coord = []
for i in range(N):
coord.append(list(map(int, input().split())))
coord.sort(key = lambda x:(x[0], x[1]))
# x좌표를 정렬하고
# x좌표가 같다면 y좌표를 기준으로 오름차순 정렬
for x, y in coord:
print(x, y)
그렇다면 내림차순 정렬을 하는 방법은 무엇일까요 ? -x[0] 이렇게 -를 붙이면 됩니다. 이 방법을 이용하면 백준 10825번 국영수 문제를 해결할 수 있습니다.
N = int(input())
students = []
for i in range(N):
students.append(list(map(str, input().split())))
# 파이썬 정렬 라이브러리는 O(NlogN)의 시간복잡도를 가짐
students.sort(key = lambda x: (-int(x[1]), int(x[2]), -int(x[3]), x[0]))
for i in students:
print(i[0])
파이썬에서는 삼항 연산자를 다음과 같이 사용합니다.
[True 조건] if 조건 else [False 조건]
a와 b 중에서 큰 값을 res에 저장한다고 합시다.
if a > b:
res = a
else:
res = b
혹시 이렇게 코드를 작성하시나요 ? 우아한 방법으로 다음과 같이 써주세요 !
res = a if a > b else b
'자료구조 및 알고리즘 > 코딩테스트 준비' 카테고리의 다른 글
다이나믹 프로그래밍 (0) | 2024.06.12 |
---|---|
정렬 ・ 이진 탐색 (0) | 2024.06.12 |
주요 라이브러리 ・DFS ・BFS (0) | 2024.06.12 |
코딩테스트 준비 3편 (1) | 2024.06.10 |
코딩테스트 준비 1편 (2) | 2024.06.10 |