[Python] 코딩테스트 준비하면서 기록하기 🌈 (1)

황규빈·2022년 7월 24일
0

💎 개요

코딩테스트를 계속해서 준비하고 있는데 파이썬을 처음 이용해보면서 준비해보다보니 파이썬을 익혀가는 과정에도 시간을 들이게 되고 있는 것 같다. 따라서! 파이썬을 이용하면서 잘 모르겠었던 또는 기억하면 좋을 것 같은 것들을 앞으로 차차 다시 정리해보고자 한다.

그래서 이렇게 velog에 게시글을 작성하고 이를 적용하였던 문제도 따로 적어보면서 기록하고자 한다!!

💎 정리하기

🍫 sys.stdin.readline() 사용하기

문제를 풀다가 나는 파이썬을 처음 사용해보다 보니 input()을 이용한 파이썬 입력을 받은 후 사용해왔는데 input()을 쓰다가 잘 안되는 문제가 있었다...

이는 이 sys라는 모듈을 사용해서 해결하면 되고 시간초과 때문에 고려해야하는 점이었다!! 먼저 sys가 뭐냐하면 파이썬 인터프리터가 제공하는 변수나 함수를 제어할 수 있는 방법을 제공하는 것으로 다양한 함수를 사용해볼 수 있는데 이 때 import sys를 통해 sys.stdin.readline()을 이용할 수 있다.

그러면 이 sys.stdin.readline()이라는 함수는!! 그냥 input()과 동일하다. 그렇기 때문에 유의해야할 점은 마찬가지로 input()을 사용했던 때와 같이 list나 int형 같이 형변환이 필요한 문자열로 받는다는 점이다. 따라서 사용할 때에

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

# 분리해서 map으로 여러개 변수로 저장하기
n, m = map(int, sys.stdin.readline().split())

# list로 입력 받기
arr = list(map(int, sys.stdin.readline().split()))

요런 식으로 사용한다.

그러면 이러한 sys.stdin.readline()사용해야할 때에는 앞서 설명하였듯이 시간초과를 생각해야되기 때문인데, 이는 c++에서 알고리즘 문제를 풀었을 때와 비슷하다. 반복문을 사용해서 여러개의 줄을 입력받게 될 때 시간초과를 불러일으킬 수 있기 때문에 이러한 모듈을 이용하여 input()대신에 사용해준다!!

따라서 이를 꼭 기억하고자 한다!! 앞으로 굉장히 큰 양의 입력이 주어질 때 이를 꼭 생각해서 문제를 풀어보도록 하자. 이러한 문제를 적용했던 문제는 백준 11660번 구간 합 구하기 5 에서 확인할 수 있었다. 문제에서 확인할 수 있지만 반복문을 통해 구해야하는 경우의 수가 약 100,000개가 될 수 있어서 입력이 리스트로 이루어지는데 굉장히 많은 양의 데이터를 다뤄야해서 input()을 이용한다면 시간초과가 발생할 수 있다. 따라서 다음과 같이 문제를 풀고 해결하도록 하자!!

from sys import stdin

N, M = map(int, stdin.readline().split())
arr = [[0] * (N + 1)]

for _ in range(N):
    a = [0] + list(map(int, stdin.readline().split()))
    arr.append(a)

for i in range(1, N + 1):
    for j in range(1, N):
        arr[i][j + 1] += arr[i][j]

for i in range(1, N + 1):
    for j in range(1, N):
        arr[j + 1][i] += arr[j][i]

for _ in range(M):
    x1, y1, x2, y2 = map(int, stdin.readline().split())
    print(arr[x2][y2] - arr[x1 - 1][y2] - arr[x2][y1 - 1] + arr[x1 - 1][y1 - 1])

🍫 리스트 괄호랑 쉼표 없이 요소 출력하기

백준 1991번 트리 순회 문제를 풀면서 전위, 중위, 후위 순회의 결과를 출력하기 위해서 값을 리스트로 저장하려고 하였을 때 출력의 방식이 요소들을 이어서 출력하면서 찾아보았던 점이다!! 만약 리스트 내의 요소들을 출력할 때 이어서 출력하는 것과 더불어서 다른 문자나 공백을 추가할 때 기억하기 좋은 점일 것 같아서 정리해보고자 하였다!!

이는 join함수를 이용하면 된다. join은 매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 반환하는 함수이다. 따라서 리스트에 있는 요소들을 괄호 없이 출력하는 것에 유용하다. 기존에는 print(리스트) 이런식으로 출력하면 대괄호가 포함되어 출력이 되었는데, 이를 요소만 따로 이용해서 출력할 수 있다는 점이다.

따라서 join(리스트)와 같은 방식으로 출력을 하게 되면 리스트의 요소들을 이용할 수 있다. 이때 앞에는 포함하고자 하는 문자 또는 공백들을 넣을 수 있어서 ''.join(리스트)와 같이 이용할 수 있다. join함수를 이용할 때 기억해야하는 점은 문자열로 바꾼다는 점이다. 따라서 이를 정수형이나 연산에 쓸 수 없고 꼭 문자열로 정리된다는 것으로 기억해서 출력에만 사용하거나 또는 요소의 내용을 문자열로 바꾸어 사용하고 싶을 때 사용하면 좋을 것 같다!

다음의 내용은 백준의 1991번 트리 순회 문제를 앞서 설명한 join함수를 이용하여 출력한 과정이다!! 이 문제는 트리의 순회인 전위, 중위, 후위 순회의 결과를 확인할 수 있는 좋은 문제이면서도 트리의 기초를 알 수 있는 문제이다.
문제의 코드 내용은 아래와 같이 해결할 수 있다!!

N = int(input())

tree = {}
for _ in range (N):
    root, left, right = map(str, input().split())
    tree[root] = [left, right]


def preorder(root):
    if root != '.':
        result.append(root)
        preorder(tree[root][0])
        preorder(tree[root][1])

def inorder(root):
    if root != '.':
        inorder(tree[root][0])
        result.append(root)
        inorder(tree[root][1])

def postorder(root):
    if root != '.':
        postorder(tree[root][0])
        postorder(tree[root][1])
        result.append(root)

result = []
preorder('A')
print(''.join(result))
result = []
inorder('A')
print(''.join(result))
result = []
postorder('A')
print(''.join(result))

다시 정리하자면 .join(리스트)함수는 매개변수를 잇고 이를 문자열로 합칠 수 있는 함수이다!! 기억해두도록 하장.

💎 느낀 점

파이썬을 이용하면서 몰랐던 내용 그리고 유용하게 사용해야 하는 함수들을 정리해보았다. 앞으로도 많을 예정이니... 꼭 기록해두도록 하자. 파이썬을 잘 활용하기 위해서는 이런식으로 정리를 통해 코테를 준비해야지 좋을 것 같당.

곧 8월이 오는데 차근차근 잘 준비하고 하반기에서 코테를 잘 볼 수 있도록 준비해두도록 하자. 그리구 토스랑 코테도 병행하면서 프로젝트도 준비하도록 하자!!

화팅

profile
안녕하세욤

0개의 댓글