백준이 프로그래머스나 리트코드에 비해 짜증나는 부분은 인풋이 들어가는 형태도 고려해줘야 한다는 점이다. 오랜만에 백준으로 문제를 풀려니까 입력을 어떻게 할지부터가 난관이어서 입력 형식을 정리해보고자 한다. (언어는 파이썬)
백준 예제 입력은 위와 같이 들어올 때가 종종(아니 대부분) 있다. 그럼 \n으로 split을 하면 되지 않나? 하는데 왜인지 모르게 계속 오류가 났다. 공백 기준으로 해도 똑같은 에러가 계속 발생한다. (나 이전까지는 어떻게 해온 거지..머리에 든 게 없는 것을 겸허히 받아들이고 정리하기로 했다..)
위의 에러가 발생하는 이유는 애초에 input이라는 함수 자체가 \n이 들어오면 아예 입력을 마치는 것처럼 동작하기 때문이다. 따라서 여러 개의 입력값을 받기 위해서는 반복문을 활용해야 한다.
1. for loop을 이용해 input을 계속 받는 방법
이 경우에는 보통 input 맨 첫 줄에 몇 개의 입력이 들어올지 정해진다. 위의 예시와 같은 경우에는 총 9개의 input이 들어오는 것으로 이해하면 된다.
n,m = map(int, input().split()) # 앞의 글자는 n, 뒤의 글자는 m으로 할당됨.
arr = []
for _ in range(m): # m번 loop을 돌면서 input을 arr에 append
arr.append(list(map(int, input().split())))
어떤 식으로 입력을 받을지는 문제에 따라 달라질 것이다. 혹은 위에서 굳이 명시적으로 for loop을 돌면서 list에 append시키는 방법 이외에도 list comprehension을 통해서 입력을 받을 수도 있을 것이다.
2. input 자체를 사용자입력이 아니라 파일 입력으로 받는 법 (표준 입력을 파일로 설정)
1번 방법과 접근법은 동일하지만 조금 더 입력 과정을 편하게 해주기 위해서 입력값을 파일에 담아두고, 파일을 읽어오는 방식이다. 파일 입력의 경우에도 역시 어떤 형식으로 입력이 들어오는지를 파악하고 입력 받는 코드를 이후에 짜줘야 한다는 것을 기억하자.
import sys
# 표준 입력을 파일로 설정하기 -> input.txt를 읽어들여옴
sys.stdin = open("input_21924.txt", "r")
# 표준 입력을 파일로 바꿨으므로,
# input() 함수는 더이상 사용자 입력을 받지 않고, 지정된 입력 파일을 읽게 됨.
n,m = map(int, input().split())
# list comprehension을 이용해 이후의 입력값을 받아옴
arr = [list(map(int, input().split())) for _ in range(m)]
3. sys.stdin.readline() 사용
input보다 조금 더 빠르게 입력받기 위함. 역시 \n 이 들어오면 입력 받는 것을 중지하는 방식이므로, 위의 1번과 동일하되 input() 함수 대신 sys.stdin.readline()을 이용하면 된다.
import sys
n,m = map(int, sys.stdin.readline().split())
arr = [list(map(int, sys.stdin.readline().split())) for _ in range(m)]
위의 3가지 경우는 여러 줄로 입력이 들어왔을 때 어떤 식으로 처리할지에 대한 예시를 정리해둔 것이다. (+ 숫자를 str이 아니라 int로 바꾸는 것까지 포함) 이 글은 잠시 코딩과 멀리하다가 돌아왔을 때에 여러 줄 입력을 어떻게 처리하더라 하고 삽질을 최대한 방지하기 위해 가볍게 참고하면 될 듯하다.
한 편, 다른 형태로 들어왔을 때는 또 다르게 처리해야 하겠지만 위의 방식에 대한 변형 정도일테니 이 정도만 정리해두면 될 듯 하다. 한 줄로 여러 개가 들어왔을 때는 split을 사용해서 공백 기준 분리만 해주면 될 것이고, 한 줄에서도 하나만 들어온 경우에는 그냥 그대로 받아주면 될 것이다.
'프로그래밍 > 알고리즘 문제풀이' 카테고리의 다른 글
[python] 프로그래머스 - 스킬트리 (0) | 2021.12.09 |
---|---|
[python] 프로그래머스 - 올바른 괄호 (0) | 2021.12.09 |
[python] 프로그래머스 - K번째 수 (0) | 2021.02.15 |
[python] 프로그래머스 - 주식가격 (0) | 2021.02.15 |
[python] leetcode 739. Daily Temperatures (0) | 2021.02.13 |