알고리즘 뿌셔/파이썬

[알고리즘 / Python] Input 값 입력 받기

데브티치 2021. 8. 17. 15:03

이 글에는 알고리즘을 풀 때 백준, SWEA 와 같이 사용자가 Input 처리부터 해야할 때 기본적인 파이썬의 자료구조, 문법을 알고있다는 가정하에서의 활용에 대한 설명이 있습니다.

 

코딩 테스트를 준비할 때 사용하는 플랫폼의 종류에 따라서 제출해야하는 형식, 입력받는 형식 등이 달라지게 됩니다.

대표적으로 코딩 테스트를 시행하는 프로그래머스, 구름 플랫폼은 아래와 같이 solution이라는 함수 호출 식으로 인자를 넘겨받게 되므로 별도의 Input 값 처리가 필요하지 않습니다.

# 파이썬
def solution(n):
        answer = 0
        return answer

이와 같이 입력 값을 매개변수로 넘겨 받고 함수 내부에서 필요한 값(n)을 사용하고 정답을 return 하면 되는 방식입니다.

 

 

그러나 백준, SWEA와 같은 사이트는 아래의 사진과 같이 예제 입력, 출력을 직접 복사하여 내 코드를 테스트 해봐야 합니다.

 

저는 자바를 사용할 때는 System.in을 사용하여 콘솔창에서 처리를하고, 파이썬을 사용할때는 문제번호.txt로 파일을 생성하여 예제 입력을 복붙해놓고 파일을 읽는 방식으로 처리합니다.

 

sys를 import하여 input()을 사용하여 받아 올 수 있습니다.

import sys
sys.stdin = open('파일명.txt', 'r')
N, M = map(int, input().split()) #2 3 과 같이 공백으로 띄워서 들어왔을 때
arr = list(input()) #10011 -> arr ['1','0','0','1','1']

 

공백으로 띄워서 들어왔을 때

2 3 과 같이 공백으로 띄워서 들어온다고 하면 split()을 이용하여 공백 처리를 해줘야 합니다.

N, M = map(int, input().split())을 사용한다면 N에는 2, M에는 3의 값이 들어가게 됩니다.

 

공백 없이 연속으로 들어왔을 때

str로 처리를 하거나 array로 받아서 사용할 수 있습니다.

10011과 같은 Input이면 arr = list(input())과 같이 처리하면 arr에는 ['1', '0', '0', '1', '1']의 값이 들어갈 수 있습니다.

 

테스트 케이스의 값이 주어지고 여러줄을 반복문으로 받아야 할 때

5  #받아야 하는 line 수
1 2
3 4
5 6
7 8
9 10

위와 같은 Input이 주어지고 5가 테스트케이스의 값이라고 할 때, 5와 같이 작은 수라면 문제가 되지 않지만 큰 수가 들어온다면 많은 경우에 시간초과를 발생한다고 합니다. 그래서 아래의 코드와 같이 sys.stdin.readline()를 이용하여 받아야 합니다.

import sys
tc = int(input())
for i in range(tc):
    n,m = map(int, sys.stdin.readline().split())

반복횟수를 10만으로 했을 때 각 언어에서 입력방법에 따른 입력 속도 비교한 내용을 아래의 링크로 공유합니다. 참고하시면 좋을 것 같습니다.

 

입력 속도 비교

 

입력 속도 비교

여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일

www.acmicpc.net

 

2차원 배열을 받아서 처리해야하는 경우

미로 찾기 문제나 대표적인 BFS, DFS 문제인 토마토와 같은 문제는 2차원 배열을 받아서 처리해야합니다. 이때는 아래와 같은 코드를 활용하면 됩니다.

#2차원 배열 받기
map = [[int(k) for k in input().split()] for _ in range(N)]

 

2차원 배열을 선언하는 경우

DP 문제나 BFS, DFS 문제를 풀 때 2차원 배열을 선언해서 사용하는 경우가 많습니다. 이런 경우에는 아래와 같은 코드를 활용하면 됩니다.

#2차원 배열 선언 N(열)xM(행) 배열 생성
dp = [[0 for i in range(N)] for j in range(M)]

위와 같은 코드를 사용하지 않고 일차원 배열을 생성한뒤 곱하는 방식을 사용했을 때

ex) dp = [[0]*N] * M

얕은 복사를 실행하기 때문에 원하는 방식으로 이차원 배열을 생성할 수 없습니다.

 

JAVA로 풀다가 Python으로 문제를 풀 때 가장 처음 봉착하는 문제들에 대해서 다뤄보았습니다.

다음에는 JAVA를 이용하여 Input을 처리하는 방법에 대해서 써보도록 하겠습니다.