자료구조 및 알고리즘/코딩테스트 준비

코딩테스트 준비 2편

viamemine 2024. 6. 10. 14:58
728x90
반응형
더보기
더보기

해당 글은 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
728x90

'자료구조 및 알고리즘 > 코딩테스트 준비' 카테고리의 다른 글

다이나믹 프로그래밍  (0) 2024.06.12
정렬 ・ 이진 탐색  (0) 2024.06.12
주요 라이브러리 ・DFS ・BFS  (0) 2024.06.12
코딩테스트 준비 3편  (1) 2024.06.10
코딩테스트 준비 1편  (2) 2024.06.10