백준 리스트 다루기 map과 sys.stdin.readline

HR.lee·2022년 2월 1일
0
post-custom-banner

어제 심화과제를 하는데 백준의 좌표정렬 문제였다.

하나는 x좌표 기준으로 정렬하는 문제였고, 하나는 y좌표 기준으로 정렬하는 문제였다.

물론 이걸 퀵 정렬로 풀었어야 하지만 일단은 풀릴 것 같은 내용이라서 그냥 풀어보았다!

전체 코드

# 1번 문제
n = int(input())

point = []
for i in range(n):
    [x, y] = map(int, input().split())
    point.append([x, y])
    
point = sorted(point)

for i in range(n):
    print(point[i][0], point[i][1])
    
# 2번 문제  
n = int(input())

point = []
for i in range(n):
    [x, y] = map(int, input().split())
    point.append([y, x])
    
point = sorted(point)

for i in range(n):
    print(point[i][1], point[i][0])

x좌표 기준으로 2차원 리스트에 정렬한 다음, 반복문으로 0번째 1번째 하나씩 프린트해주기!
2번은 y좌표 기준이니까 append를 y, x 순서로 해서 sort한 다음에
반복문에서 순서를 1번째, 0번째로 프린트해주면 끝!

백준은 불편하다.
일단 code run 이 없다! 제출만 할 수 있다!
테스트케이스도 보여주지 않고, 추가도 할 수 없다.
데이터를 줄때도 input값으로 그냥 주기 때문에 정제하는게 귀찮아...

그치만 문제들은 무척 좋다고 생각한다.

아무튼 그거때문에 로컬에서 테스트하기 위해서는 섬세한 밑작업과 많은 인내심이 필요하다!

인내심 하기 싫으면 대충 통과될때까지 제출하면서 머릿속으로 디버깅해야 된다...
그래서 그걸 내는데 지금 내가 짠 코드를 그냥 제출하면 시간이 무척이나 오래걸리는 걸 발견했다.

백준 필수 모듈 sys.stdin.readline() 를 사용하지 않았기 때문이다!

대량의 데이터를 input 함수로 받아올 때에 발생하는 과부하를 줄여주는 모듈이다.

첫번째 문제의 경우, 메모리는 46128kb를 먹고 시간은 4692ms 걸렸다.
46초... 난 내가 틀린줄 알았다.

그치만 sys를 적용하면!

import sys
n = int(input())

point = []
for i in range(n):
    [x, y] = map(int, sys.stdin.readline().split())
    point.append([x, y])
    
point = sorted(point)

for i in range(n):
    print(point[i][0], point[i][1])

메모리는 똑같이 46128kb이지만, 시간이 464ms!!
분명 코드 글자수는 늘었는데 시간이 1/10이 되는 기적!

2번 문제에도 간단히 추가해주었다.

import sys
n = int(input())

point = []
for i in range(n):
    [x, y] = map(int, sys.stdin.readline().split())
    point.append([y, x])
    
point = sorted(point)

for i in range(n):
    print(point[i][1], point[i][0])

기적! 그래서 여기에 sys 경우의 수를 정리해둔다.

import sys (공통)

문자열 input 정리

하나의 문자열을 입력받을 때

a = sys.stdin.readline().rstrip()

(sys의 기본 리턴값은 문자열 형태인데 개행문자(/n) 이 한개씩 꼭 들어간다.
rstrip은 이 공백을 없애주는 함수이다!

strip = 양쪽
lstrip = 왼쪽
rstrip = 오른쪽!)

출력 : a

여러 개의 한줄인 문자열을 입력받아서 리스트로 저장할 때

n = int(sys.stdin.readline())

word = []
for i in range(n):
    word.append(sys.stdin.readline().strip())

word = list(word)

숫자(정수형) input 정리

하나의 정수를 입력받을 때

a = int(sys.stdin.readline())

출력 : 123

공백으로 구분된 여러개의 정수를 입력받을 때

a,b,c = map(int,sys.stdin.readline().split())

출력 : 123, 223, 3323

여러 개의 한줄인 정수를 입력받아서 리스트로 저장할 때

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

출력 : [13124, 234315, 31241]

여러 개의 n줄인 정수를 입력받아서 저장할 때

n = int(sys.stdin.readline())
# 이건 해줘도 되고 그냥 인풋으로 해도 별차이없음

nums = []
for i in range(n):
    nums.append(int(sys.stdin.readline()))

출력 :
13124
234315
31241

n줄의 연관된 n개의 데이터를 입력받아서 2차원리스트로 저장할 때

n = int(sys.stdin.readline())


point = []
for i in range(n):
    [x, y] = map(int, sys.stdin.readline().split())
    point.append([x, y])
# , 구분자 없이 append하면 합쳐서 저장된다!
출력 : [[x, y], [x, y], [x, y], [x, y]]
profile
It's an adventure time!
post-custom-banner

0개의 댓글