Covenant


왜 이 글을 쓰는가?


많은 기업들이 코딩테스트를 치릅니다. 취준생은 이에 맞추어 준비를 해야합니다. 코딩테스트는 처음 공부하려면 막막하고 당황스러울 것입니다. 심지어 코딩테스트 때 작성한 코드를 면접에서 물어본다니.. 취업 준비생들의 당황스러움과 부담감은 상당할 것입니다. 이러한 마음을 한 마디로 요약하면 아마 이렇지 않을까요?

이럴때 어떻게 코드를 써야하지?

이렇게 코드를 써도 되나..?


코딩테스트는 일반적인(?) 코딩과 다르게 객체 지향적으로 짤 필요도 없고, 직접 자료구조를 구현할 필요도 없습니다. 주어진 시간 내 간결함과 정확함이 생명입니다. 제가 직접 백준 문제와 기업 입사 코딩테스트를 풀면서, 다른사람의 풀이를 참고하면서 개인적으로 Notion에 정리해놨습니다. 정리해놓은 내용이 방대해 지고 이것을 처음 코딩테스트를 준비하는 사람에게 알려주면 좋지 않을까? 생각하여 이렇게 글을 씁니다. 파이썬으로 코딩테스트를 시작하는 분들에게 도움이 되었으면 좋겠습니다.



1. 다양한 입력


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



1-1. 나누어 입력받기


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

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

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



1-2. 입력 출력 가속


백준 1927번, 백준 10845번 처럼 입력 값이 많은 경우 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 에러를 만나실 것입니다.

(참고 영역은 @growingtree님의 기여로 작성되었습니다. 감사합니다^^)


그러나 시간이 생명인 코딩테스트에서 입력, 출력에 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
for i in range(int(input())): 
    inputStr = input() 
    arr = list(inputStr) 
    MAP.append(arr)

▲ Bad Code

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

▲ Good Code



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']]

▲ 저장 하고 싶다..

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

▲ Wrong Code

위와 같이 입력을 받으면 arr에는 아래와 같이 저장이 됩니다.

arr = ['AAAA', 'ABCA', 'AAAA']

우리의 목표를 이루기 위해서 list(input()) 이라고 하면 됩니다. list를 input 앞에 붙이면 입력받은 문자열을 글자로 잘라서 저장을 합니다. 잘 몰랐을 때에는 split으로 어떻게 해보려고 참 어렵게 노력했습니다.

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

▲ Good Code



3. 배열 출력


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

arr = [1, 2, 3, 4] 

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

1234

▲ 출력결과

이 때 어떻게 구현하면 좋을까요?

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

▲ Good Code

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


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


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

arr = [1, 2, 3, 4]

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

1 2 3 4

▲ 출력결과

for num in arr:
    print(num)

▲ Bad Code

for 문을 작성하여 arr에 저장되어있는 원소를 하나씩 출력해도 되지만 더 간한한 방법이 있습니다.

print(*arr)

▲ Good Code

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



99. 보너스


보너스는 코딩테스트 및 대회에서 절대 나올일이 없습니다. 바쁘시다면 본 지면의 글은 넘어가셔도 됩니다! 다만 보너스로 설명하는 것입니다!

3
1 2 3
4 5 6
7 8 9

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

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

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



본 챕터를 마치며


본 챕터에서 코딩테스트의 기본이 되는 입력과 출력에 대해서 알아봤습니다. 가장 기본이 되면서 처음 공부하면 헷갈릴 수 있습니다. 하지만 어떠한 문제를 풀더라도 입출력은 기본이니 가장 친구같은 코드입니다! 다음 챕터에서 만나요!