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

코딩테스트 준비 1편

viamemine 2024. 6. 10. 12:31
728x90
반응형
더보기
더보기

해당 글은 https://covenant.tistory.com/141 를 참고하여 작성하였음을 알려드립니다.

 

코딩테스트는 객체 지향적으로 코드를 짤 필요도 없고, 직접 자료구조를 구현할 필요도 없습니다. 주어진 시간 내 간결함과 정확함이 생명입니다. 파이썬으로 코딩테스트를 준비하시는 분들에게 도움이 될만한 자료들을 공유합니다.

 

1. 다양한 입력

코딩테스트에서 기본은 주어진 테스트 케이스를 입력 받는 것입니다. 

 

1-1. 나누어 입력받기

다음 입력값이 주어졌을 때 각각 변수에 값을 입력받는 법을 보겠습니다. 

1 2

 

a, b = map(int, input().split())

 

C, JAVA의 경우 데이터 타입(int, long long ...)에 따라서 저장할 수 있는 최대 정수의 범위가 결정되지만 파이썬은 큰 정수를 별다른 처리 없이 연산할 수 있습니다.

 

 

1-2. 입력 추력 가속

 

입력 값이 많은 경우 input()를 사용하면 pypy3으로 제출하더라도 시간초과를 경험하게 됩니다. 이럴 때 빠르게 입력 받는 법이 있습니다. 

import sys
N = int(sys.stdin.readline())
sys.stdout.write(str(N))

 

위와 같이 사용하면 같은 코드이지만 시간초과가 나오지 않고 맞았습니다 ! 라고 나오는 것을 볼 수 있습니다. 

 

 

* 참고

sys.stdout.write(str(N))에서 정수로 받은 N을 문자열로 변환하였습니다. sys.stdout.write은 print 함수와 다르게 문자열인 경우에만 출력할 수 있습니다. 문자열로 변환하지 않고 정수 N을 출력한다면 TypeError: write() argument must be str, not int 에러를 만날 것입니다. 

 

 

그러나 시간이 생명인 코딩테스트에서 입력, 출력에 sys.stdout이라고 쓰는 것은 매우 번거롭습니다. 더 간단하게 작성하는 방법은 아래와 같습니다.

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

 

위와 같이 코드 맨 위에 작성하면 평소에 print() 함수를 호출하듯이 쓰면 됩니다. 그러나 항상 입출력 가속함수를 사용하지는 않습니다. 일반적인 코딩테스트에서 입출력 가속함수를 안쓰면 시간초과가 나고, 쓰면 초과하는 경우는 없습니다. 만약 초과가 난다면 입출력 가속함수를 사용하지 않아서가 아니라 더 효율적인 시간복잡도를 알고리즘으로 문제를 해결하셔야 합니다. 

 

 

2. 배열 입력 

 

파이썬은 다른 언어와 다르게 한 줄로 많은 것을 할 수 있습니다. 코드를 함축하는데 처음에는 어려움을 겪을 수 있지만, 매번 반복해서 등장하는 코드는 변하지 않으니 자주 보다보면 익숙해집니다.

 

2-1. 우아한 배열 입력

첫 번째 줄에는 입력되는 숫자들의 줄 수가 주어지며, 다음 줄부터 숫자들이 공백을 기준으로 주어집니다. 

3
1 2 3
4 5 6
7 8 9

 

▾ Bad Code 

for i in range(int(input())):
    inputStr = input()
    arr = list(inputStr)
    MAP.append(arr)

 

▾ Good Code 

MAP = [list(map(int, input().split())) for _ in range(int(input()))]

 

2-2. 정수와 배열이 같은 줄에 들어오는 경우 

백준 9613에서 사용할 수 있는 코드입니다. 한 줄에는 수의 개수 n가 주어지고, 다음에는 n 개의 수가 주어진다. 이 때의 입력을 어떻게 구현할 수 있을까요 ?

4 10 20 30 40
3 7 5 12
3 125 15 25

 

N, *arr = map(int, input().split())

 

arr 변수 앞에 * 를 붙이면 뒤이어 나오는 값이 arr에 배열로 저장이 됩니다. 첫째줄을 예로 들자면 4는 N에 저장이 되고 arr에는 [10, 20, 30, 40]이 저장됩니다. 

 

2-3. 문자열을 한 글자씩 배열에 저장

문자열을 한 글자씩 배열에 저장을 해야할 때가 있습니다. 특히 그래프에서 이와 같은 코드를 사용할 때가 많습니다. 

3
AAAA 
ABCA 
AAAA

 

arr = [['A', 'A', 'A', 'A']
       ['A', 'B', 'C', 'A']
       ['A', 'A', 'A', 'A']]

 

▾ Wrong Code 

이렇게 입력하면 arr은 아래와 같이 저장됩니다.

arr = [input() for _ in range(N)]
arr = ['AAAA', 'ABCA', 'AAAA']

 

우리의 목표를 이루기 위해서 list(input())이라고 하면 됩니다. list를 input 앞에 붙이면 입력받은 문자열을 글자로 잘라서 저장합니다.

 

Good Code

arr = [list(input()) for _ in range(N)]

 

 

3. 배열 출력

3-1. 배열을 연결해서 출력

 

arr = [1, 2, 3, 4]

 

arr 배열에 정수의 값이 저장되어 있습니다. 이 배열을 아래와 같이 공백 없이 이어서 출력하고 싶습니다. 

1234

 

arr = [1, 2, 3, 4] 
print("".join(map(str, arr)))

 

map 함수를 이용해서 arr에 저장되어 있는 정수의 값을 string 형식으로 변환합니다. 그 다음 "".join을 이용하여 공백 없이 값을 출력할 수 있습니다. 

 

3-2. 배열을 연결해서 출력 2

여러분이 어렵게 알고리즘을 작성하였습니다. 그래서 최종 정답을 arr에 [1, 2, 3, 4]로 저장했습니다.

arr = [1, 2, 3, 4]

 

[과 ,를 빼고 출력하려면 어떻게 해야할까요 ?

 

▾ Bad Code 

for num in arr:
    print(num)

 

 Good Code

print(*arr)

 

arr 앞에 *를 붙이면 됩니다.

 

 

보너스 ! 

보너스는 코딩테스트 및 대회에서 절대 나올일이 없습니다. 

3
1 2 3
4 5 6
7 8 9

 

코딩테스트에서 입력값이 배열로 저장될 법한 값일 때는 항상 몇 개가 주어지는지 알려줍니다. 위의 입력값에서는 3이 그 역할을 합니다. 그렇다면 끝을 알 수 없는 입력이 들어온다면 어떻게 해야할까요 ?

try: 
    while 1: 
        A,B = map(int, input().split()) 
        print(A+B) 
    except: 
        exit()

 

while 1로 무한히 값을 입력 받아서 EOF까지 입력받으면 됩니다.

728x90

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

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