[1] input() V.S. sys.stdin.readline()
S, E = map(int, input().split())
import sys
S, E = map(int, sys.stdin.readline.strip().split())
(1) input()
- 입력을 한 줄씩 받아 문자열로 처리.
- 기본적으로 개행문자(\n) 제거함
- 간결하지만 여러줄 입력을 빠르게 받아야 할 때 속도가 느림
=> 알고리즘 문제에서 자칫하다 런타임 에러를 일으킬 수 있음 ㅠ
(2) sys.stdin.readline()
- 한 줄 입력을 받아 문자열로 처리.
- 개행문자(\n) 포함. -> .strip() 로 제거해야 함!
- 대량 입력 받을 때 빠름. for 나 while 문에서 반복 입력 받을 때 유리.
- 그렇지만 코드가 구구절절함 -> alias나 lambda 로 미리 선언해서 간결하게 쓰기!
[2] sys.stdin.readline()에 strip() 을 써야 하는 이유
1. 입력값 시작이나 끝에 포함된 개행 문자(\n)는 문자열 조작시 문제를 일으킬 수 있어서 지우는 게 좋음!
2. 예상치 못한 공백이나 개행문자가 포함된 경우에도 안정적으로 동작하도록 보장함!
=> 즉, 이상한 인풋을 정상적으로 만들 수 있으니 strip() 를 꼭 쓰지 않아도 되는 상황에서도 쓰도록 습관을 들이자~~
[3] sys.stdin.readline() 함수를 간결하게 호출하는 법
(1) 기존 함수에 별명(alias)를 붙여서 참조하기
import sys
input = sys.stdin.readline # Alias 사용
N = int(input().strip()) # 개행 문자 제거
S, E = map(int, input().strip().split())
파이썬에서 함수도 일종의 객체이기 때문에 이름을 붙여줄 수 있다.
단, 이 경우에는 strip() 을 매번 적어주어야 한다.
input = sys.stdin.readline.strip 은 왜 안되는 걸까???
그 이유는,
1. sys.stdin.readline 자체가 함수 객체이고
2. strip 은 sys에 속하지 않은 문자열 메서드이기 때문에
=> 하나의 객체가 될 수 없어 alias 로 퉁칠 수 없다!
그래서 input.strip() 으로 쓰면 안되고 input().strip() 으로 써야 한다.
별명으로 함수 객체를 참조하기 때문에,
input()으로 호출해 반환값을 받고 그 다음 strip() 을 해주어야 하기 때문이다!
그러면 strip 까지 써서 최대한 간단하게 하려면 어떻게 해야 하냐?
↓
↓
(2) lambda 로 새로운 함수로 정의
lambda 는 익명 함수를 정의하는 방법이다.
익명함수란, 이름이 없는 작은 함수를 선언할 때 사용한다.
lambda [parameters]: [expression]
def my_function():
return sys.stdin.readline().strip()
input = my_function
input = lambda: sys.stdin.readline().strip()
N = int(input())
S, E = map(int, input().split())
def 로 정의할 수 있지만 한 줄 함수는 lambda 가 훨씬 간결하다!
그리고 새로운 함수를 정의하기 때문에 .strip 같은 문자열 메서드도 함께 추가할 수 있어서
호출 시 간결하게 쓸 수 있다!!
굿~~