파이썬으로 알고리즘을 풀어보자! - 1. 입문
Python의 입출력에 대하여 2020-03-21

Python으로 알고리즘이라고요?

Python은 좋은 언어 입니다. 코딩하기도 쉽고, 가독성도 좋죠. 하지만, 그에게 단점이 있다면, 프로그램 속도일 것입니다. C++과 같은 컴파일 언어와 다르게, Python인터프리터 언어이기 때문이죠. 하지만, 요즘 컴퓨터 속도의 발전과 함께, 기업에서 채용을 위한 코딩 테스트를 실시 할 때 Python으로 코딩 테스트를 보게 해 주는 경우가 많아지고 있습니다. 언어 사용 능력보단 문제 해결 능력이 프로그래밍의 세계에선 더 중요하기 때문이죠.

Python도 요즘 코딩 테스트에서 "인싸" 언어라구요?

하지만, Python으로 알고리즘을 풀기 전에 유의해야 할 것들이 있습니다. 일단 C++로 알고리즘 문제를 풀때, cin 객체를 이용 하여 입력을 받는 것보단, scanf() 함수를 이용해서 입력을 받는게 더 빠르듯, Python알고리즘 문제 해결을 위한 몇 개의 함수들이 존재 합니다. 또한, Python 3 인터프리터를 그대로 사용하는 것보다, PyPy3라는 인터프리터를 사용하는게 더 빠른 프로그램 실행에 좋습니다.

입력을 받아보자!

Python을 사용하는 많은 사람들은 input() 함수를 통해 입력을 받을 것입니다. 하지만, 우리는 이제 sys 모듈과 친해질 것 입니다. sys 모듈은 사용자와 컴퓨터, 혹은 파이썬 인터프리터와의 상호 작용들을 도와주는 함수, 변수들을 모아놓은 모듈입니다. 일단, 오늘은 알고리즘 문제를 해결하는 데 필요한 함수들만 사용 할 것입니다. 더 많은 설명들은 sys 모듈에 관한 Document를 참고해 주세요.

sys.stdin.readline()

해당 함수는 단, 한줄을 입력 받은 후, 입력 받은 값을 가진 str 객체를 반환합니다. input() 함수와 기능이 똑같습니다. 여기서 알아 두면 좋은 것은 sys.stdinfile 객체와 사용 방법이 똑같습니다. 단지 입력을 인터프리터 내에서 받냐, 파일에서 받냐가 다를 뿐이죠.

  • int 객체를 입력 받고 싶을 때

    import sys
    n = int(sys.stdin.readline())
  • 한 줄에 여러가지 입력이 필요할 때

    import sys
    arr = sys.stdin.readline().split()

    입력이 '1 2 3 4 5' 면 결과는 ["1", "2", "3", "4", "5"] 가 된다.

map(function, iterable):

map() 함수는 iterable 가능한 객체 내부의 모든 element에 특정 작업을 하기 위해서 사용합니다. 특히 형변환 시의 속도가 빠릅니다. function 파라미터에 lambda식을 넣어서 작업을 할 수도 있지만, 이는 나중에 다룰 list comprehension이 더 빠릅니다. map() 함수는 map 객체를 반환하므로, list 객체로의 형변환을 필요로 합니다.

  • 한 줄에 여러 가지 입력을 받은 후, int 객체로의 형 변환이 필요할 때.

    import sys
    arr = list(map(int, sys.stdin.readline().split()))

    입력이 '1 2 3 4 5' 면 결과는 [1, 2, 3, 4, 5] 가 된다.

list comprehension

list comprehensionlist 객체 선언부에서 for 문을 이용하여 객체를 선언하는 것입니다. lambda 식으로 처리할 데이터를 for문 앞에 그냥 작성 하면 되죠.

  • 한 줄에 여러 가지 입력을 받은 후, 함수를 이용한 데이터 조작이 필요할 때.

    import sys
    arr = [int(x) * 2 + 1 for x in sys.stdin.readline().split()]

    입력이 '1 2 3 4 5' 면 결과는 [3, 5, 7, 9, 11] 가 된다.

출력을 해보자!

sys.stdin입력에 관련된 객체라면, 그에 맞는 짝도 있어야 겠지요? sys.stdout출력에 관련된 객체입니다. 사실 print() 함수를 그냥 사용해도 속도에는 큰 차이가 없어 무방하지만, 특수한 경우에는 속도 차이가 크게 나는 경우가 있기 때문에, 알아두는 게 좋습니다.

sys.stdout.write(str)

print()와 기능은 똑같지만, 주의해야 할 점 두 가지가 있다면, 첫 번째는 str 객체로의 형변환이 필수라는 것, 두 번째는 print() 함수 처럼 자동으로 개행 해주는 것이 아닌, '/n'을 이용한 개행을 해야 한다는 것입니다. 아래 코드의 두 번째, 세 번째 줄은 똑같은 기능을 합니다.

import sys
print(1)
sys.stdout.write(str(1) + '\n')

출력
1
1

마치며

일단 오늘은 Python을 이용한, 데이터의 빠른 입출력에 대해서 알아 보았습니다. 다음 시간에는 Python으로 알고리즘 문제를 해결 할 때 사용 하기 유용한 내장 모듈과 내장 함수들에 대해서 알아 보겠습니다. 다음에 뵙겠습니다!