백준에서 요구하는 input 작성 법

프로그래머스 문제를 풀다가 백준 문제를 보게되면 “???? 뭐지? 반환 값으로 값 받는건가?”, “input은 인자로 받는 건가?” 헷갈립니다. “백준에서 요구하는 input” 을 한 번 검색하고 나서야 어느 정도 힌트를 얻을 수 있었습니다.

이번 포스트에서는 백준에서 요구하는 input을 어떻게 코드로 작성하는지 정리해보았습니다.

백준에서 요구하는 input을 작성하기 위한 기본 개념

map 함수

map 함수는 주어진 함수를 iterable의 각 요소에 적용하여 결과를 새로운 iterable로 반환합니다.

# 예제 1: 각 숫자의 제곱을 계산
numbers = [1, 2, 3, 4, 5]

# 제곱 함수
def square(x):
    return x ** 2

# map 함수를 사용하여 각 숫자에 제곱 함수 적용
squared_numbers = map(square, numbers)

# 결과 출력
print(list(squared_numbers))  # [1, 4, 9, 16, 25]

물론 for 반복문을 사용해서 map 함수와 동일한 결과를 얻을 수도 있습니다.

# 예제 2: for 반복문으로 각 숫자의 제곱 계산
numbers = [1, 2, 3, 4, 5]

# 제곱 함수
def square(x):
    return x ** 2

# for 반복문을 사용하여 각 숫자에 제곱 함수 적용
squared_numbers = [square(x) for x in numbers]

# 결과 출력
print(squared_numbers)  # [1, 4, 9, 16, 25]

map 함수의 이점은?

위에서 설명한 것 처럼 map 함수는 반복문으로 충분히 대체 할 수 있습니다. 하지만 map 함수는 간결성, 가독성, 성능 최적화를 이유로 사용합니다.

장점설명
간결성map 함수를 사용하면 한 줄로 간결하게 표현 가능합니다.
가독성함수 적용이 명시적으로 드러나 가독성이 향상됩니다.
성능 최적화map 함수는 내부적으로 C 언어로 구현되어 성능 최적화가 되어 있습니다.

백준에서 요구하는 input 유형 1 : 한 줄 입력

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

백준에서 요구하는 input 유형 2 : 정해진 행렬의 입력

num_li = [list(map(int, input().split())) for _ in range(9)]
input = 3 23 85 34 17 74 25 52 65
10 7 39 42 88 52 14 72 63
87 42 18 78 53 45 18 84 53
34 28 64 85 12 16 75 36 55
21 77 45 35 28 75 90 76 1
25 87 65 15 28 11 37 28 74
65 27 75 41 7 89 78 64 39
47 47 70 45 23 65 3 41 44
87 13 82 38 31 12 29 29 80

num_li = [[3, 23, 85, 34, 17, 74, 25, 52, 65], [10, 7, 39, 42, 88, 52, 14, 72, 63], [87, 42, 18, 78, 53, 45, 18, 84, 53], [34, 28, 64, 85, 12, 
16, 75, 36, 55], [21, 77, 45, 35, 28, 75, 90, 76, 1], [25, 87, 65, 15, 28, 11, 37, 28, 74], [65, 27, 75, 41, 7, 89, 78, 64, 39], [47, 
47, 70, 45, 23, 65, 3, 41, 44], [87, 13, 82, 38, 31, 12, 29, 29, 80]]

백준에서 요구하는 input 유형 3 : 사용자의 입력 수에 따라 행이 달라지는 경우

K, N = map(int, input().split())

lan_lengths = [int(input()) for _ in range(K)]

아래와 같이 입력하면

4 11
802
743
457
539

아래와 같이 변수에 할당 됩니다.

K = 4
N = 11
lan_lengths = [802, 743, 457, 539]

심화. sys.stdin.readline() 사용

  • sys.stdin.readline(): 버퍼를 사용하여 입력을 처리하므로, 대량의 입력을 효율적으로 다룰 수 있습니다.
  • input() 함수: 입력을 한 번에 받아 처리하므로, 대량의 입력에는 적합하지 않을 수 있습니다.

숫자 n,m을 입력 받고 m행의 데이터를 입력 받는다고 하면 아래와 같이 작성할 수 있습니다.

import sys

n,m = map(int, sys.stdin.readline().split())
arr = [list(map(int, sys.stdin.readline().split())) for _ in range(m)]

만일 아래와 같이 입력이 된다면

1 2
1 2 3 4
10 9 8 7

아래와 같이 변수에 할당이 됩니다.

n = 1
m = 2
arr = [[1, 2, 3, 4], [10, 9, 8, 7]]

마치며

저는 30대에 프로그래밍을 처음 접했지만, 파이썬을 아주 처음 접했을 때 리스트, 연산자, 딕셔너리, 함수 이런 것들을 처음 배우고 나서 백준을 문제를 본 적이 있었습니다.

그 때는 input 부터 어려워서 쉬운 문제도 풀 엄두를 내지 못 햇는데요.

지금은 따로 알고리즘을 공부하지 않았어도 백준 input 정도는 쉽게 구현이 되네요.
(물론 저거 말고도 아직 접하진 않은 문제에서 다른 input의 형태가 있을 수 있지만….)

뭐든지 꾸준히 하면 조금씩 늘긴 하나 봅니다 ㅎ

그리고 한 가지 반성하게 되는 것도 있는데
“뭐 회사일이 바빠서”라는 핑계를 댈 수 있지만,
그래도 앞으로 알고리즘 문제는 정기적으로 유형별로 다뤄볼 필요가 있을 것 같습니다…ㅎㅎ

참고하면 좋은 글

Leave a Comment

목차